我正在編輯我的源檔案以在我的dev分支上生成一個新的提交。我的更改已保存在磁盤上,但尚未暫存。
然后我注意到前一次提交引入的一個小錯誤,比如HEAD~10. 一旦修復,結果就是我的磁盤上只有一個(或幾個)額外的 git diff hunk(s)。
我不希望這些大塊被記錄在新提交中,因為它們屬于HEAD~10. 所以我需要rebase。這是我的作業流程,但我對此并不滿意:
$ git stash # save my current work the small fix
$ git rebase --interactive HEAD~11
# set first commit appearing in todo list to `edit` action
$ git stash pop # re-introduce my changes here (**may conflict**)
$ git add --patch fixed_files # or similar, to only stage relevant fix hunk(s)
$ git commit --amend # fix old commit
$ git stash # save my current work again
$ git rebase --continue # get back to my current commit (will likely *not* conflict)
$ git stash pop # back here with HEAD~10 fixed
我不滿意的是程序很復雜,第一git stash pop行可能會引入無意義的沖突,盡管我確信在執行該git rebase --continue行的程序中不會發生沖突。
有沒有更好的辦法?假設我只有幾個階段性的帥哥HEAD,我可以很容易地在我的分支中更早地用一些神奇的方式介紹它們:
git amend-old-commit-then-rebase HEAD~10
還保留我未分階段的更改嗎?(當然,如果固有的變基確實發生沖突,我會被警告)
uj5u.com熱心網友回復:
Interactive rebase 已經有一個內置的方法來處理這個問題。讓我們演示一下。我們首先檢查一些現有分支名稱的提示提交:
git switch main
然后創建我們的功能或主題分支:
git switch -c topic
我們開始作業并提交一個有小錯誤的提交:
... edit ...
git add frotz.c
git commit
假設這是提交a123456(我們稍后會找到哈希 ID git log,或者我們將HEAD~10像您在示例中所做的那樣使用;我只想在這里放一些具體的東西)。
我們做出更多的承諾:
... edit and commit repeatedly ...
然后發現錯誤。我們暫緩修復錯誤,做出我們需要做出的承諾:
git commit
然后我們修復錯誤, git add, 并使用git commit --fixup:
... edit frotz.c to fix the mistake ...
git add frotz.c
git commit --fixup a123456 # or git commit --fixup HEAD~10
該--fixup選項指示git commit使用特殊格式的提交訊息。
現在我們有了修復提交,我們運行:
git rebase -i --autosquash main
(因為topic是基于main; 在這里使用你需要的任何東西)。pick彈出所有命令的表單,但是當我們仔細觀察它時,我們看到其中一行沒有說pick,它說fixup:
pick a123456 commit subject line
fixup b789abc fixup! commit subject line
pick 9876543 another commit subject
... and so on ...
寫出這組命令(或者不打擾,因為我們不需要更改它們)并退出編輯器會啟動實際的變基,它......將修復提交吸收到錯誤提交中,所以現在一切都只是一次提交。
該fixup命令基本上告訴 Git:將這個提交壓縮到上一個提交中,同時完全洗掉這個提交的日志訊息。 使用squash而不是fixup告訴 Git:將這個提交壓縮到前一個,但是停下來,給我一個機會寫一條新的日志訊息,向我展示兩條現有的日志訊息。除了編輯提交訊息的機會之外, 這些實際上是相同的。
由于您沒有提到要修復提交訊息,所以我們--fixup在這里使用。要自動獲取“squash”命令,請使用git commit --squash. 在這兩種情況下,都git commit安排未來git rebase --autosquash看到一條訊息,告訴 rebase重新排列選擇命令的順序,并根據需要將第二個更改為 squash 或 fixup。
與往常一樣,您也可以手動重新訂購和/或修改說明。(我通常這樣做而不是git commit --fixup無論如何都使用,因為我經常想做很多提交訊息的改寫,并考慮要組合哪些提交以及將它們放入的順序。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/460223.html
