2016-09-23 133 views
0

我有兩個分支master; branch1branch2。我對branch1進行了一些更改,併爲此積極開展了PR活動。我還對branch2進行了更改,這些更改已經過審查併合併到master,並且隨後刪除了該分支。重新分支分支1與主分支2變化

我通過執行git fetch -apgit pull更新了本地master,這導致了branch2中所做的更改。我現在想更新branch1這些更改,以便唯一的區別是我在該分支上做出的區別。我試過git checkout branch1,然後是git rebase master

然而,當我在branch1git status它說:

On branch branch1 
Your branch and 'origin/branch1' have diverged, 
and have 3 and 1 different commits each, respectively. 
    (use "git pull" to merge the remote branch into yours) 

做一個git pull在這裏開闢了一個合併註釋對話框。但現在當我看到我的公關branch1它現在包括從branch2作爲新變化的變化。這裏發生了什麼,我該如何解決這個問題?

回答

1

(對於這個答案,我假設你有branch1檢查。如果沒有,git checkout branch1

當你git rebase master,你在branch1重寫提交,因爲他們現在有一個新的父。這是你的歷史可能看起來像:

X--*--Y [master] 
\  \ 
    \  A'--B'--C' [branch1] <-- 
    \       | (git rebase master) 
    A--B--C [origin/branch1] ---- 

其中,例如, A'A具有相同的內容,但具有不同的提交散列,因爲它的父代是Y而不是X

由於提交已更改,您將不得不強制更新origin。完成底墊後,你應該做的:

git push --force-with-lease 

不過,既然你已經做了git pull,重訂後,您需要先解決這個問題。難道例如: -

git reset --hard C' 

或者:

git reset --hard HEAD^ 

這將刪除合併從branch1承諾,你可以強制推如上所述。首先,以確保您的分行正確復位,這樣做:

git log --oneline --decorate master..HEAD 

該命令應顯示應在branch1全部提交,只有那些提交的輸出。

(旁白:如果你在這一點上做的git status,你可能會看到一些像這樣的輸出:

On branch branch1 
Your branch is behind 'origin/branch1' by 2 commits, and can be fast-forwarded. 
    (use "git pull" to update your local branch) 

您可以放心地忽略此警告,因爲這些提交的一個是合併提交,並其他的是你的原始錯誤信息中的1 different commit。)

正如上面提到的,在這一點上,你應該做的:

git push --force-with-lease 

現在遠程branch1將具有相同的提交您的本地branch1


強制性警告:由於重訂重寫歷史,這可能是危險/破壞性的任何其他人對這個分支上工作。確保你清楚地告訴你與你合作的任何人所做的事情。

+0

謝謝你回答斯科特。只是爲了澄清,我需要在哪個分支上運行'git push --force-with-lease'?我在'branch1'上運行了重置。 – MeanwhileInHell

+0

'branch1'上的'git status'現在說 '在分支分支1上 你的分支由2個提交後面的'origin/branch1',並且可以被快速轉發。 (使用「git pull」更新您的本地分支)' – MeanwhileInHell

+0

@MeanwhileInHell更新我的答案以解決這兩個意見。 –