Git-重写历史知多少(更改 commit 信息)
經(jīng)常有以下這些需求:
這里還分兩種情形,一種是要重寫(xiě)本地倉(cāng)庫(kù)的 commit。第二種是已經(jīng) push commit 到遠(yuǎn)程倉(cāng)庫(kù)。
常見(jiàn)技巧:選擇 push 到遠(yuǎn)程倉(cāng)庫(kù)要慎重,需要是你已經(jīng)有充足的信心及把握提交代碼(而且代碼也是可信任的)。因?yàn)橐坏┨峤坏竭h(yuǎn)程,別人從遠(yuǎn)程 clone 下來(lái)了,這時(shí)候你再要去重寫(xiě)歷史,就需要?jiǎng)e人做一些額外的操作才能保持同步。
舉幾個(gè)簡(jiǎn)單技巧的實(shí)例:
比如,我們現(xiàn)在有 3 個(gè) commit,信息如下:
當(dāng) commit 還在本地倉(cāng)庫(kù)時(shí)
只想重寫(xiě)上一個(gè) commit 的信息時(shí)
git commit --amend -m 'feat: add 3 after change'執(zhí)行成功
請(qǐng)注意,這時(shí)候 hash 值已經(jīng)變化了,commit hash 值由原 ae2a029 => fcfd33c
批量修改多個(gè) commit 的信息或更改第幾個(gè) commit 時(shí)
舉例:
當(dāng)前 master 分支,有 3 個(gè) commit,按照從舊到新分別是 add 1、2、3
此時(shí),如果你要修改 add 2 和 add 3 的 commit 信息,此時(shí)則取出要更改的最早的 commit 的父 commit
比如,執(zhí)行
git rebase -i eb303949e839cbfc1e4ab531e3f33439789369d3其中, eb303949e839cbfc1e4ab531e3f33439789369d3 是 commit: add 1 的 hash 值。
出現(xiàn)文本編輯頁(yè)面。注意,此時(shí)的 commit 的順序,和正??吹?commit 信息是反的,因?yàn)槭?rebase 操作,所以要從最早提交的子 commit 開(kāi)始 rebase,所以這也是為什么反了的原因。
介紹下常見(jiàn)的名詞解釋:
pick,使用該 commit 改動(dòng)和 commit 信息
reword 使用該 commit 改動(dòng),但是可以更改 commit 信息(同 git commit --amend -m 效果),推薦使用這個(gè)更改多個(gè) commit 信息,因?yàn)楸?edit 更少操作步驟
edit, 使用該 commit 改動(dòng),但是可以更改 commit 信息(會(huì)在每次要更改 commit 前需要手動(dòng)執(zhí)行 git commit --amend)
squash, 使用該 commit 改動(dòng),但是 commit 信息取前一個(gè) commit 信息,也就是將該 commit 和前一個(gè) commit 合并
你想更改某個(gè) commit 信息
使用 edit
比如,你想將 commit: add 2 信息更改成:add 2 after change,那么可以在文本編輯狀態(tài)時(shí)將 pick 更改成 edit,以下然后輸入 :wq 保存
此時(shí)會(huì)出提示
這時(shí) head 正處于 rebasing 狀態(tài),然后就和上面用 amend 使用是一樣的,輸入
git commit --amend則會(huì)出現(xiàn)下面文本提示:
此時(shí),做出你想要做的 commit 修改,比如將 add 2 改成 add 2 after change 然后輸入 :wq 保存,如下圖
此時(shí)看 git log 可以看到:
當(dāng)前 rebase 的 head 的 commit 信息已經(jīng)被修改。由于還處于 rebasing 狀態(tài),所以我們需要執(zhí)行:
git rebase --continue此時(shí)提示:
此時(shí),查看 git 歷史,已修改成功,hash 值也都相應(yīng)更新了:
使用 reword(推薦)
輸入 :wq 保存后會(huì)立即進(jìn)入編輯第一個(gè) reword 的 commit 信息的文本編輯狀態(tài),即編輯:feat: add 2 的地方,此時(shí)進(jìn)行文本編輯:feat: add 2 => feat: add 2 after reword
編輯好 commit 信息后輸入 :wq 保存,此時(shí)進(jìn)入第二個(gè) reword 的 commit 信息的文本編輯狀態(tài),此時(shí)進(jìn)行文本編輯:feat: add 3 => feat: add 3 after reword
編輯好 commit 信息后輸入 wq 保存,即修改成功
你想合并某幾個(gè) commit 成一個(gè) commit
要將最新的 commit 和最新的第二個(gè) commit 信息合并,同理使用 rebase:
git rebase -i xxx // xxx 為父commit的hash此時(shí),將最新的 commit 改成:squash,如下圖:
按下 wq 進(jìn)行保存,則進(jìn)入 commit 信息編輯頁(yè)面
比如,將 commit 信息寫(xiě)成:feat: add 2 use reword and 3 use reword
按下 wq 進(jìn)行保存
由此看到,commit 已經(jīng)合并,而且 commit 信息也是 feat: add 2 use reword and 3 use reword
當(dāng) commit 已經(jīng) push 到遠(yuǎn)程
如果已經(jīng) push 到遠(yuǎn)程,則可以本地重寫(xiě)歷史后,進(jìn)行一次 push,此時(shí)該分支的 head 節(jié)點(diǎn)已經(jīng)改變,建議讓協(xié)同者刪除本地分支,拉去你剛剛 push 的分支,再進(jìn)行后續(xù)更改
更多精彩文章可以看我的博客,如有錯(cuò)誤,歡迎指正
總結(jié)
以上是生活随笔為你收集整理的Git-重写历史知多少(更改 commit 信息)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php redis下单,redis 队列
- 下一篇: 政务大数据可视化大屏