Git:让一个分支与另一个完全相同

5
我对Git还比较陌生,不太熟悉。目前,我正在寻找一种命令/选项/方法,可以让当前分支看起来像另一个分支;也就是说,将它们合并在一起,但当出现冲突时,总是选择被合并进当前分支的分支中的差异。
我的情况是这样的:我有一个稳定的应用程序在“master”分支上。我还有另一个分支,叫做“feature”。我想对“feature”进行更改/添加/删除,直到我喜欢正在开发的新功能。一旦我觉得准备好了,我想使主分支看起来与“feature”分支完全相同。
我知道这可能不是最佳实践,但正如我所说,我对Git还很陌生。我计划在未来学习更复杂的操作,但现在这就是我需要的全部。
谢谢!

1
可能是重复的问题:git命令使一个分支像另一个分支 - Brad Werth
4个回答

7

对我来说,已接受的答案(“分支只是指针...”)不太适用,因为我不仅需要我的分支看起来像另一个分支 - 我需要通过仅添加提交来实现这一点(不会丢失当前分支历史中的任何提交)。

我喜欢这种方法,可以使分支A看起来像分支B

git checkout B
git diff A > patch_to_make_A_like_B
git checkout A
git apply patch_to_make_A_like_B

(最后执行rm patch_to_make_A_like_B。)

这正是我要找的! - chrisdembia
如果您的存储库中只有文本文件,那么这是一个很棒的解决方案,但如果存在二进制文件,我认为它将无法工作。 - johanv
看起来,git diff --binary 存在,如果你有二进制文件,这将起作用。 - johanv

4
抱歉!在回答之前没有完全阅读完整个内容...
git checkout master
git merge feature

如果您在从master分支创建feature分支后没有对master进行任何更改,则此操作将轻松完成。

而您要做的正是分支和合并应该实现的方式。在分支上开发您的功能,当您稳定并使其按照您的期望工作时,将其合并回主分支。


如果我在主分支上进行更改可能会导致冲突怎么办?我想我应该提到这种可能性,因为我可能需要对某些小东西进行更改。 - G. Martin
据我所知,这应该不会有问题。在特性分支上执行 git checkout master 将会显示任何合并问题。一旦你解决了那些问题,在主分支上执行 git merge feature 就不会有任何问题了。 - Carlos Rendon

4

我知道这个问题已经问了一段时间了,而且已经有了一些答案,但是我想提供我的两分钱:

如果你想进行一个git merge并且不想担心合并冲突(总是优先选择一个分支中的更改而不是另一个),那么你可以使用git merge branch -X oursgit merge branch -X theirs。在https://dev59.com/pmYr5IYBdhLWcg3wi6s_上有更多关于此的解释。

然而,我认为在这里进行git rebase更加合理。一些优缺点在Rebase vs. Merge page上。合并旨在保留事件历史记录,包括合并本身,但从你的问题听起来,似乎你只想跟踪应用程序开发中的事件,并隐藏你在第一次创建分支时的事实。


1

分支只是提交图形中的指针。您可以使用git-reset将分支重置为指向任何位置,但在进行进一步提交之前,请确保检出所需的分支。


换句话说,我要找到我在特性分支上最后一次提交的提交 ID,切换到主分支,然后执行 git reset --hard 命令到该提交 ID,使 HEAD 与特性分支内容相同?是这样的吗? - G. Martin
是的,我应该强调这只是其中一种方法。在许多情况下,最好使用从功能分支合并回主分支的“传统”工作流程来完成它。我要补充的是,在Git中进行的合并相当智能;它们不像在CVS和SVN下的那样。 - crazyscot

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