用另一个分支完全替换当前分支

7
我有3个分支:developmentqastaging。在developmentqa中,我的代码几乎相同,因此从developmentqa的pr不会产生太多更改(或冲突)。

但现在我需要将所有东西从qa移动到staging。而qa的代码与staging完全不同,所以最好的选择是什么?我搜索并找到了这个其他答案

git checkout qa
git merge -s ours staging
git checkout staging
git merge qa

这对我的情况是一个好主意吗?提前感谢!编辑:我不想失去暂存分支中的所有提交。

由于QA和Staging包含不同的代码更改,可能会发生冲突。因此您需要解决并合并它们。 - uday
是的,我想要做的是用qa分支中的代码替换staging中的所有代码,不想解决冲突,只是像手动逐个文件更改来自qa分支文件的代码一样替换代码。 - nick
你可以使用git merge强制覆盖合并,你可以参考这个链接中的类似步骤 https://dev59.com/jlkS5IYBdhLWcg3wASHc - uday
2
是的,在这里使用 merge -s ours 是您最好的选择。您最终将只保留一个分支的快照,但保留两个分支的历史记录。还可以参见 https://dev59.com/cm445IYBdhLWcg3w7unD 以获取可能的重复内容。 - knittl
这回答解决了您的问题吗?如何在Git中将一个分支'覆盖'而不是'合并'到另一个分支? - Marco Luzzara
显示剩余2条评论
3个回答

19
如果你想要“完全替换”,我会选择使用git reset:
git checkout staging
git reset origin/qa --hard

这将使stagingqa完全相同,这将“抹掉”可能已在staging上进行的提交(提交尚未被删除,但它们将不再出现在staging历史记录中)。


1
有没有办法做到这一点,但不会丢失暂存提交? - nick
1
不失去提交记录的情况下,您是指在历史记录中查看它们,但仍将所有文件覆盖为“qa”中的内容吗? - Gaël J

1

Gaël J's 答案很好,但有一个更短的命令(即单个命令),它不需要您切换分支,并且不会干扰您当前的工作树:

git branch -f staging origin/qa

如果该分支已经与他人共享(=已推送),则必须强制推送到远程仓库并通知其他人,让他们基于此分支重新进行变基。

如果您想将所有暂存提交放在远程跟踪分支origin/qa的顶部,请使用rebase

git rebase origin/qa staging

或者,如果您想替换由staging引用的树的内容,但仍保留其旧历史记录,请使用合并策略-s ours。请参见我的回答"如何在Git中'覆盖'而不是'合并'另一个分支上的分支?"


1
这个问题的答案与我所寻找的略有不同。根据@knittl的答案,我尝试直接用另一个分支的历史记录替换我的主分支,而不保留主分支中的任何早期提交。简单来说,就是将一个分支直接替换为另一个分支。
我使用了以下的技巧来实现这个操作:
git checkout branchB
git branch -mf main
git push --force -u origin main

这导致我的main分支与branchB分支有着完全相同的历史记录,所以我实际上删除了main中发生的一切,并用branchB中发生的事情取而代之。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接