2016-09-23 142 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更新我的答案以解决这两个意见。 –