离线下载
PDF版 ePub版

liuhui · 更新于 2018-11-28 11:00:43

Git 的撤消操作 - 重置,签出和撤消

Git 提供了多种修复你开发过程中的错误的方法。方法的选择取决于你的情况:包含有错误的文件是否提交了(commited);如果你把它已经提交了,那么你是否把有错误的提交已与其它人共享这也很重要。

修复未提交文件中的错误(重置)

如果你现在的工作目录(work tree)里搞的一团乱麻,但是你现在还没有把它们提交;你可以通过下面的命令,让工作目录回到上次提交时的状态(last committed state):

$ git reset --hard HEAD

这条件命令会把你工作目录中所有未提交的内容清空(当然这不包括未置于版控制下的文件 untracked files)。 从另一种角度来说,这会让git diffgit 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 的过程来修改提交。

上一篇: 使用 Git Grep 进... 下一篇: 维护 Git