git 常用技巧

git 的版本管理思路,十分簡單:使用一個類似鏈表的結構,將每次修改記錄串聯起來。每次提交都會產生一個 SHA1 的唯一標示符,我們可以利用 git 提供的命令行工具對“鏈表”中的每次修改進行編輯、刪除、插入、移動等等多種操作。下面就介紹幾種十分有用也比較常用的操作方法,爲了方便理解,表述上可能不夠準確。

下面是一個提交了 4 次的分支效果,每個節點的意思是 節點名(commit 信息 - SHA1)

A(add A - 510fdc) -> B(add B - 0406b6) -> C(add C - 39a9c2) -> D(add D - 3131e0)<當前>

將上次提交的信息(add D),修改爲 push D,可以通過 commit 的 amend 指令進行修改,如下:

git commit --amend
# 執行命令後,會進入到一個交互窗口,可以在交互窗口內修改上次的提交信息

rebase 的常用操作分爲這麼幾步:

  1. 選擇操作的起點位置,git rebase -i SHA1
  2. 指定每個節點的操作方式,保留/刪除/修改/...,進入操作
  3. 進入下一步操作/終止操作,git rebase --continuegit rebase --abort

比如我們要將節點 B 的 commit 信息(add B),修改爲 push B,那麼按照上述的操作指南,可以執行(第一步):

# 第一步,進入 B 之前的節點,A
git rebase -i 510fdc # 510fdc 是 A 節點的 SHA1

此時會進入一個交互窗口,內容大致爲:

pick B 0406b6
pick C 39a9c2
pick D 3131e0

你需要看懂這個結構,不過也不用緊張,它很簡單。由於我們將操作指針指向了 A,所以它會展示 A 以後的所有提交記錄,根據鏈表順序排列,依次展示節點 B、C、D,前面的一個英文單詞是操作指令,總共有這麼幾種指令:

  • pick,保留節點,不做任何變更
  • edit,保留節點,修改內容
  • drop,刪除節點,刪除本次提交
  • reword,保留節點,修改提交信息
  • squash,保留節點修改,並且與上一個節點合併,也就是兩次提交併做一次
  • fixup,保留節點修改,忽略本次提交信息
  • exec,run command (the rest of the line) using shell

用的比較多的是前三個,可以只關注前三個。我們需要修改下交互窗口的內容,改爲(第二步):

+ edit B 0406b6
- pick B 0406b6
pick C 39a9c2
pick D 3131e0

上面是 diff,實際內容是:

edit B 0406b6
pick C 39a9c2
pick D 3131e0

此時會進入一個臨時 git 分支,大致是這樣:

branch(0406b6):

由於你告訴了 git 要對 B 節點就行修改,所以它就停在了 B 處理,等着你修改,此時,你可以通過 amend 命令修改提交信息:

branch(0406b6): git commit --amend
# 進入交互窗口,將 commit 信息修改爲 push B

操作完成後,執行(第三步):

git rebase --continue

由於你告訴 git 只需要操作一個節點,所以它會回到最初的位置<當前>,否則的話,它會繼續進入下一個臨時 git 分支。當然,如果你進入第三步以後,突然又不想修改了,可以執行:

git rebase --skip

跳過對本節點的修改。

以上就是 rebase 的基本使用方法,那麼留下幾個思考題,讀者可以自行操作:

  • 通過 rebase 刪除 C 節點(drop)
  • 通過 rebase 合併 A 和 B 節點的修改(squash)
  • 交換 B 和 C 的提交順序

通過 git cherry-pick SHA1 這個指令可以可以完成目標,

master: A(add A - 510fdc) -> B(add B - 0406b6) -> C(add C - 39a9c2)<當前>
                                     \
dev:                             D(add D - 4569c2) -> E(add E - 087342)

如果我們想把 dev 分支 D 節點的修改合併到 master 分支,可以執行:

# 首先確保自己在 master 分支上,git branch master
git cherry-pick 4569c2 # 4569c2 爲 D 節點的 SHA1

假設我們在本地提交了一堆 commit,正準備 push 到倉庫之前,發現有一個 bug,但是記不起來是哪一次 commit 造成的了,怎麼辦?我們需要通過 reset/rebase/stash 等操作回滾到上一個狀態進行測試,但是這樣會很麻煩,而且效率不一定很高,git 爲我們提供了更加便捷的工具 git bisect,通過二分法找 bug。它提供的命令也很直白:

git bisect start                 # 進入二分查找
git bisect good [good-commit-id] # 設置沒問題的版本 SHA1,排查起點
git bisect bad [bad-commit-id]   # 設置有問題的版本 SHA1,排查終點
# 此時 git 就會自動進入到中間版本狀態

進入中間版本狀態,測試後,如果有問題,就標記爲 bad,如果沒有問題,就標記爲 good,如下:

git bisect bad  # 有問題
git bisect good # 沒問題

當你找到問題以後,可以執行 reset 回到初始狀態:

git bisect reset

 

然後通過上面介紹的 rebase edit 操作對錯誤分支進行修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章