Git-重寫歷史知多少

Git-重寫歷史知多少(更改 commit 信息)

常常有如下這些需求:git

  1. commit 數量比較多,須要合併一些 commit 以保證提交記錄清晰
  2. commit 信息寫錯了

這裏還分兩種情形,一種是要重寫本地倉庫的 commit。第二種是已經 push commit 到遠程倉庫。web

常見技巧:選擇 push 到遠程倉庫要慎重,須要是你已經有充足的信心及把握提交代碼(並且代碼也是可信任的)。由於一旦提交到遠程,別人從遠程 clone 下來了,這時候你再要去重寫歷史,就須要別人作一些額外的操做才能保持同步。編輯器

舉幾個簡單技巧的實例:flex

好比,咱們如今有 3 個 commit,信息以下:ui

20200704234158
20200704234158

當 commit 還在本地倉庫時

只想重寫上一個 commit 的信息時

git commit --amend -m 'feat: add 3 after change'
複製代碼

執行成功url

20200704234333
20200704234333
20200704234345
20200704234345

請注意,這時候 hash 值已經變化了,commit hash 值由原 ae2a029 => fcfd33cspa

批量修改多個 commit 的信息或更改第幾個 commit 時

舉例:3d

20200704230031
20200704230031

當前 master 分支,有 3 個 commit,按照從舊到新分別是 add 一、二、3code

此時,若是你要修改 add 2 和 add 3 的 commit 信息,此時則取出要更改的最先的 commit 的父 commitcdn

好比,執行

git rebase -i eb303949e839cbfc1e4ab531e3f33439789369d3
複製代碼

其中, eb303949e839cbfc1e4ab531e3f33439789369d3 是 commit: add 1 的 hash 值。

20200704231232
20200704231232

出現文本編輯頁面。注意,此時的 commit 的順序,和正常看的 commit 信息是反的,由於是 rebase 操做,因此要從最先提交的子 commit 開始 rebase,因此這也是爲何反了的緣由。

介紹下常見的名詞解釋:

pick,使用該 commit 改動和 commit 信息

reword 使用該 commit 改動,可是能夠更改 commit 信息(同 git commit --amend -m 效果),推薦使用這個更改多個 commit 信息,由於比 edit 更少操做步驟

edit, 使用該 commit 改動,可是能夠更改 commit 信息(會在每次要更改 commit 前須要手動執行 git commit --amend)

squash, 使用該 commit 改動,可是 commit 信息取前一個 commit 信息,也就是將該 commit 和前一個 commit 合併

你想更改某個 commit 信息

使用 edit

好比,你想將 commit: add 2 信息更改爲:add 2 after change,那麼能夠在文本編輯狀態時將 pick 更改爲 edit,如下而後輸入 :wq 保存

20200704232115
20200704232115

此時會出提示

20200704232202
20200704232202

這時 head 正處於 rebasing 狀態,而後就和上面用 amend 使用是同樣的,輸入

git commit --amend
複製代碼

則會出現下面文本提示:

20200704232353
20200704232353

此時,作出你想要作的 commit 修改,好比將 add 2 改爲 add 2 after change 而後輸入 :wq 保存,以下圖

20200704232458
20200704232458

此時看 git log 能夠看到:

20200704232540
20200704232540

當前 rebase 的 head 的 commit 信息已經被修改。因爲還處於 rebasing 狀態,因此咱們須要執行:

git rebase --continue
複製代碼

此時提示:

20200704232642
20200704232642

此時,查看 git 歷史,已修改爲功,hash 值也都相應更新了:

20200704232734
20200704232734
使用 reword(推薦)
20200705085511
20200705085511

輸入 :wq 保存後會當即進入編輯第一個 reword 的 commit 信息的文本編輯狀態,即編輯:feat: add 2 的地方,此時進行文本編輯:feat: add 2 => feat: add 2 after reword

20200705085640
20200705085640

編輯好 commit 信息後輸入 :wq 保存,此時進入第二個 reword 的 commit 信息的文本編輯狀態,此時進行文本編輯:feat: add 3 => feat: add 3 after reword

20200705085734
20200705085734

編輯好 commit 信息後輸入 wq 保存,即修改爲功

20200705085935
20200705085935

你想合併某幾個 commit 成一個 commit

要將最新的 commit 和最新的第二個 commit 信息合併,同理使用 rebase:

git rebase -i xxx // xxx 爲父commit的hash
複製代碼

此時,將最新的 commit 改爲:squash,以下圖:

20200705090249
20200705090249

按下 wq 進行保存,則進入 commit 信息編輯頁面

20200705090440
20200705090440

好比,將 commit 信息寫成:feat: add 2 use reword and 3 use reword

20200705090521
20200705090521

按下 wq 進行保存

20200705090621
20200705090621

由此看到,commit 已經合併,並且 commit 信息也是 feat: add 2 use reword and 3 use reword

當 commit 已經 push 到遠程

若是已經 push 到遠程,則能夠本地重寫歷史後,進行一次 push,此時該分支的 head 節點已經改變,建議讓協同者刪除本地分支,拉去你剛剛 push 的分支,再進行後續更改

更多精彩文章能夠看個人博客,若有錯誤,歡迎指正

本文使用 mdnice 排版

相關文章
相關標籤/搜索