如何强制git认为文件未合并?

时间:2009-12-08 20:11:23

标签: git ruby-piston

我想对我的仓库中的文件进行更改,然后强制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的提交
  • 将我们当地的repo文件复制到temp repo
  • 提交temp repo中的所有更改(这些是我们上次更新此出售项目时的本地更改)
  • 在临时仓库中运行git merge master以将我们的本地更改与远程仓库的更改合并
  • IGNORE MERGE CONFLICTS(!)并将temp repo中的所有文件复制到我们的本地仓库
  • 将这些文件(在我们的新临时分支中)提交到我们的本地仓库
  • 将当地回购结帐回原始起点
  • 将temp分支合并到本地仓库(添加我们所做的任何进一步更改)

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

1 个答案:

答案 0 :(得分:12)

在Git文件中,合并冲突(通常)索引中有三个版本,工作区中的版本包含diff3 -E / rcsmerge冲突标记。索引中的版本是来自共同祖先的第1阶段,第二阶段是“我们的”版本,第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 --unresolve,或者在填充更高阶段以从索引中删除阶段0之前git update-index --force-remove。您可以使用git checkout --conflict=merge -- <file>在工作区中使用合并标记重新生成文件。

HTH(希望有帮助)


另请参阅:How to selectively recreate merge state?”Git邮件列表上的帖子。