如何克服解決Git衝突的恐懼症?(Git移交提交記錄)

史培培發表於2019-02-26

如何克服解決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
複製程式碼

如何克服解決Git衝突的恐懼症?(Git移交提交記錄)

這就是了!我們只需要提交記錄C2和C4,所以Git就將被它們抓過來放到當前分支下了,就是這麼簡單!

互動式rebase

當你你知道你所需要的提交記錄(並且還知道這些提交記錄的雜湊值)時, 用cherry-pick再好不過了,沒有比這更簡單的方式了。

但是如果你不清楚你想要的提交記錄的雜湊值呢?

幸好Git幫你想到了這一點, 我們可以利用互動式的rebase,如果你想從一系列的提交記錄中找到想要的記錄, 這就是最好的方法了

我們們具體來看一下:

互動式rebase指的是使用帶引數--interactive的rebase命令, 簡寫為-i

如果你在命令後增加了這個選項, Git會開啟一個UI介面並列出將要被複制到目標分支的備選提交記錄,它還會顯示每個提交記錄的雜湊值和提交說明,提交說明有助於你理解這個提交進行了哪些更改。

在實際使用時,所謂的UI視窗一般會在文字編輯器:如Vim中開啟一個檔案。

當rebase UI介面開啟時, 你能做3件事:

  • 調整提交記錄的順序
  • 刪除你不想要的提交
  • 合併提交

接下來看下具體命令:

如何克服解決Git衝突的恐懼症?(Git移交提交記錄)

可以看到:

  • 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環境中動手試一試吧~

如何克服解決Git衝突的恐懼症?(Git移交提交記錄)

微信公眾號:碼上論劍
請關注我的個人技術微信公眾號,訂閱更多內容

相關文章