我怎么'覆盖'而不是'合并',在Git的另一个分支上的分支?

Raf*_*fid 231 git

我有两个分支,emailstaging.staging是最新的,我不再需要email分支中的旧更改,但我不想删除它们.

所以,我只是想的所有内容转储stagingemail让他们都指向同一个commit.那可能吗?

kni*_*ttl 185

您可以使用"我们的"合并策略:

$ git checkout staging
$ git merge -s ours email # Merge branches, but use our branch head
Run Code Online (Sandbox Code Playgroud)

  • @Max我也有同样的困惑,这给我带来了很多麻烦.您需要从较新的分支(暂存)执行此命令,然后对您的旧分支(电子邮件)执行正常的合并/ PR. (25认同)
  • 我试过这个,似乎倒退了吗?这不会将电子邮件的内容转储到分段而不是相反吗? (20认同)
  • 为什么`;`在每个命令的末尾?我没有`;`,它似乎工作.此答案也不完整,第三步是签出旧分支(电子邮件),然后再次与分段合并. (7认同)
  • ``git rebase -s他们的<oldbranc> <newbranch>``也适用(无论你是哪个分支).请注意,在rebase'他们'实际上是新分支,因为'我们'是我们目前正在申请提交的头. (4认同)
  • @Rolf:但是rebase将摆脱合并信息并平息历史.不一定是你追求的.如果您正在处理已发布的历史记录,也不是一个好主意. (4认同)
  • 某种方式git显示"已经是最新的",你知道如何解决它 (3认同)
  • 完美的答案。我担心我们想用这个新分支更新的另一个分支的更改是否会以某种方式渗透。但是 -s ours 标志会导致覆盖所有更改,而不仅仅是导致冲突的更改。我们的 -s 递归 -X 有这个问题。总之,这个答案准确回答并解决了问题 (3认同)
  • 当然,应该有一个基于“他们的”(我认为与我们相反)的更直观的解决方案,例如“ $ git checkout email;$ git merge -s他们的分期? (2认同)

Syl*_*sne 91

如果您只想让两个分支"电子邮件"和"暂存"相同,您可以标记"电子邮件"分支,然后将"电子邮件"分支重置为"分段"分支:

$ git checkout email
$ git tag old-email-branch
$ git reset --hard staging
Run Code Online (Sandbox Code Playgroud)

您还可以在'email'分支上重新定位'staging'分支.但结果将包含两个分支的修改.

  • git reset打破了克隆你的repo的其他人的回购 (13认同)
  • 你是对的,我已经习惯了git命令的完成,我总是把"git check <TAB>"写成"git checkout"!纠正. (3认同)

Shy*_*ada 66

其他答案给了我正确的线索,但他们没有完全帮助.

这对我有用:

$ git checkout email
$ git tag old-email-branch # This is optional
$ git reset --hard staging
$
$ # Using a custom commit message for the merge below
$ git merge -m 'Merge -s our where _ours_ is the branch staging' -s ours origin/email
$ git push origin email
Run Code Online (Sandbox Code Playgroud)

如果没有与我们的策略合并的第四步,推送被认为是非快进更新,将被拒绝(由GitHub).


Bru*_*olo 65

我已经看到了几个答案,这是唯一让我在没有任何冲突的情况下解决问题的程序.

如果你想在branch_old中的branch_new进行所有更改,那么:

git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new
Run Code Online (Sandbox Code Playgroud)

一旦应用了这四个命令,您就可以毫无问题地推送branch_old

  • 你的答案非常适合我的问题,因为我不想重置HEAD,只是在将旧东西合并到较旧的分支中时对新文件中的较新文件进行首选,并且没有问题!+1 (4认同)

jsa*_*rma 40

如果你像我一样并且你不想处理合并,你可以执行上述步骤,除了使用force而不是merge,因为它会创建一个令人分心的日志文件路径:

git checkout email
git reset --hard staging
git push origin email --force
Run Code Online (Sandbox Code Playgroud)

注意:仅当您真的不想再次看到电子邮件中的内容时.

  • 这正是所问的问题 - “如何覆盖而不是合并”。应该接受答案。 (5认同)
  • 如果您仍然想查看电子邮件分支中的内容,只需在推送之前对其进行标记,例如“git tag old-email-branch”。然后,您将能够通过标记版本保留以前的内容。 (3认同)

小智 21

警告:这会删除电子邮件分支上的所有提交。这就像删除电子邮件分支并在暂存分支的头部重新创建它。

最简单的方法:

//the branch you want to overwrite
git checkout email 

//reset to the new branch
git reset --hard origin/staging

// push to remote
git push -f
Run Code Online (Sandbox Code Playgroud)

现在电子邮件分支和暂存是相同的。

  • 警告:这将删除“email”分支上的所有提交。这就像删除“email”分支并在“staging”分支的头部重新创建它。 (7认同)

Mad*_*dhu 16

我想合并两个分支,以便old_branch使用来自的内容更新所有内容new_branch

对我来说,这就像一个魅力:

$ git checkout new_branch
$ git merge -m 'merge message' -s ours origin/old_branch
$ git checkout old_branch
$ git merge new_branch
$ git push origin old_branch
Run Code Online (Sandbox Code Playgroud)

  • 这是我做过的最简单的合并.惊人. (2认同)

Are*_*k S 10

怎么样:

git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease
Run Code Online (Sandbox Code Playgroud)


len*_*enz 7

你想要的是这个(实际上与当前接受的答案完全相反):

git checkout email
git merge --strategy-option=theirs staging  
Run Code Online (Sandbox Code Playgroud)

其作用是:

  • email分支文件现在将与分支完全相同staging
  • email分支的历史记录将被保留
  • staging分支的历史记录将被添加到email历史记录中

作为附加值,如果您不需要staging分支的所有历史记录,您可以将squash其汇总为单个提交消息。

git checkout email
git merge --squash --strategy-option=theirs staging  
git commit -m "Single commit message for squash branch's history here'
Run Code Online (Sandbox Code Playgroud)

总而言之,第二个版本的作用是:

  • email分支文件现在将与分支完全相同staging
  • email分支的历史记录将被保留
  • email单个提交将添加到分支历史记录的顶部。staging此提交将代表分支中发生的所有更改


Man*_*ddy 6

其他答案似乎不完整。
我已经在下面进行了充分的尝试,并且工作正常。

注意:
1.为安全起见,在尝试以下操作之前,请复制存储库的副本。

详细信息:
1.所有开发都在dev分支中进行
。2. qa分支与dev的副本相同
。3.不时需要将dev代码移入/覆盖到qa分支中。

所以我们需要覆盖dev分支中的qa分支

第1部分:
使用以下命令,旧的qa已更新为较新的dev:

git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push
Run Code Online (Sandbox Code Playgroud)

最后推送的自动评论如下:

// Output:
//  *<MYNAME> Merge branch 'qa' into dev,*  
Run Code Online (Sandbox Code Playgroud)

此注释看起来是相反的,因为上面的序列也看起来是相反的

第2部分:

以下是开发人员中意外的,新的本地提交,不必要的提交,
因此,我们需要抛弃并使开发保持不变。

git checkout dev

// Output:
//  Switched to branch 'dev'  
//  Your branch is ahead of 'origin/dev' by 15 commits.  
//  (use "git push" to publish your local commits)


git reset --hard origin/dev  

//  Now we threw away the unexpected commits
Run Code Online (Sandbox Code Playgroud)

第3部分:
验证一切均符合预期:

git status  

// Output:
//  *On branch dev  
//  Your branch is up-to-date with 'origin/dev'.  
//  nothing to commit, working tree clean*  
Run Code Online (Sandbox Code Playgroud)

就这样。
1.现在旧的qa已被新的dev分支代码覆盖
。2. local是干净的(远程原点/ dev未被修改)