git:冲突后在索引/工作树中存储文件的不同阶段

时间:2010-11-03 18:31:29

标签: git conflict git-add

假设一个文件与git处于冲突状态。

这意味着索引包含3个版本的文件,前一个,一个分支,另一个分支。

我想在工作目录中查看版本3(“他们的”),并在索引中查看版本2(“我们的”)。

有没有一种无痛的方法可以做到这一点?

2 个答案:

答案 0 :(得分:4)

可能最痛苦的方式就是这样。

# Checkout 'their' version from the index into the working tree
git checkout --theirs file

# reset the index to the HEAD version, i.e 'our' branch
git reset HEAD file

除非您丢失update-index(可以这么说),否则不应该使用HEAD管道来摆弄索引。

答案 1 :(得分:1)

诀窍在于“向索引添加一个版本”:这会将文件标记为已解决(意味着不再是“我们的”或“他们的”)。
所以它需要是最后一步。

可能是这样的:

git show :3:<filename> > <filename>.theirs # save the "theirs" version in a tmp file
git show :2:<filename> > <filename>        # display the "ours" version in the working dir 
git add <filename>                         # add it to the index
                                           #  (marking the conflicting file as resolved)
move  <filename>.theirs  <filename>        # erasing the file with the "theirs" version
                                           # in the working directory

不完全“无痛”......


要避免使用临时文件,Jakub Narębski建议使用 git update index (管道命令)直接操作索引。

--replace --cacheinfo <mode> <object> <path> 
  

--cacheinfo用于注册不在当前工作目录中的文件。这对于最小结账合并非常有用。

     

默认情况下,当索引中存在文件路径时,git update-index拒绝尝试添加path/file。同样,如果存在文件path/file,则无法添加文件路径。使用--replace标志时,将自动删除与添加的条目冲突的现有条目,并显示警告消息。