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

m0rkklqb  于 2023-03-06  发布在  Git
关注(0)|答案(3)|浏览(134)

我知道我可以通过调用

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

但这会覆盖我的工作树中的文件。2如何在合并时得到我们/他们的文件状态的文件内容而不覆盖工作树?

s2j5cfk0

s2j5cfk01#

隐藏在文档中:

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

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

ki0zmccv

ki0zmccv2#

当您调用时:

git merge-tool -- file/path

git(如果配置正确)将启动这个工具,并包含所有有用的文件版本:当前的、他们的、我们的、基本的(两个分支的公共同意者的版本中的文件)。
有许多工具可以帮助解决合并冲突:kdiff3meld我最喜欢的是beyond compare(不免费-试用有30个工作日免费-如果你不使用它不会减少试用天数)。它有“三向边缘”视图,与4子视图在左上角是ours在中间base在右theirs在底部有合并结果。
找到最适合您的工具。

k10s72fa

k10s72fa3#

您可以使用git ls-files -ugit cat-file blob的组合来检索我们/他们的不同版本。
当您遇到冲突并运行命令git ls-files -u时,它会给出一些带有 * 文件模式值 blob id stage值 * 和 * 文件名 * 的行,例如:

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

stage值为(详见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

相关问题