如何撤销误操作的“git commit –amend”而应执行“git commit”的情况
技术背景
在使用 Git 进行版本控制时,git commit --amend
用于修改上一次提交,包括提交信息和提交内容。但有时可能会误操作执行了 git commit --amend
,而本意是执行 git commit
。此时就需要撤销 git commit --amend
的操作,恢复到正确的提交状态。
实现步骤
方法一:使用 git reset --soft HEAD@{1}
- 移动当前 HEAD 指针:
1
| git reset --soft HEAD@{1}
|
HEAD@{1}
表示 HEAD
在移动到当前位置之前所指向的提交。此命令将 HEAD
指针移动到之前的提交,同时保留索引,以便重新进行提交。
2. 使用之前 HEAD
提交的详细信息进行提交:
-C
选项会复用指定提交的日志消息和作者信息。
方法二:使用 git reflog
查找提交哈希
- 查看提交记录:
输出示例:
1 2
| d0c9f22 HEAD@{0}: commit (amend): [Feature] - ABC Commit Description c296452 HEAD@{1}: commit: [Feature] - ABC Commit Description
|
- 软重置到指定提交:
1
| git reset --soft c296452
|
这样暂存区将包含之前意外合并到 c296452
提交中的所有更改。
方法三:使用 git reset
和 git cherry-pick
- 查找正确的提交哈希:
可添加 --patch
选项查看提交的详细内容。
2. 重置 HEAD
到指定提交:
注意:将 SHA1
替换为实际的提交哈希,此命令会丢失未提交的更改,可先使用 git stash
保存更改。若使用 --soft
选项,则会保留最新更改,后续可进行提交。
3. 挑选其他需要的提交:
方法四:拆分提交
- 开始交互式变基:
commit
是要拆分的提交,任何包含该提交的提交范围都可以。
2. 标记要拆分的提交为“edit”。
3. 重置 HEAD
:
此操作会将 HEAD
回退一步,索引也会随之更新,但工作树保持不变。
4. 添加需要的更改到索引:
可使用 git add
或 git-gui
进行操作。
5. 提交当前索引:
- 重复步骤 4 和 5 直到工作树干净。
- 继续变基:
方法五:使用 git diff
和 git apply
- 获取提交前后的差异:
1 2
| git reflog git diff before_commit_id after_commit_id > d.diff
|
- 回退到之前的提交:
1
| git checkout before_commit_id
|
- 应用差异:
方法六:简单解决方案
- 软重置最后一次提交:
- 使用新的提交信息提交暂存的更改:
1
| git commit -m "new commit msg"
|
- 推送更改并将此提交变基到之前修改的提交之上。
方法七:使用 commit-tree
命令
1
| git reset --soft "$(git commit-tree HEAD^{tree} -p HEAD@{1} -m 'Commit message of new commit')"
|
此命令创建一个新的提交,其树与当前 HEAD
提交相同,但父提交为原始(修改前)的提交。然后使用 git reset
将分支移动到正确的提交。
核心代码
以下是使用 git reset --soft HEAD@{1}
撤销 git commit --amend
的核心代码:
1 2 3 4
| git reset --soft HEAD@{1}
git commit -C HEAD@{1}
|
最佳实践
- 在执行
git commit --amend
之前,务必确认操作的正确性。 - 定期使用
git reflog
查看提交记录,以便在出现问题时能够快速找到所需的提交哈希。 - 在进行重要操作之前,建议先创建一个临时分支,以防止误操作导致数据丢失。
常见问题
问题一:使用 HEAD@{1}
无效
可以使用 git reflog
手动查找所需的提交哈希,然后使用 git reset --soft
进行重置。
问题二:误操作后已将提交推送到远程仓库
可按以下步骤操作:
1 2 3 4 5 6
| git reset --soft <SHA BEFORE THE AMMEND> git stash git pull origin <your-branch> --ff-only git stash pop git commit -m "new commit" git push origin <your-branch>
|
将 <SHA BEFORE THE AMMEND>
替换为修改前的提交哈希,<your-branch>
替换为实际的分支名称。
问题三:执行 git reset --hard
后丢失了未提交的更改
如果之前使用了 git stash
保存更改,可以使用 git stash pop
恢复更改。若未保存,可能无法恢复丢失的更改。