错误的撤消操作

其实很多教程在讲解命令时,大都忽略了讲解如何中断操作,该如何恢复到操作前的状态。

而且大部人都是使用 GUI 客户端,客户端中更是很难找到这些撤消操作,因此很多人错误地认为撤消操作就是将所有文件的改动撤消,使工作目录变得干净,最起码是在 GUI 客户端界面内。

但实际问题是 Git 在做某些操作时,不光是修改了工作目录,还修改了其他东西,比如记录当前合并状态、变基状态等等。而这些操作都需要正确地调用 --abort 命令才能中断操作。

Git 中支持中断操作的命令

运行以下命令在帮助文件中找到所有带有 --abort 选项的命令:

  • Git for Windows
1
find /mingw64/share/doc/git-doc/ -type f | xargs grep '\-\-abort'
  • Git
1
find <git-dir>/share/doc/git-doc -type f | xargs grep '\-\-abort'

以下是找到的结果:

1
2
3
4
5
6
git am
git notes merge
git merge
git cherry-pick
git rebase
git revert

遗漏的命令

其实有一个命令,使用频率很高,就是 git pull。这个命令实际上等同于 git fetch + git merge。 所以在执行这个命令时,如果出现问题时,需要使用 git merge --abort 来中断操作。

正确的使用方式

在做以上操作时,如果要中断操作,一定要使用对应命令的 --abort 选项。

错误的操作方式

Git 在做合并、变基等操作时,会使用暂存区与工作目录来处理。

典型的错误操作

在合并时,如果使用 git reset --hard HEAD 重置后再使用 git commit,这次提交会是一个合并提交,同时会丢失合并分支的所有改动。 因为合并是以合并提交的形式引入其他分支的改动,这次合并提交中有另一个分支的所有改动!所以要谨慎操作。

建议

所以在做这些操作时,建议将所有工作目录中的内容清空,有以下几种处理方式:

  • 使用 git stash 储藏文件改动,注意:只能储藏已追踪文件,未追踪的文件需要先 git add 加入到暂存区。
  • 使用 git commit 提交,可以在提交前使用 git checkout -b [branch] 新建分支。
  • 使用 git checkout . 重置已追踪文件;使用 git clean -fd 清理未追踪文件。

总结

建议初学者在学习时,先尽量使用命令行熟悉所有操作,了解操作背后都做了什么,然后再去使用图形界面。 其实以上问题可以说是因为使用 GUI 客户端而对命令使用细节不了解导致的。

参考资料