動圖學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

相關文章
相關標籤/搜索