如何将一个 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-base
和 Bob
.
之间的区别
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 中的合并是关于合并提交,而不是合并所有文件内容。
我有一个 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
.
现在如果 Bob 运行 git diff agreed-base
,他会看到他对 IndexConteoller.java 的更改,但不会看到 Alice 的;如果 Alice 运行它,她仍然只会看到她对 pom.xml.
最后,似乎让您感到困惑的部分:爱丽丝跑 git merge -X theirs Bob
。这会查找 Bob 所做的所有更改,并将它们应用到 Alice 的代码之上。一种看待这个问题的方法是合并命令正在查看 agreed-base
和 Bob
.
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 中的合并是关于合并提交,而不是合并所有文件内容。