儘管 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)
本文隨意轉載哈,註明原文連接便可,公號文章轉載聯繫我開白名單就好~