Git:将一个分支的代码覆盖到另一个分支

时间:2016-07-05 11:49:49

标签: git git-merge git-rebase

我有2个分支A和B.两个分支都有很多不同的提交,并且主人已经向前推进了。

我想要做的是用A替换B的所有更改。 即,B应具有与A完全相同的代码。

我尝试使用rebase / merge。甚至-Xtheirs同时重新调整B,但总是遇到大量的冲突。

我试过

git checkout B
git reset --hard A

How to copy one branch to another regardless changes?中给出,但这给了这个 -

Your branch and 'origin/B' have diverged,
and have 6603 and 1823 different commits each, respectively.

有没有办法可以将A的代码/提交复制到B,没有冲突?请帮忙。

3 个答案:

答案 0 :(得分:0)

如果您真的想从B中丢弃所有更改,这似乎是浪费,那么您可以强制更新分支指针。

git branch -f A B

答案 1 :(得分:0)

git checkout A -B B

签出A的工作树,同时为其指定分支名称B。 (由于B已存在,因此需要覆盖-B(大B)。)

这实际上与此相同:

# Checkout the branch 'A' and make the working tree reflect this
git checkout A

# Create/override a branch 'B' at this current position
git checkout -B B

最终结果是分支(实际上只是指针)'A'和'B'指向完全相同的提交。

N.B。最终结果与git checkout B && git reset --hard A的结果非常相似。

现在,既然您似乎关注 origin/B有多样化的消息,那么您现在可以做两件事:

  1. 您可以更新origin/B以反映新的B 强制 推送:(如果您提供担心,则不必担心最初在origin/B中的提交将不复存在。)

    push origin B --force
    
  2. 出于某种原因,您无法强制推送(仅快进服务器?)或者您希望保留B下的提交历史记录 - 而不是他们的更改。在这种情况下,它涉及更多:(这个用例非常罕见,所以我不完全确定这是你所追求的):

    git checkout A --detach
    git merge -s ours B
    git checkout -B B
    

    这使得合并提交继续进行A,将B合并到A而不实际更改任何文件。这个新的B可以正常推送,因为它不是origin/B的偏差。

答案 2 :(得分:0)

您将本地分支B重置为A的命令没问题 您收到的消息只是告知您本地分支B与远程分支B不同。
如果这确实是您想要做的事情,那么如果遥控器允许强行推动,现在只需B强制推动origin/B git push -f origin B B。 但请注意,您正在重写已发布的历史记录,并且您会因为create table dbo.Users ( Id int identity not null primary key clustered (Id), Name nvarchar (120) null, ); create table dbo.Organizations ( Id int identity not null primary key clustered (Id), Name nvarchar (120) null, ); 的工作而烦恼任何其他开发人员,因为他们必须通过工作的重新设置来手动恢复。