Git 学习笔记(三)

时间:2024-01-15 17:07:26

  我记得最初学习的时候我提到了使用版本控制软件的最大好处是让你可以永远后悔,那么如何吃后悔药呢?在项目过程中我们很有可能因为各种因素对我们的操作进行回滚,对于传统的版本控制系统来说,并不复杂,拿 SVN 举例,revert 是最常用的操作,当然这是你还没提交到服务器端操作。如果你提交到了*仓库,那就只能做一次逆向 merge 操作,来把所有的修改都 merge 回去。但是到了 git 这里,似乎一切都变得不那么简单了。

  前面的文章中已经提到 Git 的每一台电脑都会存在一个完整的库,这就导致了我们的回滚成本大大的增加了,如果从修改来看,我们会存在三个区域工作副本、索引和提交之后的历史对象区域,我在这里把回滚分为三类:

工作区回滚

  这是最简单的一种操作,这个和 revert 很像,在操作上叫 git checkout。

索引回滚

  索引回滚也不复杂,先使用 git reset 将其重新回到工作副本中,然后再使用 git checkout 回滚即可。

提交回滚

  提交后的回滚则相对复杂,根据不同的情况,会有不同的解决方案,需要我们使用不同的命令。

  • 修改最后一次提交:如果说你提交了之后需要撤回这次修改,想要回滚后重新提交,你只需要使用 git commit --amend,就可以回滚重新提交了。
  • 回滚提交(不抹除记录):可能有时候你可能提交了一个错误的版本上去,但这个错误你发现时已经很晚了,这个时候你需要回滚到某个版本上来修正这个问题,你可以使用 git revert HEAD xxxx 来回滚本次提交,不过需要注意的是,你回滚后,很有可能发生冲突,需要你自己去解决它。
  • 回滚提交(抹除记录):如果说你一不小心犯了个二,把错误的版本推送到了服务器上,那么推荐你使用 git reset 命令,他的作用就是将当前的 Head reset 到你指定的分支,我们可以称之为变基,但需要我们注意使用的参数,有 soft、mixed、hard 三种,git reset --soft 不会修改你的 index 和 working tree 中的任何修改;git reset --mixed 是为默认情况,会造成 index 中的修改丢失; git reset --hard 这绝对是一个危险的命令,请慎重考虑后再用,他会把你的工作区和历史记录中的所有修改全部丢弃掉。

   相比较于命令,我还是推荐大家使用 source tree 这款工具,不是打广告,谁用谁知道。

  另附 http://www.juvenxu.com/2010/11/28/a-successful-git-branching-model/