git冲突可以像svn一样创建其他文件吗

时间:2019-06-26 13:38:09

标签: git svn git-merge-conflict

我在问svn功能,我想知道它是否存在于git中:

当svn发生冲突时,它会创建一些其他文件,这些文件有时很有用:

请参见https://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-dug-conflicts.html

filename.mine - my original file as it existed at the working directory.

filename.BASE_REVISION - The file which is the BASE revision before you updated your working copy. It is the file checked out before you made your latest edits.

filename.NEW_REVISION - This is the file that Subversion client just received from the server. Actually this is the file we want to merge with.

这很有用,因为有时我想将我的本地更改与base进行比较,或者将远程更改与base进行比较。或者只是选择一个文件,并将其设置为冲突的解决方案。

使用git并发生冲突,我看到工作目录中的文件已满,并带有'>>>''<<<'符号。

我可以从git中获得类似svn的类似行为,并拥有这些其他文件吗?我看过git文档,但找不到合适的东西。

有什么主意吗?

2 个答案:

答案 0 :(得分:2)

如果您想查看冲突的基本版本(如果必须询问,这是必须的),则可以通过将merge.conflictStyle设置为diff3来实现。我在git help merge中看到了这一点:

4. For conflicting paths, the index file records up to three versions: stage 1 stores
   the version from the common ancestor, stage 2 from HEAD, and stage 3 from
   MERGE_HEAD (you can inspect the stages with git ls-files -u). The working tree
   files contain the result of the "merge" program; i.e. 3-way merge results
   with familiar conflict markers <<< === >>>.

因此,使用git ls-files -u,您将获得文件列表,如果发生冲突,您将得到类似的内容:

$ git ls-files -u
  100755 ac51efdc3df4f4fd328d1a02ad05331d8e2c9111 1 hello.rb
  100755 36c06c8752c78d2aff89571132f3bf7841a7b5c3 2 hello.rb
  100755 e85207e04dfdd5eb0a1e9febbc67fd837c44a1cd 3 hello.rb

然后您可以执行以下操作:

git show :1:hello.rb # common ancestor
git show :2:hello.rb # HEAD
git show :3:hello.rb # the other branch

如果您希望将其作为文件进行分析,请使用重定向。

来自https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging的信息

答案 1 :(得分:0)

最后,我发现了一种创建这些文件的简单方法,尽管它并不简单。

git mergetool 命令生成所需的文件。如果我使用给定的冲突文件使用不存在的合并工具运行命令,它将生成类似于svn生成的基本文件,本地文件和远程文件:

git mergetool --tool whatever a.txt

给出输出:

Merging:
a.txt
Normal merge conflict for 'a.txt':
   {local}: modified file
   {remote}: modified file
Unknown merge tool whatever

现在ls显示创建了名为'a_BASE','a_LOCAL','a_REMOTE'(将进程ID添加到文件名的新文件)的新文件:

$ ls
a.txt  a_BACKUP_9348.txt  a_BASE_9348.txt  a_LOCAL_9348.txt  a_REMOTE_9348.txt