我将专注于我感兴趣的这个问题的子集:我有两个分支,我想将一个文件伪合并到另一个文件中。
(我说“伪合并”是因为我不需要或不希望合并提交;我只想以我认为合适的方式合并文件两个版本的贡献。)
我的方法基于https://stackoverflow.com/a/39916536/341994.不幸的是,这个问题是重复的(在我看来,这是错误的:它不是这个问题的重复,回答和重复是错误的,这是回答者在那里做的)。但这个答案有一些问题,所以我已经现代化并清理了方法。我使用恢复而不是签出和重置,并且我不必提交任何不需要的东西。
好吧,假设我有三个文件:
$ ls
a b f
但我只想伪合并其中一个,a,来自另一个分支。让我们看看他们,看看情况会是什么样子。这是我的版本:
$ cat a
line one
line two
line three
line four
line five
以下是其他分支机构的版本:
$ git show otherbranch:a
line one
line two edited
line three
line four
line five
line six
现在这里的技巧是,我们将使用索引作为草稿(毕竟,这是它的用途)。因此,我们首先(步骤1)确保将我们的版本复制到索引中:
$ git add a
现在(步骤2)我们可以使用restore从其他分支获取版本(现在,restore比checkout更好,因为它可以让我们更清楚地说话):
$ git restore --source otherbranch a
乍一看,这看起来很糟糕。我们现在已经用其他分支的版本完全覆盖了我们的a,如您所见:
$ cat a
line one
line two edited
line three
line four
line five
line six
但别担心!如您所见,以前版本的仍在索引中:
$ 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)。我们将文件从工作树添加到索引中进行交互式补丁。
我们可以说git add-p a来启动交互式补丁程序,在这种情况下,我们一次只能得到一个大块。但在这种情况下,只有一个帅哥,我无论如何都想编辑它,所以我说:
$ git add --e a
结果是我们在编辑器中打开了一个diff补丁文件!它看起来像这样:
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的另一个分支版本仍然位于工作树中:
$ cat a
line one
line two edited
line three
line four
line five
line six
我们喜欢的版本在索引中,记得吗?为了实现这一点,(步骤4)我们只需简单地调用gitrestore(同样,这是现代的方式;restore比reset更好,可以应用于单个文件):
$ git restore a
现在我们的a是正确的,我们都完成了:
$ cat a
line one
line two
line three
line four
line five
line six
我们现在可以承诺,但我们不必;我们已经完成了既定目标。