我从github my-new-branch
拉出一个分支,以便对其进行审核。它已经缩小了构建文件(我知道,我知道)。当我拉/换时,我毫不奇怪地在缩小的文件中发生冲突。
我不想手动审核缩小文件中的每个更改。我只想说“使用my-new-branch
中的文件,从主文件中删除文件,继续重新定位”。
我该怎么做?
答案 0 :(得分:4)
首先让我加入通常的说明:
git pull
基本上是git fetch
,后跟git merge
或git 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
,E
和F
在这种情况下
接下来,Git检查目标分支提交G
的提示提交,这里作为&#34;分离的HEAD&#34; (匿名分支),并运行D
命令的循环(或等效的东西:确切地使用哪个命令取决于您向git cherry-pick
提供的标志)。第一个樱桃选择提交git rebase
来复制E
。请注意,当前提交现在是提交E'
。
这就是我们和他们的旗帜进来的地方。让我们来看看git cherry-pick
更详细的内容,因为这是您想要解决冲突的地方。
通过将提交与其父级进行比较来开始挑选。在这种情况下,我们挑选D
,因此我们将E
与E
的父提交进行比较,即提交E
。这为我们提供了逐行更改的列表:删除这些行,添加一些其他行作为替换。 Git现在尝试将此diff(作为合并)应用于当前提交,即B
。请注意,从D
到B
也有变化,因此Git实际上可以进行合并,通常会发生合并冲突和冲突解决。
我们在D
文件中说B
到E
的其中一项更改如下:
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;更改是从E
到B
的更改:这是我们所依赖的(匿名)分支; &#34;它们的&#34;更改是从D
到B
的更改。
这并不意味着&#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通过从F
到E'
进行差异并将其应用于E'
来提交G
。
要完成变基,Git只需将分支标签F
剥离G
,然后将其指向F'
。提交bra
现在已被放弃(尽管它们仍在您的reflog中,因此默认情况下将保留在您的存储库中至少30天。)