Git-重写历史知多少(更改 commit 信息)
經常有以下這些需求:
這里還分兩種情形,一種是要重寫本地倉庫的 commit。第二種是已經 push commit 到遠程倉庫。
常見技巧:選擇 push 到遠程倉庫要慎重,需要是你已經有充足的信心及把握提交代碼(而且代碼也是可信任的)。因為一旦提交到遠程,別人從遠程 clone 下來了,這時候你再要去重寫歷史,就需要別人做一些額外的操作才能保持同步。
舉幾個簡單技巧的實例:
比如,我們現在有 3 個 commit,信息如下:
當 commit 還在本地倉庫時
只想重寫上一個 commit 的信息時
git commit --amend -m 'feat: add 3 after change'執行成功
請注意,這時候 hash 值已經變化了,commit hash 值由原 ae2a029 => fcfd33c
批量修改多個 commit 的信息或更改第幾個 commit 時
舉例:
當前 master 分支,有 3 個 commit,按照從舊到新分別是 add 1、2、3
此時,如果你要修改 add 2 和 add 3 的 commit 信息,此時則取出要更改的最早的 commit 的父 commit
比如,執行
git rebase -i eb303949e839cbfc1e4ab531e3f33439789369d3其中, eb303949e839cbfc1e4ab531e3f33439789369d3 是 commit: add 1 的 hash 值。
出現文本編輯頁面。注意,此時的 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 保存
此時會出提示
這時 head 正處于 rebasing 狀態,然后就和上面用 amend 使用是一樣的,輸入
git commit --amend則會出現下面文本提示:
此時,做出你想要做的 commit 修改,比如將 add 2 改成 add 2 after change 然后輸入 :wq 保存,如下圖
此時看 git log 可以看到:
當前 rebase 的 head 的 commit 信息已經被修改。由于還處于 rebasing 狀態,所以我們需要執行:
git rebase --continue此時提示:
此時,查看 git 歷史,已修改成功,hash 值也都相應更新了:
使用 reword(推薦)
輸入 :wq 保存后會立即進入編輯第一個 reword 的 commit 信息的文本編輯狀態,即編輯:feat: add 2 的地方,此時進行文本編輯:feat: add 2 => feat: add 2 after reword
編輯好 commit 信息后輸入 :wq 保存,此時進入第二個 reword 的 commit 信息的文本編輯狀態,此時進行文本編輯:feat: add 3 => feat: add 3 after reword
編輯好 commit 信息后輸入 wq 保存,即修改成功
你想合并某幾個 commit 成一個 commit
要將最新的 commit 和最新的第二個 commit 信息合并,同理使用 rebase:
git rebase -i xxx // xxx 為父commit的hash此時,將最新的 commit 改成:squash,如下圖:
按下 wq 進行保存,則進入 commit 信息編輯頁面
比如,將 commit 信息寫成:feat: add 2 use reword and 3 use reword
按下 wq 進行保存
由此看到,commit 已經合并,而且 commit 信息也是 feat: add 2 use reword and 3 use reword
當 commit 已經 push 到遠程
如果已經 push 到遠程,則可以本地重寫歷史后,進行一次 push,此時該分支的 head 節點已經改變,建議讓協同者刪除本地分支,拉去你剛剛 push 的分支,再進行后續更改
更多精彩文章可以看我的博客,如有錯誤,歡迎指正
總結
以上是生活随笔為你收集整理的Git-重写历史知多少(更改 commit 信息)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php redis下单,redis 队列
- 下一篇: 政务大数据可视化大屏