Git 如何重新合并以前分支中的所有更改
所以我意识到你们中的许多人在读到这篇文章时会畏缩。。。但是我的项目有一个开发分支和一个prod分支,主要是为了防止prod密码、appsettings等被开发人员看到。我最终将我的dev分支中的一些更改合并到prod分支中,以推动准备就绪的内容,并拒绝了其他更改。这已经进行了多次提交和合并。现在的问题是,我已经准备好接受以前拒绝的一些更改,尝试合并失败,我会收到一条Git 如何重新合并以前分支中的所有更改,git,Git,所以我意识到你们中的许多人在读到这篇文章时会畏缩。。。但是我的项目有一个开发分支和一个prod分支,主要是为了防止prod密码、appsettings等被开发人员看到。我最终将我的dev分支中的一些更改合并到prod分支中,以推动准备就绪的内容,并拒绝了其他更改。这已经进行了多次提交和合并。现在的问题是,我已经准备好接受以前拒绝的一些更改,尝试合并失败,我会收到一条已更新的消息。再一次,我意识到我不应该这样做,而是使用功能分支,等等。但是现在已经太晚了,我如何强制git重新检查分支之间的差异,并
已更新的消息。再一次,我意识到我不应该这样做,而是使用功能分支
,等等。但是现在已经太晚了,我如何强制git重新检查分支之间的差异,并允许我将它们集成到我的产品分支中呢?您想要的不是合并,或者说,不是一个git合并
。git merge
所做的是三方合并。三向合并有三个输入:一个合并基和两个其他提交,通常是分支提示提交
你在评论中写道:
当我执行一个git diff--stat dev..prod时,我可以看到这两个分支之间的差异
git diff所做的是比较两次提交(而不是三次)
让我们考虑只有一个文件的情况,它可以存在两个提交,即第三个提交,即合并基。让我们也画一个小小的提交图片段:
...--B--X <-- main (HEAD)
\
Y <-- branch
在提交X
中,其内容如下:
Hello!
I am a file.
Don't panic!
Hello!
I am a changed file.
Don't panic!
Hello!
I am a file.
Don't panic!
But do remember where your towel is.
在提交Y
中,其内容如下:
Hello!
I am a file.
Don't panic!
Hello!
I am a changed file.
Don't panic!
Hello!
I am a file.
Don't panic!
But do remember where your towel is.
现在,如果我们想要合并这两个更改,我们会注意到:
- 在
B
中,第二行表示“我是一个文件”,但在两个tip提交中的其中一个中,它现在表示“我是一个已更改的文件”
- 在
B
中,只有三行,但在两个提示提交中的一行中,有一行是关于毛巾的新的第四行
为了得到合并的结果,我们需要更改第二行,然后添加新的第四行
但是如果我们将X
中的文件与Y
中的文件进行比较,我们会看到:
Hello!
-I am a changed file.
+I am a file.
Don't panic!
+But do remember where your towel is.
我们只知道第二行是不同的,第四行是加上去的
我想把dev中的差异引入prod
这是一个问题,因为从字面上看,这只是意味着“使prod
与dev
完全相同”。您可以在Git中(轻松地)实现这一点,但这可能不是您想要做的
将这些变化考虑在内的结果将是:
Hello!
I am a file.
Don't panic!
But do remember where your towel is.
也就是说,我们失去了对第2行的更改。有关这方面的更多信息,请参阅
如果您确实希望在Git中进行双向交互式合并,即,采用差异并以交互方式决定要应用哪些部分以及要忽略哪些部分,那么没有那么多内置内容。Git确实有Git add-p
:您可以从分支dev
提取文件,在其上使用Git add-p
,并以交互方式选择是应用还是跳过它。(一旦您对结果感到满意,您就可以git checkout index
使用交互补丁到索引中的工作树版本覆盖工作树版本,以便查看它。)
否则,您将面临找到合适的文件合并基础版本的问题。如果确实找到了合并库,则可以使用git merge file
执行一次一个文件的合并:
git show basecommit:path > path.base
git show dev:path > path.dev
git merge-file path path.base path.dev
git merge
所做的是使用提交历史自动找到一个合适的合并库,然后自动提取这些文件并对每个文件运行git merge file
。但是,如果您已经进行了合并,然后覆盖了这些合并的结果,则记录在历史合并库中的表示您已经决定(并记录下来供将来参考)不进行这些更改。所以现在,git merge不会接受它们。您的问题可能太模糊,无法回答。你能给我们一个图表来说明这个问题吗?当我做一个git diff--stat dev..prod时,我可以看到这两个分支之间的差异,我希望将dev中的差异引入到prod中。你考虑过合并或重定基址吗?我两个都试过了,都没有帮助。我不知道发生了什么,所以我不能提出任何建议。