如何将一个 git 分支强行合并到另一个分支

How can I forcefully merge one git branch into another

我有一个 git 存储库“ui”,它有两个分支 - master 和 tip。

随着时间的推移,master 和 tip 逐渐分开,所以我所做的是 - 在分支 master

git reset --hard tip

在此之后,当我执行 git diff tip 时,git 没有显示任何差异。

现在,我更改了 master 分支中的一个文件 - pom.xml 这是一个 maven 文件。 我在 pom.xml on master.

中更改了版本

现在,当我执行 git diff tip 时,我看到了 master 和 tip 的区别。

我提交了这个并推送给 master。

现在,我查看了提示 git checkout tip 我做了一个 git diff master,master 和 tip 上的 pom.xml 之间的区别是可见的。

我在 tip 上修改了一个控制器(源代码)文件,提交并推送到 tip。当我执行 git diff 时,可以看到两个更改 - 1. pom.xml 2. 代码更改。

现在,我查看了 master 并执行了以下命令 - git merge -X theirs tip 这合并了控制器文件,但没有合并 pom.xml,当我执行 git diff tip 时,这再次显示 pom.xml 文件中的差异。

合并命令的行为是什么?我怎样才能强制 git 也合并 pom.xml?

如果您了解 git 试图实现的目标,那么这里发生的一切都是完全合乎逻辑的。

与其在具有抽象名称的 b运行ch 之间来回切换,不如假设您有两个开发人员 Alice 和 Bob,每个人都在使用他们的名字在 b运行ch 上工作。

随着时间的推移,Alice 的代码与 Bob 的代码有所不同,因此在 b运行ch Alice 她 运行:

git reset --hard Bob

在此之后,当她 运行 git diff Bob 时 git 没有显示任何差异,因为两个 b运行ches 指向完全相同的提交。让我们想象一下他们的第三个 b运行ch 指向这个,称为“同意的基础”。

现在,Alice 在她的 b运行ch 中更改了一个文件 - pom.xml

现在,当她运行 git diff Bob 时,她将看到她所做的更改,这在 Bob 的 b运行ch 上没有进行。如果 Bob 在检查了他的 b运行ch 后运行 git diff Alice,他也会看到这个变化——不管是谁的变化,它目前是两个 b运行 之间的差异国际象棋

如果两个开发人员 运行 git diff agreed-base,Alice 会看到她的变化,但 Bob 不会看到任何变化,因为他的 b运行ch 仍然与那个基础相同。

接下来,Bob 更改了一些代码(比方说 IndexController.java)并在他的 b运行ch 上提交了更改。现在 pom.xml 和 IndexController.java 在两个 b运行 之间是不同的,所以如果他们使用 git diff.

,Alice 和 Bob 都会看到

现在如果 Bob 运行 git diff agreed-base,他会看到他对 IndexConteoller.java 的更改,但不会看到 Alice 的;如果 Alice 运行它,她仍然只会看到她对 pom.xml.

的更改

最后,似乎让您感到困惑的部分:爱丽丝跑 git merge -X theirs Bob。这会查找 Bob 所做的所有更改,并将它们应用到 Alice 的代码之上。一种看待这个问题的方法是合并命令正在查看 agreed-baseBob.

之间的区别

Bob 没有更改 pom.xml,因此该文件没有任何变化;他更改了 IndexController.java,因此该文件被合并。如果 Alice 也更改了该文件,-X theirs 选项将放弃她的更改,但由于她没有更改,因此它没有任何效果。

现在,当 Alice 运行 git diff Bob 时,她看到了 pom.xml 的变化,这是她所做的,而 Bob 没有;她不再看到 IndexController.java 的变化,因为这在两个 b运行 中都是一样的。如果她运行 git diff agreed-base,她将看到 both 变化,因为她的 b运行ch 现在包含 pom.xml 和 IndexController.java 的新版本]

tip 分支不包含任何更改 pom.xml 文件的提交。因此当合并到 master 分支时,没有理由修改这个文件。

如果您希望 master 具有与 tip 完全相同的内容,您已经知道答案了:使用 git reset --hard tip.

编辑:也许混淆在于 Git 中的合并是关于合并提交,而不是合并所有文件内容。