动图学CS: 有用的 Git 命令(上)

尽管 Git 是一个很是强大的工具,可是我相信大部分同窗有时候学起 Git 来,感受很难搞~ 笔者老是习惯于在脑海中重现学习的知识,Git 也同样:当咱们执行了切换分支命令,分支之间是如何交互的?又是如何影响历史提交的?当我在 master 分支上执行了强制 resetforce push 到了远端 ,又把 .git 文件夹删掉,个人同事为何会哭??git

因而就有了将这些命令作成动画的想法!因为篇幅有限,本文主要覆盖一些经常使用命令的默认行为~segmentfault

Merge Rebase Reset Revert Cherry-Pick Fetch Pull Reflog

合并(Merging)

使用多个分支能够方便咱们隔离彼此,也能够防止意外提交到生产环境,对分支模型感兴趣的小伙伴也能够看笔者以前的文章:工具

使用 git-flow 自动化你的 git 工做流

当咱们的某个功能开发完成时,就须要将这些更改应用到生产环境上。其中一个应用的方式就是 git merge !而这个命令有两种类型:一种叫 fast-forward 方式,一种叫 no-fast-forward 方式。学习

如今不太懂不要紧,咱们先来对比下这两个选项。动画

如下例子中将 master 称做 主分支当前分支

Fast-forward (--ff)

一个 fast-forward merge 能够被用于:当 主分支 相比 要被合并的分支 没有额外的提交时。Git 是。。懒惰的,它会首先尝试使用这个最简单的 fast-forward 选项。这种方式不会建立新的 commit,能够说它只是把咱们的提交和 HEAD 指针挪了一个位置。spa

1-merge-ff.gif

完美!如今咱们全部的更改都从 dev 分支合并到 master 分支了~指针

No-fast-forward (--no-ff)

主分支没有额外的提交固然是最好的状况,可是在多人协做的状况下,这种状况固然就不多见了,毕竟你们都在加班嘛~ 那么若是主分支具备额外的提交时,在 merge 时,git 就会使用 no-fast-forward 选项。code

在使用 no-fast-forward 选项时,Git 就在当前分支建立了一个新的 合并提交。而这个提交的上一级同时指向了当分支和要合并的分支!具体见动图:blog

1-merge-no-ff.gif

没啥大不了的,完美合并!如今 master 分支就包含 dev 分支中的全部提交了。开发

合并冲突(Merge Conflicts)

尽管 Git 对于合并的默认行为很是棒,可是总有须要咱们本身解决的时候。好比说,当两个分支上都有新的提交,又同时修改了同一个文件同一行的内容,或者一个分支上删除了一个文件,而另外一个分支却修改了那个文件等等。

这些状况下,Git 就会请咱们来帮忙啦。假设咱们在两个分支上同时修改了 README.md 文件。

2-conflicts.png

若是咱们想要将 dev 合并到 master,这就会产生一个冲突(conflict):由于 Git 也不清楚你究竟是想要 Hello! 仍是 Hey!

因此当咱们合并分支时,Git 会告诉咱们冲突发生的具体位置。咱们须要手动删除不要的地方,保存更改,而后再提交。

2-conflicts-ani.gif

赞!尽管形成冲突很是烦人,但也符合逻辑,机器毕竟是机器,它确定不能替咱们决定须要保留哪块内容吧~

变基(Rebasing)

刚刚咱们见识了 git merge 的合并过程。另外一种将变动从一个分支应用到另外一个分支的方式是:git rebase

关于这两个命令的区别也能够看笔者以前的文章:

带你理解 Git 中的 Merge 和 Rebase

简单来讲就是:Merge 保留历史记录,而 Rebase 改写历史记录

git rebase 将提交从一个分支(dev)复制到另外一个分支(master)的顶部。

3-rebase.gif

完美,如今咱们已经将 dev 的起点设置为新的 master 分支了。

相比 Merge 来讲一个很大的不一样点是,Git 不会去查找哪一个文件须要保留,哪一个不须要。咱们的 dev 分支可使用 rebase 来一直追踪最新的 master 分支。这样就不会产生冲突,同时也会有一个线性的 Git 历史记录。

图中的例子是将 master 做为 devbase (基础分支), 在大型项目中,一般咱们不会这么作。git rebase 会修改项目的历史记录,同时复制的 commit 也会生成新的 hash 值。

当你在 feature 分支上工做,而 master 分支又更新了,这时就可使用 rebase,无缝地将 master 上的分支更新到你的 feature 分支了!

交互式变基(Interactive Rebase)

在进行变基以前,咱们也能够修改以前的提交,这就用到了 交互式变基。交互式变基也适用于你想要修改当前工做分支的某些提交。

一共有 6 种操做能够应用到以前的提交上:

  • reword:修改提交的信息 (commit message)
  • edit:修改提交内容
  • squash: 将某个提交与前一个提交合并
  • fixup: 同 squash,可是丢弃提交信息
  • exec:在想要 rebase 的提交上依次执行某个命令
  • drop: 删除某个提交

好啦!这样,咱们就能够彻底掌控咱们的提交。若是你须要删除某个提交,只须要 drop 就好~

3-rebase-2.gif

或者说若是咱们为了干净的历史记录,须要合并多个提交,也没问题:

3-rebase-3.gif

交互式变基给了咱们很大的权力来控制提交,即便在你当前工做的分支也没问题。

未完待续

好啦,因为原文篇幅太长,本篇咱们先讲了前两个命令:MergeRebase,这两个同时也是 Git 分支操做中最重要的两个命令,下一篇咱们继续讲剩下的六个命令~

关注我了解更多哦~

参考文章


本文首发于公众号:码力全开(codingonfire)

本文随意转载哈,注明原文连接便可,公号文章转载联系我开白名单就好~

codingonfire.jpg

相关文章
相关标签/搜索