Git:在合并过程中获取我们/他们的文件内容

11

我知道通过调用可以获取我们/他们的状态

git checkout --ours/--theirs -- path/to/my/file.txt

但这将覆盖我工作树中的文件。在合并过程中如何获取我们的/他们的文件状态的文件内容,而不覆盖工作树

3个回答

23

文档中隐藏的信息:

git show :1:file/path   # base
git show :2:file/path   # ours
git show :3:file/path   # theirs

当由于merge操作触发合并冲突时,HEAD仍指向原始提交,MERGE_HEAD指向尝试合并的提交,因此:

git show HEAD:file/path        # ours
git show MERGE_HEAD:file/path  # theirs

这也能起作用,并且可能对用户更加明确。


3
如果可以使用git checkout --ours file,那么应该也有类似的方法可以使用git show --ours file。这是一个关于不良设计的评论。 - Andy
值得注意的是,这些似乎只能使用相对路径在存储库中工作,而不能使用绝对路径。 - Benjohn

0

当你在调用时:

git merge-tool -- file/path

如果正确配置,git 将使用所有有用的文件版本启动此工具:当前版本、theirs 版本、ours 版本和 base 版本(两个分支的共同祖先版本)。

有许多工具可帮助解决合并冲突:kdiff3meld。我最喜欢的是 beyond compare(非免费 - 试用期为 30 个工作日 - 如果您不使用它,它不会减少试用天数)。它有“三方合并”视图,在顶部的 4 个子视图中,左侧是 ours,中间是 base,右侧是 theirs,底部是合并结果。

找到最适合您的工具。


0
您可以使用 git ls-files -ugit cat-file blob 的组合来检索不同的我们/他们版本。

当您遇到冲突并运行命令git ls-files -u时,它会显示一些带有文件模式值blob id阶段值文件名的行,例如以下内容:

$ git ls-files -u
100644 ad5e6cfb620eb3086a399bd8dd63f039fa120358 1       .gitignore
100644 73dab4ca75450b2aeb048a5e5632011d95064e58 2       .gitignore
100644 12c32798081dd59a51295275ce1119f5d1662422 3       .gitignore
$

舞台值为(详情请参阅 git-read-tree(1)):
0 Normal, no conflict
1 Common ancestor
2 Current branch (version merged on to)
3 The other branch (version merged from)

所以,给定 blob id 后,您可以使用 git cat-file blob 命令检索相应的文件内容,例如:
$ git cat-file blob ad5e6cfb620eb3086a399bd8dd63f039fa120358 > .gitignore.common-base
$

以上是我的脚本git-resolve-conflict-using-kdiff3的操作基础,它会自动执行上述操作,并为每个冲突文件提供启动KDiff3的所有贡献版本的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接