了解我的git合并出了什么问题,我该如何解决?

时间:2013-12-13 17:01:32

标签: git git-merge

我有两个分支, master develop ,我无意中更新了每个分支上不同版本的第三方库。 master 分支具有最新版本的库,我希望在 develop 中使用它。

当我尝试使用 master 中的最新更改更新 develop 时,我收到了合并冲突,因此我使用了git mergetoolopendiff来处理合并。在为每个文件精心选择“选择正确”之后,此过程已完成,我已做出更改。

此时,我假设这个库的目录中的两个分支匹配,但情况并非如此。使用标准的Unix diff,我比较了两个分支中的库目录,并且文件内容存在很多差异。

有没有办法在 develop 上撤消对此特定目录的所有更改,以便它与 master 匹配?

1 个答案:

答案 0 :(得分:2)

1:通过示例

发生了什么(可能)

您只会在部件上发生冲突,即冲突

例如,假设分支A和B从该第三方库的v1开始。

然后,在分支A(develop)上放入v2,在分支B(master)上放入v3。

现在如果你将A合并到B中,反之亦然,git会将“A上发生的事情”与“B上发生的事情”进行比较。

假设某个文件F在v1-> v2中有此更改:

 la la la
 this file has some stuff
+and we added a line

但是在v3中,添加的行再次被撤消,因此文件F根本不会从v1修改为v3。

以任何方式组合分支A和B将看到一个分支改变了F而另一个分支没有改变,因此保持这种改变。

(其中v3修改了与v2相同的文件,但是以不同且相互冲突的方式,您将遇到冲突并能够选择“v3”版本。其中v3修改了完全兼容的文件方式,例如,从v1到v2的更改保留在v3中,这样v1-vs-v3与v1-vs-v2相同,你将没有冲突并且将拥有v3版本,但这与拥有v2版本。)

2:该怎么办

我不知道您是否要退出合并,或者只是检查具有最新版本库的“合并后”新树。

要退出合并,假设您尚未发布,请使用git reset(请参阅Undo a Git merge? - 小心reset --hard)。然后,您将不得不重新进行合并,包括解决第三方库之外的任何冲突。对于第三方图书馆部分,你可以作弊;请继续阅读。 (您可能希望暂时保存合并,例如,为其设置标记或额外的分支名称。然后,您可以使用与其他名称相同的方式检查各种合并文件。)

要保留合并并只添加新提交,请跳过“退出合并,然后重新执行”部分。 : - )

现在您要么处于半合并状态还是只是准备更新库,您只需要替换该目录中的所有文件(听起来它只限于某些子目录,我已经使用过了dir/with/lib3以下{。}}。为此:

git rm -r dir/with/lib3               # remove entire 3rd party library ...
git checkout master -- dir/with/lib3  # and then re-create it from master

第二个命令git checkout带有分支名称(master)和一个或多个路径(此处为dir/with/lib3),告诉git提取命名文件和/或命名分支中的目录/进入当前工作目录 - 这很重要 - 临时区域(“索引”)。

在这种情况下,对于位于master下的分支dir/with/lib3的提示中存在的每个文件,git将同时执行:

  • 将文件的master分支版本添加到索引和
  • master分支版本放在工作目录中。

(这就是为什么同样的技巧可以用来从你正在重置的早期合并中设置的临时标签或分支名称中获取已经合并的版本.Git将只提取命名文件(s) )从命名版本,通过临时区域。这使得重新合并更容易!)

最后,运行任何测试并修复回归或问题;像往常一样使用git status来确保一切准备就绪;如果是,请运行git commit提交新版本。