到現在我們已經學習了Git的基礎知識,包括:
- 如何克服解決Git衝突的恐懼症?(序)
- 如何克服解決Git衝突的恐懼症?(Git入門介紹)
- 如何克服解決Git衝突的恐懼症?(Git基礎篇--上)
- 如何克服解決Git衝突的恐懼症?(Git基礎篇--下)
- 如何克服解決Git衝突的恐懼症?(Git分支策略)
- 如何克服解決Git衝突的恐懼症?(Git四大元件)
- 如何克服解決Git衝突的恐懼症?(Git高階篇)
概念涵蓋了Git 90%的功能,同樣也足夠滿足開發者的日常需求。
然而, 剩餘的10%在處理複雜的工作流時(或者當你陷入困惑時)可能就顯示尤為重要了。
接下來要討論的這個話題是“整理提交記錄” :開發人員有時會說“我想要把這個提交放到這裡,那個提交放到剛才那個提交的後面
”, 而接下來就講的就是它的實現方式,看起來挺複雜, 其實是個很簡單的概念。
git cherry-pick
第一個命令是git cherry-pick
, 命令形式為:
git cherry-pick <提交號>...
複製程式碼
如果你想將一些提交複製到當前所在的位置(HEAD)下面的話,cherry-pick是最直接的方式了。我個人非常喜歡cherry-pick,因為它特別簡單。
我們們還是通過例子來看一下!
這裡有一個倉庫, 我們想將 side 分支上的工作複製到 master 分支,你立刻想到了之前學過的rebase
了吧?但是我們們還是看看 cherry-pick有什麼本領吧。
git cherry-pick C2 C4
複製程式碼
這就是了!我們只需要提交記錄C2和C4,所以Git就將被它們抓過來放到當前分支下了,就是這麼簡單!
互動式rebase
當你你知道你所需要的提交記錄(並且還知道這些提交記錄的雜湊值)時, 用cherry-pick再好不過了,沒有比這更簡單的方式了。
但是如果你不清楚你想要的提交記錄的雜湊值呢?
幸好Git幫你想到了這一點, 我們可以利用互動式的rebase,如果你想從一系列的提交記錄中找到想要的記錄, 這就是最好的方法了
我們們具體來看一下:
互動式rebase指的是使用帶引數--interactive
的rebase命令, 簡寫為-i
如果你在命令後增加了這個選項, Git會開啟一個UI介面並列出將要被複制到目標分支的備選提交記錄,它還會顯示每個提交記錄的雜湊值和提交說明,提交說明有助於你理解這個提交進行了哪些更改。
在實際使用時,所謂的UI視窗一般會在文字編輯器:如Vim中開啟一個檔案。
當rebase UI介面開啟時, 你能做3件事:
- 調整提交記錄的順序
- 刪除你不想要的提交
- 合併提交
接下來看下具體命令:
可以看到:
- p, pick = use commit
- r, reword = use commit, but edit the commit message
- e, edit = use commit, but stop for amending
- s, squash = use commit, but meld into previous commit
- f, fixup = like "squash", but discard this commit's log message
- x, exec = run command (the rest of the line) using shell
- d, drop = remove commit
拆分提交記錄 edit
更改子提交pick為edit,表示需要修改此次提交;然後reset到需要拆分的上次提交,但是保留工區的內容,再依次commit工作區中的內容。
合併提交記錄 squash
更改子提交 pick 為squash,表示與當前提交的父提交合並。
批量修改歷史提交資訊 reword
更改子提交 pick 為reword,表示修改歷史提交資訊。
刪除歷史紀錄
修改pick為drop, 或者直接刪除所在的行。
相信大家對Git移交提交記錄已經基本掌握,不妨在自己的git環境中動手試一試吧~