尽管 Git 是一个很是强大的工具,可是我相信大部分同窗有时候学起 Git 来,感受很难搞~ 笔者老是习惯于在脑海中重现学习的知识,Git 也同样:当咱们执行了切换分支命令,分支之间是如何交互的?又是如何影响历史提交的?当我在 master
分支上执行了强制 reset
又 force push
到了远端 ,又把 .git
文件夹删掉,个人同事为何会哭??git
因而就有了将这些命令作成动画的想法!因为篇幅有限,本文主要覆盖一些经常使用命令的默认行为~segmentfault
Merge | Rebase | Reset | Revert | Cherry-Pick | Fetch | Pull | Reflog |
---|
使用多个分支能够方便咱们隔离彼此,也能够防止意外提交到生产环境,对分支模型感兴趣的小伙伴也能够看笔者以前的文章:工具
使用 git-flow 自动化你的 git 工做流
当咱们的某个功能开发完成时,就须要将这些更改应用到生产环境上。其中一个应用的方式就是 git merge
!而这个命令有两种类型:一种叫 fast-forward
方式,一种叫 no-fast-forward
方式。学习
如今不太懂不要紧,咱们先来对比下这两个选项。动画
如下例子中将
master
称做
主分支 或
当前分支
--ff
)一个 fast-forward merge 能够被用于:当 主分支 相比 要被合并的分支 没有额外的提交时。Git 是。。懒惰的,它会首先尝试使用这个最简单的 fast-forward 选项。这种方式不会建立新的 commit,能够说它只是把咱们的提交和 HEAD 指针挪了一个位置。spa
完美!如今咱们全部的更改都从 dev
分支合并到 master
分支了~指针
--no-ff
)主分支没有额外的提交固然是最好的状况,可是在多人协做的状况下,这种状况固然就不多见了,毕竟你们都在加班嘛~ 那么若是主分支具备额外的提交时,在 merge
时,git 就会使用 no-fast-forward
选项。code
在使用 no-fast-forward
选项时,Git 就在当前分支建立了一个新的 合并提交。而这个提交的上一级同时指向了当分支和要合并的分支!具体见动图:blog
没啥大不了的,完美合并!如今 master
分支就包含 dev
分支中的全部提交了。开发
尽管 Git 对于合并的默认行为很是棒,可是总有须要咱们本身解决的时候。好比说,当两个分支上都有新的提交,又同时修改了同一个文件同一行的内容,或者一个分支上删除了一个文件,而另外一个分支却修改了那个文件等等。
这些状况下,Git 就会请咱们来帮忙啦。假设咱们在两个分支上同时修改了 README.md
文件。
若是咱们想要将 dev
合并到 master
,这就会产生一个冲突(conflict):由于 Git 也不清楚你究竟是想要 Hello!
仍是 Hey!
?
因此当咱们合并分支时,Git 会告诉咱们冲突发生的具体位置。咱们须要手动删除不要的地方,保存更改,而后再提交。
赞!尽管形成冲突很是烦人,但也符合逻辑,机器毕竟是机器,它确定不能替咱们决定须要保留哪块内容吧~
刚刚咱们见识了 git merge
的合并过程。另外一种将变动从一个分支应用到另外一个分支的方式是:git rebase
。
关于这两个命令的区别也能够看笔者以前的文章:
带你理解 Git 中的 Merge 和 Rebase简单来讲就是:Merge 保留历史记录,而 Rebase 改写历史记录
git rebase
将提交从一个分支(dev)复制到另外一个分支(master)的顶部。
完美,如今咱们已经将 dev
的起点设置为新的 master
分支了。
相比 Merge 来讲一个很大的不一样点是,Git 不会去查找哪一个文件须要保留,哪一个不须要。咱们的 dev
分支可使用 rebase 来一直追踪最新的 master
分支。这样就不会产生冲突,同时也会有一个线性的 Git 历史记录。
图中的例子是将 master
做为 dev
的 base (基础分支)
, 在大型项目中,一般咱们不会这么作。git rebase
会修改项目的历史记录,同时复制的 commit 也会生成新的 hash 值。
当你在 feature
分支上工做,而 master
分支又更新了,这时就可使用 rebase
,无缝地将 master
上的分支更新到你的 feature
分支了!
在进行变基以前,咱们也能够修改以前的提交,这就用到了 交互式变基。交互式变基也适用于你想要修改当前工做分支的某些提交。
一共有 6 种操做能够应用到以前的提交上:
reword
:修改提交的信息 (commit message)edit
:修改提交内容squash
: 将某个提交与前一个提交合并fixup
: 同 squash,可是丢弃提交信息exec
:在想要 rebase 的提交上依次执行某个命令drop
: 删除某个提交好啦!这样,咱们就能够彻底掌控咱们的提交。若是你须要删除某个提交,只须要 drop
就好~
或者说若是咱们为了干净的历史记录,须要合并多个提交,也没问题:
交互式变基给了咱们很大的权力来控制提交,即便在你当前工做的分支也没问题。
好啦,因为原文篇幅太长,本篇咱们先讲了前两个命令:Merge 和 Rebase,这两个同时也是 Git 分支操做中最重要的两个命令,下一篇咱们继续讲剩下的六个命令~
关注我了解更多哦~
本文首发于公众号:码力全开(codingonfire)
本文随意转载哈,注明原文连接便可,公号文章转载联系我开白名单就好~