我在當前的分支中有一些提交。我想將這些所有提交轉換為一個提交并洗掉所有這些提交。所以我使用了以下命令
- git rebase -i HEAD~9
- 編輯了所有提交到 Squash 的提交,除了最舊的提交并保存
- 給出特定評論并保存
- 推
我運行了“git push”而不是 git commit,然后是強制推送。
現在,它創建了一個新提交,合并了所有以前的提交。但它并沒有洗掉所有以前的提交。我已經推入遠程。
在 rebase 之前,以下是我分支中的提交 ID
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>
在 rebase 之后,提交 id 已添加到現有的提交 id 中,這是所有上述提交 id 的合并
commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>
所以請幫助我如何洗掉以前的提交并確保只有一個壓縮的提交被推送到遠程。有沒有辦法從這里恢復或解決這個問題?
uj5u.com熱心網友回復:
沒有什么會洗掉舊的提交。1 Rebase 進行新的提交,但舊的提交繼續存在。完成新提交后,我們現在告訴其他擁有其他 Git 存盤庫的人獲取這些新提交(或將它們發送給使用 的其他人git push)……然后我們告訴他們:并停止使用舊提交,因為這些是新提交并改進了替換提交。
如果您使用git push將這些提交發送到某個共享存盤庫,則必須在一般情況下使用git push --force或git push --force-with-lease實作“并停止使用舊提交”部分。
你所做的——你沒有說這個,但人們不小心這樣做是很常見的——是進行新的和改進的提交,將它們發送到另一個 Git 存盤庫,然后合并舊的提交和新的和改進的 commits。所以你現在在你的存盤庫中有兩個集合。
要解決此問題,您必須從您正在使用的提交集中彈出合并提交本身。也就是說,您要“洗掉”合并。正如我們已經指出的,這是根本不可能的,但你不必消滅合并從你的倉庫提交; 你只需要停止使用它。
允許您停止使用某些特定提交的 Git 命令是git reset. 使用有一些主要缺點git reset:
要停止使用某些提交,您還必須停止使用該分支上的所有后續提交。
如果其他人(其他Git倉庫)有承諾,他們可以還給你的Git這會很樂意將其重新添加:Git的只是愛來補充提交,不愿意停止使用的提交,這就是為什么合并是很簡單的復位很難。
但是,如果您確定沒有未提交的作業,現在就可以安全地運行git reset --hard了。運行git log --graph(或查看Pretty Git 分支圖)以驗證合并提交是否是分支的提示,并查看合并的第一個父項是否是您想要作為新提示的提交(這似乎很可能),或者合并的第二個父級是您想要的新提示(不太可能但可能)。然后:
git reset --hard HEAD~1
將分支名稱移回當前提交的第一個父級。如果這不是正確的提交——如果你需要第二個父級——你將改為運行:
git reset --hard HEAD^2
(或在CMD.EXE,git reset --hard HEAD^^2)。您必須首先仔細查看提交圖(請參閱鏈接的問題及其答案)以驗證合并提交實際上位于當前分支的尖端,并且合并提交的第一個或第二個父項是您想要的提交在尖端。
如果不是這些情況,請考慮運行:
git log --decorate --oneline --graph
并將一些輸出(具有相關提交的部分)剪切并粘貼到您的問題中。
1嚴格來說這不是真的,但沒有“洗掉提交”命令。相反,我們放棄舊的提交——停止使用它們——最終 Git 決定它們不僅現在沒有被使用,而且甚至無法找到,然后 Git 最終會自行洗掉它們。或者,有時不會。除非我們深入研究維護 Git 命令,否則我們不會真正控制這一點。
uj5u.com熱心網友回復:
感謝您的評論和帖子。我可以通過使用 git-rebase 中的 reword 和 drop 選項來解決這個問題。以下是我在壁球之后洗掉其他提交所遵循的步驟。
- git rebase -i HEAD~2
- 打開帶有壓縮提交 id 和先前提交 id 的編輯器。我認為它將其他提交視為一次提交。因此,當我僅請求 2 次提交時,它會顯示分支中最近壓縮的提交和之前的所有提交。
- 將最近壓扁的提交標記為“改寫”
- 將其他以前的提交標記為“洗掉”,我想從分支中洗掉它,因為所有這些提交都被壓縮為一個提交。
- 保存并退出
- 重寫新提交的注釋
- 檢查 git 日志。它將洗掉所有舊提交并在分支中僅顯示一個新提交
- git push -f(必須也應該)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/351149.html
標籤:混帐 github git-rebase git-rewrite-history git-squash
下一篇:使用二級密鑰推送到受邀倉庫
