有没有一种方法可以合并两个分支而不丢失文件和更改?
我有这种情况:
分支A包含:
分支B包含:
现在,我想将分支A合并到分支B,问题是当我尝试这样做时,分支B的所有更改都将被忽略,甚至文件C也被删除了。如何做到这一点而又不丢失分支A和分支B的更改?因为git没有显示这些文件之间的任何冲突。
答案 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名称之一)得到更新,以指向新的提交。新提交具有两个父级,分别是提交A
和B
。所以最终结果是:
o--o--A
/ \
...--o--* M <-- branch-<whichever> (HEAD)
\ /
o--o--B
移动的任何分支名称 仍指向A
或B
。
新合并提交M
中的快照是来自*
的快照,加上两组更改。如果A
并未从*
进行任何更改,但是B
却从*
进行了更改,您将得到B
的更改。如果A
确实进行了某些更改而B
没有进行任何更改,则您将得到A
的更改。如果两者都更改了 same 文件的 same 行,则 then 会导致合并冲突-您必须完成合并工作并进行{ {1}}自己。
(如果文件M
位于C
和A
中的一个中,但不在另一个中,则文件B
必须是自-{{1 }}或删除以来的C
。合并通过获取新文件将创建新文件与没有合并在一起,并合并删除旧文件删除旧文件后,什么都没有。给出您的文字描述后,*
必须在*
退出,以执行删除文件操作。 )