首页 > git > faq > 3.Git撤销提交

3.Git撤销提交

1 git revert撤销已push的改变

已经执行了"git push", 把修改发送到了GitHub, 你需要撤销其中某一个commit.执行命令:

git revert <SHA>

"git revert"会产生一个新的commit,它和指定SHA对应的commit是逆操作.任何从原先的commit里删除的内容会在新的commit里被加回去,任何在原先的commit里加入的内容会在新的commit里被删除.

所以你现在可以"git push"新的逆操作commit,来抵消你错误提交的commit.修正最后一个commit消息.

2 git commit命令修改上一次commit

如果在最后一条commit消息里有个笔误,已经执行了git commit -m "Fxies bug",但在git push 之前你意识到消息应该是"add files".

执行命令:

git commit --amend

git commit --amend -m "add files"

git commit --amend会用一个新的commit更新并替换最近的commit,这个新的commit 会把任何修改内容和上一个commit的内容结合起来.如果当前没有提出任何修改,这个操作就只会把上次的 commit消息重写一遍.

3 git checkout撤销本地修改

还没有commit这些修改.想要恢复被修改文件里的所有内容.执行命令:

git checkout -- <bad filename>

git checkout会把工作目录里的文件修改到Git之前记录的某个状态. 你可以提供一个你想返回的分支名或特定SHA,或者在缺省情况下,Git会认为你希望checkout的是 HEAD,当前checkout分支的最后一次commit.用这种方法“撤销”的任何修改真的会完全消失.因为它们从来没有被提交过,所以之后 Git 也无法帮助我们恢复它们.

4 git reset重置本地修改

撤销前面的几次尚未push的提交. 执行命令:

git reset <last good SHA>

git reset --hard <last good SHA>

git reset会把你的代码库历史返回到指定的SHA状态.这样就像是这些提交从来没有发生过. 缺省情况下,git reset会保留工作目录.这样,提交是没有了,但是修改内容还在磁盘上.这是一种安全的选择,但通常我们会希望一步就撤销提交以及修改内容.这就是 --hard 选项的功能.在撤销本地修改之后再恢复

5 git reflog还原修改

你提交了几个commit,然后用git reset --hard 撤销了这些修改(见上一段),接着你又意识到:你希望还原这些修改!

执行命令:

git reflog

或者

git reset

或者

git checkout

git reflog 对于恢复项目历史是一个超棒的资源.你可以恢复几乎任何你commit过的东西.你可能已经熟悉了 git log 命令,它会显示 commit 的列表. git reflog 也是类似的,不过它显示的是一个HEAD发生改变的时间列表.

5.1 reflog注意事项

它涉及的只是 HEAD 的改变.在你切换分支、用 git commit 进行提交、以及用 git reset 撤销 commit 时,HEAD 会改变,但当你用git checkout -- <bad filename>撤销时(正如我们在前面讲到的情况),HEAD 并不会改变 — 如前所述,这些修改从来没有被提交过,因此 reflog 也无法帮助我们恢复它们. git reflog 不会永远保持.Git 会定期清理那些 “用不到的” 对象.不要指望几个月前的提交还一直躺在那里. 你的reflog就是你的,只是你的.你不能用git reflog来恢复另一个开发者没有push过的commit.

6 git准确地恢复项目的历史到某个时间点

如果希望准确地恢复项目的历史到某个时间点,采用:

git reset --hard <SHA>

如果希望重建工作目录里的一个或多个文件,让它们恢复到某个时间点的状态,采用:

git checkout <SHA> -- <filename>

如果你希望把这些 commit 里的某一个重新提交到你的代码库里,采用:

git cherry-pick <SHA>
转载请保留原文链接.