與壓縮提交的合并向我的主分支引入了一個錯誤。我想撤消合并請求,然后將其分解為單獨的提交,然后應用它們以確定哪個提交引入了錯誤。最好的方法是什么?我嘗試使用git reset HEAD~which unstaged 合并中的所有更改,但這只是告訴我更改的檔案。我也研究過使用互動式變基,但我不確定如何為我的用例正確地做到這一點。關于解決這個問題的任何建議?
uj5u.com熱心網友回復:
1.恢復分支。
如果您已經洗掉了分支,請使用git reflog. 找到作為分支尖端的提交,然后git branch <name> <that commit>.
2.撤消壁球合并。
就在你的壁球合并之前,假設在 main 上做了更多的作業,你的存盤庫看起來像這樣。
A - B - C - D [main]
\
1 - 2 - 3 [branch]
壁球合并后,您的存盤庫如下所示。
$ git merge --squash branch
A - B - C - D - 123 [main]
\
1 - 2 - 3 [branch]
第一步是撤消壁球合并。git reset --hard HEAD~.
$ git reset --hard HEAD~
A - B - C - D [main]
\
1 - 2 - 3 [branch]
3. 更新您的分支。
下一步是更新您的分支。您應該在任何合并之前執行此操作。定期更新您的分支應該是您正常作業流程的一部分。這使您可以在合并之前測驗將要合并的內容,避免在合并和污染 main 之后出現意外。在您的分支作業中定期執行此操作可以讓您在錯誤被埋沒在更多提交之前捕獲它們。
您可以通過兩種方式做到這一點。您可以將 main 合并到分支中...
$ git checkout branch
$ git merge main
A - B - C ----- D [main]
\ \
1 - 2 - 3 - M [branch]
我不喜歡這個,因為它使歷史復雜化,有很多沒有歷史價值的“更新”合并。
或者您可以在合并之上重新設定分支。這會重寫 main 頂部分支中的每個提交。
$ git checkout branch
$ git rebase main
A - B - C - D [main]
\
1A - 2A - 3A [branch]
我更喜歡這個,因為它使歷史保持簡單,并迫使您一次處理與新的主要提交的任何沖突。結果就好像你一直在當前 main 之上寫你的分支。
如果你已經推送了你的分支,git push將會失敗;push 只會添加到現有的分支,而不是替換它們。而是做git push --force-with-lease(不要使用--force)。我喜歡將此別名為git repush.
用 拉git pull --rebase。這不是將您的分支與拉取的提交合并,而是在拉取的提交之上重寫您的更改。這再次避免了無意義的“更新”合并。我喜歡配置git pull為始終變基。
4. 平分你的分支
現在您的分支與 main 是最新的,分支中的代碼與您將其與 main 合并時完全相同。這意味著您可以在不合并的情況下測驗合并。
git-bisect是一種無需檢查和測驗每個提交即可發現何時在分支中引入錯誤的工具。它進行二進制搜索以非常有效地找到引入錯誤的提交。我不會在這里討論如何使用它,檔案中有很好的示例,并且那里有很多教程。
5. 合并你的分支。
找到并修復錯誤后,合并您的分支。
我建議不要進行壁球合并,因為它們會破壞歷史;你所有將你的提交分解成仔細、易于理解的單元的細心作業都將丟失。相反,正常合并。由于您已經是最新的,這將導致帶有“歷史氣泡”的線性歷史。
由于您使用 main 是最新的,因此此合并不會導致代碼更改。因為分支已經與 main 保持同步,Git 將放棄合并并簡單地將 main 移動到分支(“快進”)。雖然這會導致線性歷史,但它也會丟失在哪個分支中完成的作業,從而丟失相關的問題。
$ git checkout main
$ git merge branch
[main]
A - B - C - D - 1A - 2A - 3A [branch]
git merge --no-ff相反,強制 Git 使用(no fast-forward)進行合并提交。使用提交訊息來記錄分支的內容,以及指向任何問題跟蹤器的鏈接。
$ git checkout main
$ git merge --no-ff branch
A - B - C - D ------------ M [main]
\ /
1A - 2A - 3A [branch]
此作業流程意味著 main 保持線性,但一組提交的目的保留在“歷史氣泡”和合并提交日志中。
uj5u.com熱心網友回復:
讓我們回滾合并。
選項1
git reset --hard @~1
選項 2
在合并之前找到提交的哈希。記住這個哈希。回滾到這個提交:
git reset --hard <hash>
然后你可以使用cherry-pick單獨合并每個提交:
git cherry-pick <hash>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521425.html
標籤:混帐
