Git 如何重新合并以前分支中的所有更改

Git 如何重新合并以前分支中的所有更改,git,Git,所以我意识到你们中的许多人在读到这篇文章时会畏缩。。。但是我的项目有一个开发分支和一个prod分支,主要是为了防止prod密码、appsettings等被开发人员看到。我最终将我的dev分支中的一些更改合并到prod分支中,以推动准备就绪的内容,并拒绝了其他更改。这已经进行了多次提交和合并。现在的问题是,我已经准备好接受以前拒绝的一些更改,尝试合并失败,我会收到一条已更新的消息。再一次,我意识到我不应该这样做,而是使用功能分支,等等。但是现在已经太晚了,我如何强制git重新检查分支之间的差异,并

所以我意识到你们中的许多人在读到这篇文章时会畏缩。。。但是我的项目有一个开发分支和一个prod分支,主要是为了防止prod密码、appsettings等被开发人员看到。我最终将我的dev分支中的一些更改合并到prod分支中,以推动准备就绪的内容,并拒绝了其他更改。这已经进行了多次提交和合并。现在的问题是,我已经准备好接受以前拒绝的一些更改,尝试合并失败,我会收到一条
已更新的消息。再一次,我意识到我不应该这样做,而是使用
功能分支
,等等。但是现在已经太晚了,我如何强制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中。你考虑过合并或重定基址吗?我两个都试过了,都没有帮助。我不知道发生了什么,所以我不能提出任何建议。