[英]Git branch diverged after rebase
我在本地重新設置了一個已經推送的分支。
Git 建議我的分支和遠程已經出現分歧,並且:
“並且分別有 109 和 73 個不同的提交”
推動我的分支會解決這個問題 - 即在 rebase 后會出現這種情況嗎?
當你對一個分支進行 rebase 時,你必須為任何高於你正在 rebase 的分支中的提交的提交重寫提交。 這是因為提交的屬性之一是其父項(或父項)。 當您變基時,您正在更改分支上最早的本地提交的父級 - 從而更改所有本地提交的提交哈希,因為此更改會通過提交傳遞。
由於您已經推送了分支,因此您應該在源分支中進行合並,而不是針對它進行變基。 可以“強制推送”您的新分支(使用-f
標志),但正常推送將不起作用,因為分支歷史的完整性會受到干擾。 如果你在這個分支上與其他人合作,強制推送是一個壞主意,因為當他們的歷史突然不匹配時,它會導致其他合作者變得非常困惑。
TL;DR - 如果您不合作,請使用 push -f 推送分支。 如果是,請將分支重置為之前的狀態,然后在源分支中合並。
你所有的提交都改變了 id,所以轉移並不是真正的分歧。
要解決您的問題,您必須覆蓋遠程分支:
git push -f origin experiment
http://git-scm.com/book/ch3-6.html
說明:
看看這張圖片中的 C3 是如何在變基后不作為 C3 放置的,而是作為 C3' 放置的。 這是因為它不完全是 C3,但它的所有代碼都發生了變化。
在這張另一張圖片上,您可以了解當涉及遙控器時會看到什么變基,以及為什么會發生轉移。
無論如何,在您執行強制推送后,它會告訴您它執行了(強制更新),此時您應該沒問題。
查看頂部的鏈接,然后搜索“git push --force”。 您將看到更詳細的說明。
這可以通過將目標分支重新設置為當前本地分支、切換到目標分支,然后將本地分支重新設置為目標來解決,而無需強制推送。 這不會發散,因為添加了可能丟失的提交並且不再需要創建。 更容易解釋的示例:
如果您還沒有更新您的開發分支,那么“git checkout develop”&&“git rebase feature/doing_stuff”將正常工作,因為自您結帳以來沒有添加任何提交。 但是,如果您已經檢查了 develop 並拉下了新的提交,那么如果您由於看到新的提交而嘗試變基,您將看到這種分歧。 無需強制推送的簡單解決方案(在團隊環境中通常不是一個好主意)是:
第 2 步的 rebase 將丟失的提交帶入 feature/doing_stuff,因此當第 4 步出現時,它是最新的,不需要為更改創建新的提交。
這是一個我知道有效的解決方案,因為我剛剛遇到了這個問題並執行了上述步驟以成功推動開發而無需強制。 我在一個由 50 多名開發人員組成的團隊中工作,因此禁止強制推送除我自己的測試分支之外的任何內容,因此我必須找到解決方案。
通過執行以下操作,我在 rebase diverge 上取得了成功:
git checkout mybranch
git pull
git push origin mybranch
拉力解決了分歧。
拉之前
Your branch and 'origin/mybranch' have diverged, and have 2 and 1 different commit(s) each, respectively.
拉輸出
通過遞歸進行合並。 mypath/myfile.py | 12 +++++++++++- 1 個文件更改,11 個插入(+),1 個刪除(-)
拉后
您的分支領先於 'origin/mybranch' 3 次提交。
推后
mybranch 比分支領先 3 仍然有一個打開的拉取請求合並消息添加到提交歷史中 將遠程分支 mybranch 合並到 mybranch
我假設這可能是 force push 所做的,我還沒有驗證。
正如其他人所說,如果您已經有一個開放的拉取請求,請避免 rebase。 我提供這個例子作為對我有用的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.