如何强制Git将文件视为未合并?

9

我想对我的仓库中的一个文件进行更改,然后强制git认为该文件未合并,并像这样在git status中显示:

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#       both modified:      lib/delayed/recipes.rb
#

这是我的问题的全部内容。继续阅读以获取解释,因为我知道那将是首先被问到的事情。
这里的目的是修复 Piston 的错误,它会在索引中留下合并冲突,这些冲突很容易被忽视。 piston update 在 Git 存储库中的工作方式是:
  • 将远程仓库克隆到一个新的临时git仓库中
  • 将该临时仓库检出到我们看到的最后一次提交(保存在.piston.yml中)
  • 将我们的本地仓库(在新分支中)检出到.piston.yml被更新的最后一次提交
  • 将本地仓库的文件复制到临时仓库中
  • 提交所有更改到临时仓库(这些是我们上次更新此供应商项目时的本地更改)
  • 在临时仓库中运行git merge master,将我们的本地更改与远程仓库的更改合并
  • 忽略合并冲突(!),将所有文件从临时仓库复制到我们的本地仓库
  • 将这些文件(在我们的新临时分支中)提交到我们的本地仓库
  • 将本地仓库切换回原始起点
  • 将临时分支合并到本地仓库(添加我们进一步进行的任何更改)

我希望通过允许带有合并冲突的文件提交到临时分支来解决这个问题,但在最后(运行git merge --squash之后),我想告诉git关于在临时仓库中有合并冲突的文件。


请参考 Git 邮件列表上的 "如何有选择性地重新创建合并状态?" 主题:http://thread.gmane.org/gmane.comp.version-control.git/135059 - Jakub Narębski
1个回答

12
在Git中,具有合并冲突的文件(通常)在索引中有三个版本,在工作区中有一个带有diff3 -E/rcsmerge冲突标记的版本。索引中的版本是共同祖先阶段1,我们的版本阶段2和他们的版本阶段3。对于未合并的文件,没有第0阶段的版本(您可以使用git update-index --unresolve通过删除第0阶段来恢复未合并状态)。
您需要使用git ls-files --stagegit ls-tree <commit>获取要放入索引的blob(文件版本)的SHA-1标识符,或者如果要从头开始/从工作区版本生成文件的版本,则使用git hash-object -w <file>。然后,您可以使用git update-index --index-info将高级别阶段放入索引文件中(在此之后使用git update-index --unresolvegit update-index --force-remove来填充更高的阶段以删除索引中的第0阶段)。您可以使用git checkout --conflict=merge -- <file>在工作区中重新生成带有合并标记的文件。
希望这有所帮助(HTH)。

参见:Git邮件列表上的“如何有选择地重新创建合并状态?”主题。


有合并冲突的两个文件版本在另一个仓库中,现在可能已经合并了第三个版本。这不是一个问题吗?(虽然我承认我还没有完全理解你的回答。) - ScottJ
我开始更好地理解了。我想我必须将其设置为出现为章鱼合并,对吧?合并共同祖先加供应商更改加本地更改。这比我预期的要复杂得多,我不认为我还能胜任。不过还是谢谢你的回答。 - ScottJ
没有章鱼:Git中的合并是三方合并,因此需要三个版本。我稍后会尝试举一个例子。 - Jakub Narębski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接