共计 1438 个字符,预计需要花费 4 分钟才能阅读完成。
在版本迭代开发过程中,置信很多人都会有过谬误提交的时候(至多良许有过几次这样的体验)。这种状况下,菜鸟程序员可能就会虎驱一震,缓和得手足无措。而资深程序员就会微微一笑,摸一摸锃亮的脑门,而后默默的进行版本回退。
对于版本的回退,咱们常常会用到两个命令:
- git reset
- git revert
那这两个命令有何区别呢?先不急,咱们后文具体介绍。
git reset
如果咱们的零碎当初有如下几个提交:
其中:A 和 B 是失常提交,而 C 和 D 是谬误提交。当初,咱们想把 C 和 D 回退掉。而此时,HEAD 指针指向 D 提交(5lk4er)。咱们只需将 HEAD 指针挪动到 B 提交(a0fvf8),就能够达到目标。
只有有 git 根底的敌人,肯定会想到 git reset
命令。残缺命令如下:
git reset --hard a0fvf8
命令运行之后,HEAD 指针就会挪动到 B 提交下,如下图示:
而这个时候,近程仓库的 HEAD 指针仍然不变,仍在 D 提交上。所以,如果间接应用 git push
命令的话,将无奈将更改推到近程仓库。此时,只能应用 -f
选项将提交强制推到近程仓库:
git push -f
采纳这种形式回退代码的弊病不言而喻,那就是会使 HEAD 指针往回挪动,从而会失去之后的提交信息。未来如果忽然发现,C 和 D 是如许绝妙的想法,可它们曾经早就隐没在历史的长河里了。
而且,有些公司(比方良许的公司)明令禁止应用 git reset 命令去回退代码,起因与上述一样。所以,咱们须要找到一个命令,既能够回退代码,又能够保留谬误的提交。这时,git revert
命令就派上用场了。
git revert
git revert 的作用通过反做创立一个新的版本,这个版本的内容与咱们要回退到的指标版本一样,然而 HEAD 指针是指向这个新生成的版本,而不是指标版本。
应用 git revert 命令来实现上述例子的话,咱们能够这样做:先 revert D,再 revert C(有多个提交须要回退的话须要由新到旧进行 revert):
git revert 5lk4er
git revert 76sdeb
这里会生成两个新有提交:D’ 和 C’,如下图示:
这里只有两个提交须要 revert,咱们能够一个个回退。但如果有几十个呢?一个个回退必定效率太低而且容易出错。咱们能够应用以下办法进行批量回退:
git revert OLDER_COMMIT^..NEWER_COMMIT
这时,谬误的提交 C 和 D 仍然保留,未来进行甩锅的时候也有依可循。而且,这样操作的话 HEAD 指针是往后挪动的,能够间接应用 git push
命令推送到近程仓库里。而这种做法,正是企业所激励的。
咱们再举个更难一点的例子。
如果当初有三个提交,但很不巧的是,那个谬误的提交刚好位于两头。如下图示:
这时,间接应用 git reset 命令将 HEAD 指针重置到 A 提交显然是不行的,因为 C 提交是正确的,须要保留的。先把 C 提交 及 B 批次全副回退,再应用 cherry-pick
命令将 C 提交从新再生成一个新的提交 C”,这样就实现了将 B 提交回退的需要。残缺的过程如下:
最初,最近很多小伙伴找我要 Linux 学习路线图 ,于是我依据本人的教训,利用业余时间熬夜肝了一个月,整顿了一份电子书。无论你是面试还是自我晋升,置信都会对你有帮忙!
收费送给大家,只求大家金指给我点个赞!
电子书 | Linux 开发学习路线图
也心愿有小伙伴能退出我,把这份电子书做得更完满!
有播种?心愿老铁们来个三连击,给更多的人看到这篇文章
举荐浏览:
- 干货 | 程序员进阶架构师必备资源免费送
- 神器 | 反对搜寻的资源网站