Pro Git读书记

Git已经成了开发中不可缺少的技能,Git玩的好,也是生产力。对于Git,我之前有一些人知盲区,于是碎片时间读了下《Pro Git, Second Edition》,不愧是GitHub官方推荐的学习资料,确是好书。

这里mark下几个知识点,强化记忆

Git Commit修改

  • 如果只是本地已经commit但未push,message可以直接修改,原理实际上就是git commit --amend -m
  • 如果是已经push到上游的最后一次提交,可以reset指针到上一次的提交,然后重新commit,但是这时push需要--force

注意

  1. Commit Message修改后,Hash值会变。也就是只要重新提交,Hash值就会变
  2. 如果你想修改不是上一次的提交,本地历史可以,但是push后的不可以修改

整体来说,历史是无法改变的,但是如上的情况下是可以修改的。

rebase vs merge

我们的Git Workflow往往是多分支的,对于分支之间的合并Change,有两种手段,Merge和Rebase。

Merge效果如下,注意

Rebase-变基,效果如

注意

  • Merge会产生一个新的Commit
  • Rebase没有多出新的commit
  • 如上Rebase操作具体是到temp分支执行rebase master处理冲突,这样祖先就变成了master,进而在master分支执行merge即可
  • Rebase是改基,就是改了指针指向的祖先

Server端 Git Hooks

Git hook能够在发生某特定行为的时机,触发执行自定义的脚本。

在实际的项目开发中Client端Git Hooks一直发挥着作用,比如lint代码风格 ,比如本地强制跑UT等。但是需要知道hooks本身也有server端的支持。这样可以互补了client端的不足,比如可以做提交信息合格率检测,拒绝非法Push等。

Server端Git Hooks配置原理与本地类似,要知道Git是分布式的。