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

git:冲突后在索引/工作树中存储文件的不同阶段,git,conflict,git-add,Git,Conflict,Git Add,假设一个文件与git处于冲突状态 这意味着索引包含文件的3个版本,前一个版本、一个分支的版本和另一个分支的版本 我想在工作目录中签出第3版(“他们的”),在索引中签出第2版(“我们的”) --replace --cacheinfo <mode> <object> <path> 有没有一种无痛的方法可以做到这一点?诀窍在于“向索引添加一个版本”:这会将文件标记为已解决(意味着不再有“我们的”或“他们的”)。 所以这必须是最后一步 可能是这样的: git sh

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

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

我想在工作目录中签出第3版(“他们的”),在索引中签出第2版(“我们的”)

--replace --cacheinfo <mode> <object> <path> 
有没有一种无痛的方法可以做到这一点?

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

可能是这样的:

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
--cacheinfo
用于注册不在当前工作目录中的文件。这对于最小签出合并非常有用

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


也许最无痛的方式就是这样

# 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

更新索引摆弄索引应该是不必要的,除非你已经失去了
头部
(可以这么说)。

VonC:你的诀窍很好:添加会破坏索引阶段。到目前为止,我已经想出了你的解决办法!:-)一点也不无痛,不过还是要谢谢你!我更想找一些git管道命令来实现这一点,而无需存储临时文件。@Olivier:好吧,等一下Jakub或Jefromi或Charles或。。。现在随时;)您可以使用低级操作索引:请参阅
--cacheinfo
(可能使用
--replace
)和
--force remove
选项。实际上,它是“我们的”版本(来自您合并到的当前分支)、“他们的”版本(来自您合并到的分支)和“祖先”版本(两个分支的共同祖先)-通常不是以前的版本。