我将专注于我感兴趣的这个问题的子集:我有两个分支,我想将一个文件从一个文件伪合并到另一个文件中。
(我说“伪合并”是因为我不需要或不想要合并提交;我只想以我认为合适的方式组合文件的两个版本的贡献。)
我的方法基于https://stackoverflow.com/a/39916536/341994中采用的方法。不幸的是,该问题已作为重复项关闭(错误地,在我看来:它不是该问题的重复项,并且回答者在那里所做的回答和关闭重复项是错误的)。但是这个答案有一些问题,所以我对方法进行了现代化和清理。而不是checkout
and reset
,我使用restore
, 并且我不会费心去做任何我不需要做的事情。
好的,想象一下我有三个文件:
$ ls
a b f
但我只想伪合并其中一个,a
,来自otherbranch
。让我们看看他们,看看情况会是什么样子。这是我的版本:
$ cat a
line one
line two
line three
line four
line five
这是otherbranch的版本:
$ git show otherbranch:a
line one
line two edited
line three
line four
line five
line six
现在这里的技巧是我们将使用索引作为便签本(毕竟,这就是它的用途)。因此,我们从确保将我们的版本复制到索引中开始(步骤 1):
$ git add a
现在(第 2 步)我们可以使用restore
从以下位置获取版本otherbranch
(现在,这restore
比checkout
它让我们说得更清楚):
$ git restore --source otherbranch a
乍一看,这看起来很糟糕。我们现在已经完全用来自的版本覆盖了我们的 a otherbranch
,如您所见:
$ cat a
line one
line two edited
line three
line four
line five
line six
但不用担心!之前版本的 a 仍在索引中,如您所见:
$ git diff a
diff --git a/a b/a
index abf51fa..333614b 100644
--- a/a
+++ b/a
@@ -1,6 +1,7 @@
line one
-line two
+line two edited
line three
line four
line five
+line six
很好,现在我们已经为关键动作做好了准备(步骤 3)。我们对从工作树到索引的文件进行交互式补丁。 add
我们可以说git add -p a
开始交互式补丁过程,在这种情况下,我们一次只吃一大块。但在这种情况下,只有一个大块,我还是想编辑它,所以我说:
$ git add --e a
结果是我们在编辑器中打开了一个差异补丁文件!它看起来像这样:
line one
-line two
+line two edited
line three
line four
line five
+line six
通过仔细编辑,我们现在可以决定我们想要接受哪些部分以及我们不接受哪些部分。让我们接受“第六行”而不是“第二行已编辑”。所以我们编辑成这样:
line one
line two
line three
line four
line five
+line six
我们关闭编辑器并将补丁应用于 a 的索引版本。但我们还没有完成!a的otherbranch
版本仍在工作树中:
$ cat a
line one
line two edited
line three
line four
line five
line six
我们喜欢的版本在索引中,记得吗?为了得到它,(第 4 步)我们只需调用git restore
简单明了的方法(同样,这是现代方式;比单个文件restore
更好reset
并且可以应用于单个文件):
$ git restore a
现在我们的 a 是正确的,我们都完成了:
$ cat a
line one
line two
line three
line four
line five
line six
此时我们可以提交,但我们不必这样做;我们已经完成了我们打算完成的事情。