Git 的撤消操作 - 重置,签出和撤消
Git 提供了多种修复你开发过程中的错误的方法。方法的选择取决于你的情况:包含有错误的文件是否提交了(commited);如果你把它已经提交了,那么你是否把有错误的提交已与其它人共享这也很重要。
修复未提交文件中的错误(重置)
如果你现在的工作目录(work tree)里搞的一团乱麻,但是你现在还没有把它们提交;你可以通过下面的命令,让工作目录回到上次提交时的状态(last committed state):
$ git reset --hard HEAD
这条件命令会把你工作目录中所有未提交的内容清空(当然这不包括未置于版控制下的文件 untracked files)。 从另一种角度来说,这会让git diff
和git diff --cached
命令的显示法都变为空。
如果你只是要恢复一个文件,如hello.rb
,你就要使用git checkout
$ git checkout -- hello.rb
这条命令把hello.rb
从 HEAD 中签出并且把它恢复成未修改时的样子。
译者:上面二行和原文有出入,经验证是原文有误,所以我据正确的重写了。
修复已提交文件中的错误
如果你已经做了一个提交(commit),但是你马上后悔了,这里有两种截然不同的方法去处理这个问题:
-
创建一个新的提交(commit),在新的提交里撤消老的提交所作的修改。这种作法在你已经把代码发布的情况下十分正确。
- 你也可以去修改你的老提交(old commit)。但是如果你已经把代码发布了,那么千万别这么做;Git 不会处理项目的历史会改变的情况,如果一个分支的历史被改变了那以后就不能正常的合并。
创建新提交来修复错误
创建一个新的,撤消(revert)了前期修改的提交(commit)是很容易的;只要把出错的提交(commit)的名字(reference)做为参数传给命令:git revert
就可以了;下面这条命令就演示了如何撤消最近的一个提交:
$ git revert HEAD
这样就创建了一个撤消了上次提交(HEAD)的新提交,你就有机会来修改新提交(new commit)里的提交注释信息。
你也可撤消更早期的修改,下面这条命令就是撤消“上上次”(next-to-last)的提交:
$ git revert HEAD^
在这种情况下,Git 尝试去撤消老的提交,然后留下完整的老提交前的版本。如果你最近的修改和要撤消的修改有重叠(overlap),那么就会被要求手工解决冲突(conflicts),就像解决合并(merge)时出现的冲突一样。
译者注:git revert
其实不会直接创建一个提交(commit),把撤消后的文件内容放到索引(index)里,你需要再执行git commit
命令,它们才会成为真正的提交(commit)。
修改提交来修复错误
如果你刚刚做了某个提交(commit),但是你又想马上修改这个提交;git commit
现在支持一个叫--amend
的参数,它能让你修改刚才的这个提交(HEAD commit)。这项机制能让你在代码发布前,添加一些新的文件或是修改你的提交注释(commit message)。
如果你在老提交(older commit)里发现一个错误,但是现在还没有发布到代码服务器上。你可以使用git rebase
命令的交互模式,git rebase -i
会提示你在编辑中做相关的修改。这样其实就是让你在 rebase 的过程来修改提交。