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


How do I 'overwrite', rather than 'merge', a branch on another branch in Git?

我有两个分支,第一个分支。Branch,yet I don't want to delete them.

因此,我只想把staging的所有内容都倾倒到email中,所以它们都一样。有可能吗?


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

1
2
$ git checkout staging
$ git merge -s ours email # Merge branches, but use our branch head


如果您只希望两个分支"email"和"staging"相同,可以标记"email"分支,然后将"email"分支重置为"staging"分支:

1
2
3
$ git checkout email
$ git tag old-email-branch
$ git reset --hard staging

您还可以在"电子邮件"分支上重新设置"暂存"分支。但结果将包含对这两个分支的修改。


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

以下是我的工作:

1
2
3
4
5
6
7
$ 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

如果没有第四步与我们的策略合并,推送将被视为非快速前进更新,并将被(Github)拒绝。


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

如果您希望分支机构的所有更改在分支机构中都是新的,那么:

1
2
3
4
git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new

一旦应用了这四个命令,就可以毫无问题地推动分支


如果你和我一样,不想处理合并,你可以执行上面的步骤,除了使用force而不是merge,因为它会创建一个分散注意力的日志文件跟踪:

1
2
3
git checkout email
git reset --hard staging
git push origin email --force

注意:只有当你真的不想再看到邮件中的内容时,才需要这样做。


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

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

1
2
3
4
5
$ 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


怎么样:

1
2
3
4
git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease


其他答案看起来不完整。我在下面试过了,效果很好。

注:1。在下面尝试之前,请复制您的存储库,以确保安全。

细节:1。所有开发都发生在dev分支中2。QA分支与DEV的副本相同三。有时,需要将dev代码移动/覆盖到qa分支

所以我们需要覆盖QA分支,从dev分支

第1部分:通过以下命令,旧的QA已更新为新的dev:

1
2
3
4
5
git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push

最后一次推送的自动注释如下:

1
2
// Output:
//  *<MYNAME> Merge branch 'qa' into dev,*

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

第2部分:

以下是意外的,dev中新的本地提交,不必要的提交所以,我们需要扔掉,让dev保持原样。

1
2
3
4
5
6
7
8
9
10
11
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

第3部分:确认一切正常:

1
2
3
4
5
6
git status  

// Output:
//  *On branch dev  
//  Your branch is up-to-date with 'origin/dev'.  
//  nothing to commit, working tree clean*

这就是全部。1。旧的QA现在被新的dev分支代码覆盖2。本地是干净的(远程源站/dev未受影响)


1
2
git checkout email
git merge -m"Making email same as staging disregarding any conflicts from email in the process" -s recursive -X theirs staging


最简单的方法是:

1
2
3
4
5
6
7
8
//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

现在,电子邮件分支和分段是相同的。