【问题标题】:Is there a way to merge two branches without losing files and changes?有没有办法合并两个分支而不会丢失文件和更改?
【发布时间】:2019-08-11 06:24:48
【问题描述】:

有没有办法在不丢失文件和更改的情况下合并两个分支?

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

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

B 分支包含:

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

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

【问题讨论】:

  • 嗨,您是否尝试过在每个分支上提交并先推送,然后将两个分支合并到 master(或另一个常见的分支)?

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


【解决方案1】:

您可以通过检查分支 B 并且没有工作更改来进行合并,然后运行以下命令 git merge A

结果可能需要在进行最终提交之前手动编辑文件以解决冲突。启动合并时的以下输出表明需要手动合并。

CONFLICT (content): Merge conflict in [file A] 或在文件 B 中。或两者兼而有之。

手动修复冲突,然后执行git add [file A] 以继续合并。当所有代码冲突都解决并且代码正在编译时,执行 git commit 以完成合并提交到分支 B。

【讨论】:

  • 感谢您的回复,但我这样做了,这就是问题所在,因为 git 无法识别这些冲突,它决定删除分支 A 中不存在的文件或保留来自分支 A 的文件。
  • 我在本地机器上对其进行了测试,它没有删除file C。它在文件 A 和 B 上产生了合并冲突,这是我故意通过在两个分支中编辑同一行来实现的。你的两个分支是否来自同一个根分支?我从master 做了一个分支。先创建分支A,然后再创建分支B。然后在分支A 中编辑两个文件,然后在分支B 中编辑相同的两个文件,并添加第三个文件。然后我将分支A 合并到分支B 中。抱歉,我无法提供更多帮助。
【解决方案2】:

您的根本错误在于认为git merge两个 输入——您的分支和其他一些分支。情况并非如此:它有 三个 输入,其中没有一个是 分支。三个输入是提交

让我们画一些提交,以及记住每个分支中的 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 diffs:

  • 第一个将提交 * 中的快照与提交 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 行,那么您会遇到合并冲突 — 您必须完成合并作业并生成 @ 987654354@你自己。

(如果文件CAB 之一中,但不在另一个中,则文件C 必须要么已创建-since-* 要么已删除-since-* . Merge 通过获取新文件将 create new filenothing 结合。它通过以下方式将 remove old filesnothing 结合删除旧文件。根据您的文本描述,C 必须退出 *,为您提供 删除文件 操作。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2011-09-21
    • 1970-01-01
    • 2022-11-02
    • 2020-04-01
    相关资源
    最近更新 更多