在rebase冲突中,如何说“使用来自分支A的文件,从主人那里吹走文件”?

时间:2016-05-25 12:41:45

标签: git github

我从github my-new-branch拉出一个分支,以便对其进行审核。它已经缩小了构建文件(我知道,我知道)。当我拉/换时,我毫不奇怪地在缩小的文件中发生冲突。

我不想手动审核缩小文件中的每个更改。我只想说“使用my-new-branch中的文件,从主文件中删除文件,继续重新定位”。

我该怎么做?

1 个答案:

答案 0 :(得分:4)

首先让我加入通常的说明:

  • git pull基本上是git fetch,后跟git mergegit rebase。当您通过--rebase或配置条目告知时,它会执行rebase而不是合并。一般来说,我更喜欢使用两个单独的命令,但对于我事先确定我想要常规合并或rebase的特定情况,我将使用git pull

    这很重要,因为在合并与rebase中,我们/他们的角色会被交换,因为......

  • git rebase本质上是一系列重复的git cherry-pick操作,在一个新的临时匿名分支上完成。一旦所有即将重新提交的提交都成功地被挑选到新的匿名分支中,Git会将您的分支标签从旧的提交链中剥离,将其粘贴到新的链上。

    这意味着当你进行变基时,你的当前分支是一个匿名分支,每个提交来自的分支--Git称之为"他们的#34;,如同{ {1}}或--theirs - 实际上是您自己的分支。 Git称之为"我们的",如-X theirs--ours的分支将是您的分支,但它还没有!特别是第一步,匿名分支指向您正在重新定位的提交,这是您(或-X ours)运行git pull时引入的新提交。换句话说,它是他们的提交,而不是你的,即使Git用git fetch引用它。

  • 相比之下,当您合并(--ours)时,Git会停留在您自己的分支上,而git merge--ours会引用您的分支-X ours --theirs指的是他们的分支。

大多数人发现我们/他们的角色交换至少有点混乱,所以如果你感到困惑,你并不孤单。我认为如果你用-X theirs练习会有所帮助,但即便如此,它仍然会很棘手。

现在,关于实际执行rebase的实际步骤。

我们假设你从分支git cherry-pick开始:

bra

接下来,您执行以下操作:

$ git checkout bra

复制$ git rebase origin/master 上已有的bra上尚未提交的任何提交,以便它们出现在origin/master的提示之后的新分支上最后,标记为origin/master

最初,你有这个:

bra

最后,您将拥有:

          E--F--G         <-- bra
         /
...--A--B--C--D           <-- origin/master

rebase的第一步是弄清楚哪些提交樱桃挑选。通常情况下,原始分支上的所有提交都不在目标&#34;上,即 E--F--G [abandoned - original bra] / ...--A--B--C--D <-- origin/master \ E'-F'-G' <-- bra EF在这种情况下

接下来,Git检查目标分支提交G的提示提交,这里作为&#34;分离的HEAD&#34; (匿名分支),并运行D命令的循环(或等效的东西:确切地使用哪个命令取决于您向git cherry-pick提供的标志)。第一个樱桃选择提交git rebase来复制E。请注意,当前提交现在是提交E'

这就是我们和他们的旗帜进来的地方。让我们来看看git cherry-pick更详细的内容,因为这是您想要解决冲突的地方。

通过将提交与其父级进行比较来开始挑选。在这种情况下,我们挑选D,因此我们将EE的父提交进行比较,即提交E。这为我们提供了逐行更改的列表:删除这些行,添加一些其他行作为替换。 Git现在尝试将此diff(作为合并)应用于当前提交,即B。请注意,从DB也有变化,因此Git实际上可以进行合并,通常会发生合并冲突和冲突解决。

我们在D文件中说BE的其中一项更改如下:

README

如果@@ ... @@ this is some context -we ditched this +and added this better line and kept this the same - 到 - B中没有出现类似的更改,Git会获取此更改的一个副本。但是,如果在D - 至 - B中,我们会改为:

D

Git声明了一个冲突:它不确定&#34;上级&#34;线条优于&#34;更好&#34;线,反之亦然。

使用@@ ... @@ this is some context -we ditched this +to put in a superior line and kept this the same -X ours告诉git在发生冲突时更喜欢哪一行。我们假设您使用-X theirs:这意味着更喜欢-X theirs - 到 - B更改。这是因为&#34;我们的&#34;更改是从EB的更改:这是我们所依赖的(匿名)分支; &#34;它们的&#34;更改是从DB的更改。

这并不意味着&#34;将整个文件&#34; 。它只表示&#34;采取更改&#34;。让我们说E - 到 - B中的其他地方,我们也更改了一些拼写,但我们从未在D - 到 - B中触及这些行。使用E进行-X theirs - 至 - B更改,但仅保留E - 至 - B更改

我们可以让Git在此时停止rebase,并手动运行:

D

或:

$ git checkout --theirs -- README

这意味着&#34;完全按照提交$ git checkout <id of commit E> -- README &#34;中的那样从提交E获取整个文件,即丢弃任何E - 至 - {{ 1}}改变。

一旦我们解决了冲突 - 自动采取&#34;他们的&#34; (B&#39; s,这是我们的)与D一起更改,或通过手动拍摄&#34;他们的&#34; (E个)文件-X theirs,并手动继续采摘樱桃的过程:

E

-Git使用已解析的git checkout --theirs进行新的提交$ git rebase --continue ,并通过执行E' - 到 - {{1来继续挑选提交README差异并应用它来提交F

根据我们提交到提交E的内容,这可能会干净利落,或者可能会出现更多合并冲突。如果这会导致更多的合并冲突,Git会按照我们的说明处理它们,就像以前一样。

最后,Git cherry-picks通过从FE'进行差异并将其应用于E'来提交G

要完成变基,Git只需将分支标签F剥离G,然后将其指向F'。提交bra现在已被放弃(尽管它们仍在您的reflog中,因此默认情况下将保留在您的存储库中至少30天。)