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

时间:2011-01-07 10:01:54

标签: git

我有两个分支emailstagingstaging是最新版本,我不再需要email分支中的旧更改,但我不想删除它们。

所以我只想将staging的所有内容转储到email,以便它们都指向同一个提交。这可能吗?

13 个答案:

答案 0 :(得分:171)

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

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

答案 1 :(得分:84)

如果您只想让两个分支机构的'email'和'staging'相同,您可以标记'email'分支,然后将'email'分支重置为'staging'分支:

$ git checkout email
$ git tag old-email-branch
$ git reset --hard staging

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

答案 2 :(得分:63)

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

这对我有用:

$ 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)。

答案 3 :(得分:55)

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

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

git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new

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

答案 4 :(得分:35)

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

git checkout email
git reset --hard staging
git push origin email --force

注意:只有您真的不希望再次看到电子邮件中的内容时才会这样做。

答案 5 :(得分:14)

我想合并两个分支,以便使用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

答案 6 :(得分:10)

怎么样:

git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease

答案 7 :(得分:5)

其他答案看起来不完整 我在下面已经完全尝试了,它运行良好。

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

详细说明:
1.所有发展都发生在开发部门 2. qa分支与开发的副本相同 3.时间,dev代码需要移动/覆盖到qa分支

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

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

git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push

上次推送的自动评论如下:

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

这个评论看起来相反,因为上面的序列也看起来是反向的

第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

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

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.本地是干净的(远程起源/开发不受影响)

答案 8 :(得分: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

答案 9 :(得分:2)

这是您想要的(实际上是当前接受的答案的确切反函数):

git checkout email
git merge --strategy-option=theirs staging  

这是什么?

  • 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'

因此,总之,第二个版本是:

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

答案 10 :(得分:0)

最简单的方法:

//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

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

答案 11 :(得分:0)

此分支不会更改原始的较新分支,并为您提供了在最终提交之前进行进一步修改的机会。

git checkout new -b tmp
git merge -s ours old -m 'irrelevant'
git checkout old
git merge --squash tmp
git branch -D tmp
#do any other stuff you want
git add -A; git commit -m 'foo' #commit (or however you like)

答案 12 :(得分:0)

我尝试了@knittl的$class = $tester |Where Name -like 'Class*' |Select -First 1 $class::test() # this should work now, with or without the delegate 方法。

分支-a:保留的分支

branch-b:废弃的分支

write-tree/commit-tree