![](/img/trans.png)
[英]Did 'git rebase -i master' by mistake and unsure of current state
[英]Did I git rebase?
我回到了幾周前(假期前)我正在處理的一些代碼。 我根據合並請求中留下的一些評論進行了更改。
我去推送我的更改,但出現錯誤:
! [rejected] my_branch -> my_branch (non-fast-forward)
error: failed to push some refs to '<remote>:my_repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
我認為這是我在 rebase 后嘗試推送時收到的消息(需要強制推送); 但是,我不記得變基(我可能有,只是不記得了)。
當我真的不知道我在推動什么時,我會猶豫是否強制推動。
所以我的問題是:有沒有辦法檢查我的分支機構(特別是我的本地分支機構)是否已重新定位? 除了 rebase 之外,是否還有其他可能導致此錯誤的原因(如果沒有,那么我可能會假設我幾周前剛剛做了 rebase,並且強制推送可能是安全的)? 關於如何安全處理這種情況的任何其他建議?
非快進錯誤可能是由於您在另一個貢獻者剛剛推送不同的新提交時嘗試推送新提交。 檢查它的方法是git fetch
, git diff origin/my_branch
和git log origin/my_branch..my_branch
。 補救的方法是git pull --rebase origin my_branch
或者
git fetch origin
git rebase origin/my_branch my_branch
git push origin my_branch
您通常收到的消息1表示您的分支機構與遠程分支機構存在分歧。 最常見的情況是:
origin/main
。了解它是什么很重要,因為您應該對#1 和#2 采取的操作是強制推送,而您應該對#3 采取的操作是拉取(通過合並或變基),或將您的分支變基到遠程版本 - 有關解決場景 #3 的詳細信息,請參閱phd 的答案。
無論哪種情況,您都絕對不想弄錯,因為:
所以把它做好很重要。 根據你的第一句話:
我回到了幾周前(假期前)我正在處理的一些代碼。 我根據合並請求中留下的一些評論進行了更改。
我認為可以安全地假設兩件事:
現在讓我們看看發生了什么:
這種情況經常發生在我身上。 我切換到我希望工作的個人分支之一,我輸入git status
,看到我的分支已經從遠程分支,例如它告訴我我提前 300 次提交,落后 2 次。 在這種情況下,我知道我重新定位了,但我可能仍然會看:
git log @{u} -n3 # show me the top 3 commits of my remote branch
git log @ -n3 # show me the top 3 commits of my local branch
我希望看到相同的 2 個提交具有相同的作者(我)和作者日期,但具有不同的提交 ID。 第三次提交在我的本地分支上應該是更新的,這意味着我只是重新定位到基礎分支的更新版本。 (場景#1)
請注意,如果我的分歧數是 2 和 2,並且第 3 次提交是相同的 ID,那么這意味着我可能沒有在目標上變基,而是進行了交互式變基或修改(場景 #2),這使得查看變得容易差異:
git diff @{u} @
總的來說,我傾向於總是使用git push --force-with-lease
,所以在看到我可以推送之后我很有信心。 如果--force-with-lease
仍然失敗,我只需git fetch
,然后git status
,並重復上述步驟以查看我遺漏了什么。
如果在比較日志時你看到其他人在遠程分支上的提交,那么你知道其他人推送了一個提交,你需要將它帶到你的分支中,這樣你就不會把它吹走。 如果您處於場景 #1 和/或 #2,以及場景 #3,這意味着有人將提交推送到您的舊版本分支,那么您可能需要使用rebase --onto
選項上。
1獲取此消息的另一種可能方法是,如果您沒有分歧,而是僅在遠程分支后面。 在這種情況下,雖然您沒有任何新的提交要推送,但您可以簡單地執行git merge
或git pull
或git reset --hard @{u}
,甚至git rebase @{u}
所有這些都會有同樣的效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.