我知道我可以通过调用
git checkout --ours/--theirs -- path/to/my/file.txt
但这会覆盖我的工作树中的文件。2如何在合并时得到我们/他们的文件状态的文件内容而不覆盖工作树?
s2j5cfk01#
隐藏在文档中:
git show :1:file/path # base git show :2:file/path # ours git show :3:file/path # theirs
当合并冲突因为merge动作而被触发时,HEAD仍然指向原始提交,而MERGE_HEAD指向试图被合并的提交,因此:
merge
HEAD
MERGE_HEAD
git show HEAD:file/path # ours git show MERGE_HEAD:file/path # theirs
也会起作用,并且可能对用户更明确。
ki0zmccv2#
当您调用时:
git merge-tool -- file/path
git(如果配置正确)将启动这个工具,并包含所有有用的文件版本:当前的、他们的、我们的、基本的(两个分支的公共同意者的版本中的文件)。有许多工具可以帮助解决合并冲突:kdiff3,meld我最喜欢的是beyond compare(不免费-试用有30个工作日免费-如果你不使用它不会减少试用天数)。它有“三向边缘”视图,与4子视图在左上角是ours在中间base在右theirs在底部有合并结果。找到最适合您的工具。
kdiff3
meld
beyond compare
ours
base
theirs
k10s72fa3#
您可以使用git ls-files -u和git cat-file blob的组合来检索我们/他们的不同版本。当您遇到冲突并运行命令git ls-files -u时,它会给出一些带有 * 文件模式值 、 blob id 、 stage值 * 和 * 文件名 * 的行,例如:
git ls-files -u
git cat-file blob
$ 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。
3条答案
按热度按时间s2j5cfk01#
隐藏在文档中:
当合并冲突因为
merge
动作而被触发时,HEAD
仍然指向原始提交,而MERGE_HEAD
指向试图被合并的提交,因此:也会起作用,并且可能对用户更明确。
ki0zmccv2#
当您调用时:
git(如果配置正确)将启动这个工具,并包含所有有用的文件版本:当前的、他们的、我们的、基本的(两个分支的公共同意者的版本中的文件)。
有许多工具可以帮助解决合并冲突:
kdiff3
,meld
我最喜欢的是beyond compare
(不免费-试用有30个工作日免费-如果你不使用它不会减少试用天数)。它有“三向边缘”视图,与4子视图在左上角是ours
在中间base
在右theirs
在底部有合并结果。找到最适合您的工具。
k10s72fa3#
您可以使用
git ls-files -u
和git cat-file blob
的组合来检索我们/他们的不同版本。当您遇到冲突并运行命令
git ls-files -u
时,它会给出一些带有 * 文件模式值 、 blob id 、 stage值 * 和 * 文件名 * 的行,例如:stage值为(详见git-read-tree(1)):
因此,给定blob id后,您可以使用
git cat-file blob
检索相应的文件内容,例如:以上是我的脚本git-resolve-conflict-using-kdiff3的操作基础,它会自动执行以上操作,并为您提供一个选择,即为每个冲突的文件启动包含所有贡献版本的KDiff3。