Git 狐步合并:如何解决

Git 狐步合并:如何解决,git,bitbucket,git-merge,git-pull,Git,Bitbucket,Git Merge,Git Pull,我一直在从事一个项目,并一直在将代码推送到远程git存储库上的开发分支。同时,在我需要获取的主分支中引入了一些更改。因此,我采用了以下路线: 1-git签出主机 2吉特拉力 3-git签出我的开发分支 4-git合并主机 现在,当我将对pull请求的更改提交到master中时,它表明我执行的合并是foxtrot合并。我是否应该恢复或重置此较早的合并提交,然后手动从主服务器获取这些更改。或者是否有其他解决方案 目前,我一直希望在合并之前恢复到提交,但本文“”呈现了一幅相当阴暗和复杂的画面。我不希望

我一直在从事一个项目,并一直在将代码推送到远程git存储库上的开发分支。同时,在我需要获取的主分支中引入了一些更改。因此,我采用了以下路线: 1-git签出主机 2吉特拉力 3-git签出我的开发分支 4-git合并主机

现在,当我将对pull请求的更改提交到master中时,它表明我执行的合并是foxtrot合并。我是否应该恢复或重置此较早的合并提交,然后手动从主服务器获取这些更改。或者是否有其他解决方案

目前,我一直希望在合并之前恢复到提交,但本文“”呈现了一幅相当阴暗和复杂的画面。我不希望这是一项如此复杂的任务。 这个答案()足够好吗?
谢谢大家。

首先,您列出的命令本身不会导致“狐步合并”。(另请参阅)如果您有其中一个,您必须在自己提交
master
后,通过
git pull
master
运行
git merge
origin/master
。(这个make-a-commit-on-your-own-
master
部分在命令序列中没有显示。)

在任何情况下,您都不想恢复合并。这将保留合并,并添加另一个提交,该提交具有撤消合并对源的影响的效果。正是这第二个非合并提交导致了链接kernel.org页面中的后续混乱。如果执行此还原,则最终将进行foxtrot合并,然后进行更多的提交(包括还原),然后执行稍后要重新合并合并的操作。所以狐步舞仍然存在

总的来说,狐步合并并不是那么糟糕。他们只是让主线作为特征的第二个父对象,而不是作为特征的第一个父对象,但是谁能说哪一条线首先是主线呢?如果你改变你的视角,也许你的特征毕竟是主线,而其他人一直称之为“主线”的东西实际上是次要特征。这就是狐步舞合并的全部内容:视角的改变,声称你是主线,他们是次要特征

但如果你不喜欢,唯一真正的解决办法就是重写你自己的历史。因为这是你的历史记录,你的合并声明你的提交是你的主线,这可能是好的,不仅对你,对其他人也一样。如果获得您的提交的所有其他人您的历史记录尚未依赖并建立在这些提交的基础上,这是可以的。如果他们依赖于这些承诺,并且在这些承诺的基础上继续努力,那么可能仍然可以:在你重写自己的历史记录之后,所有其他同事或同事都可以重做他们的工作吗

如果所有这些都是真的,如果没有其他人依赖您的历史,或者所有依赖您的历史的人都愿意做更多的工作,以便他们能够处理您对您的历史的重写,那么您要做的很清楚:从
主控器中删除您的狐步合并。这需要仔细使用
git reset
,了解git分支的实际工作方式、
git merge
的功能以及分支名称如何不是关键。关键是提交图

进行新的提交会添加到图形中,并更新您“在上”的分支名称,即
git status
显示“在分支上”\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。新提交的父级是单数的,在大多数提交的情况下,它是以前分支的尖端。如果新提交是合并提交,则新提交的父级(复数)是之前(通常)是分支尖端的提交,然后作为第二个父级,是您在说要合并时指定的提交

也就是说,Git中的分支只是一个提交链:

... <-F <-G <-H   <--master
这就是树枝生长的方式

当您使用
git reset
(以正确的方式)时,您会告诉git:Change
master
,这样它就不会指向我的新提交
I
,而是指向
H
。Commit
I
实际上并没有消失:它仍然在那里,像以前一样漂浮在空间中。但是如果
master
是它的唯一名称,那么现在很难找到它的散列ID(你记住了吗?:-))而不是
master
指向
I
I
指向
H
,现在你有了:

             I
            /
...--F--G--H   <-- master
您可以通过合并您自己的
功能/tall
,向主控添加一个新提交,甚至可能是一整串提交:

             K--L   <-- feature/tall
            /    \
...--F--G--H------M   <-- master
            \
             I--J   <-- origin/master
他们的
J
现在是一个分支,就像你的
特征/tall
,因为主线是沿着主线运行的
N
M
H
G
F
,…,沿着主线直接返回第一代父母的顺序

如果您想将主线视为通过
J
返回,则必须完全消除merge
M
。这需要使您的
master
再次指向
H
。您可以通过以下方式执行此操作:

git checkout master
git reset --hard <hash-of-H>
现在,您需要做的就是将
master
向前和向下滑动到
J
,您可以使用
git merge--ff only origin/master

...--F--G--H   <-- master
            \
             I--J   <-- origin/master
             K--L   <-- feature/tall
            /
...--F--G--H
            \
             I--J   <-- master, origin/master
让您的Git调用他们的Git,像往常一样通过哈希ID获取任何新提交,然后根据您的
源代码/*
名称更新它们。是
fetch
获取他们的提交并更新您的远程跟踪名称,您的
origin/*

当您运行
git merge--no ff
,或者让Bitbucket或GitHub为您执行此操作时,将创建一个新的提交,该提交将自动获取一个新的、唯一的哈希ID,而新的合并提交将记录第一个父级(即“主线”)和第二个pare
             K--L   <-- feature/tall
            /    \
...--F--G--H------M--N   <-- master
            \       /
             I-----J   <-- origin/master
git checkout master
git reset --hard <hash-of-H>
               L   <-- feature/tall
              / \
             K ,-M-----N
            /_/       /
...--F--G--H   <-------- master
            \       /
             I-----J   <-- origin/master
             K--L   <-- feature/tall
            /
...--F--G--H   <-- master
            \
             I--J   <-- origin/master
             K--L   <-- feature/tall
            /
...--F--G--H
            \
             I--J   <-- master, origin/master
             K--L   <-- feature/tall
            /
...--F--G--H--I--J   <-- master, origin/master
git fetch