有没有一种方法可以合并两个分支而不丢失文件和更改?

时间:2019-03-20 14:11:46

标签: git merge git-merge merge-conflict-resolution git-merge-conflict

有没有一种方法可以合并两个分支而不丢失文件和更改?

我有这种情况:
分支A包含:

  • 文件A (不同于分支B的文件A)
  • 文件B (与分支B中的文件B不同)

分支B包含:

  • 文件A
  • 文件B
  • 文件C

现在,我想将分支A合并到分支B,问题是当我尝试这样做时,分支B的所有更改都将被忽略,甚至文件C也被删除了。如何做到这一点而又不丢失分支A和分支B的更改?因为git没有显示这些文件之间的任何冲突。

2 个答案:

答案 0 :(得分:0)

您可以通过签出分支B并进行有效更改来进行合并,然后运行以下命令HashMap

结果可能需要手动编辑文件才能解决冲突,然后再执行最终提交。启动合并时,以下输出将表明需要手动合并。

git merge A或文件B中的文件。

手动解决冲突,然后执行CONFLICT (content): Merge conflict in [file A]继续进行合并。当所有代码冲突都已解决并且代码正在编译时,请执行git add [file A]以完成合并提交到分支B中。

答案 1 :(得分:0)

您在这里的基本错误在于认为git merge具有两个输入-您的分支和其他某个分支。情况并非如此:它具有三个输入,都不是分支。三个输入是 commits

让我们绘制一些提交,以及记住每个分支中的 last 提交的分支名称:

          o--o--A   <-- branch-A
         /
...--o--*
         \
          o--o--B   <-- branch-B

如果您运行git checkout branch-A,则得到的是 commit A,因为名称branch-A指向该特定的提交。 git checkout branch-B也是如此。比较这两个提交会显示某些文件中的某些差异。确实很重要,但是并不是那么多

从提交A开始,我们可以向后工作(就像git log一样)到一个未命名的提交,然后是另一个未命名的提交,然后再提交*。从B,我们可以做同样的事情,如果这样做,我们也将提交*。因此,提交*(建议的合并操作的合并基础)是最佳通用提交,这是同时在 上的最佳提交分支。

合并的方式是运行两个 git diff

  • 第一个将提交*中的快照与提交A中的快照进行比较,以查看有人对该路径进行了更改。
  • 第二个命令将提交*中的快照与提交B中的快照进行比较,以查看有人对该路径进行了更改。

然后Git 组合这两组更改。如果没有冲突,则产生的组合更改将从提交* 应用于快照

已经组合了两组更改,并正确地应用了它们(或Git可以确定的正确程度),Git继续进行了一次新提交,主要是采用通常的方式。新提交使您签出的任何分支(两个分支-A或分支-B名称之一)得到更新,以指向新的提交。新提交具有两个父级,分别是提交AB。所以最终结果是:

          o--o--A
         /       \
...--o--*         M   <-- branch-<whichever> (HEAD)
         \       /
          o--o--B

移动的任何分支名称​​ 仍指向AB

新合并提交M中的快照是来自*的快照,加上两组更改。如果A并未从*进行任何更改,但是B却从*进行了更改,您将得到B的更改。如果A确实进行了某些更改而B没有进行任何更改,则您将得到A的更改。如果两者都更改了 same 文件的 same 行,则 then 会导致合并冲突-您必须完成合并工作并进行{ {1}}自己。

(如果文件M位于CA中的一个中,但不在另一个中,则文件B必须是自-{{1 }}或删除以来的C。合并通过获取新文件将创建新文件没有合并在一起,并合并删除旧文件什么都没有。给出您的文字描述后,*必须在*退出,以执行删除文件操作。 )