2009-12-08 72 views
8

我想更改一个文件在我的回购,然后强制混帐认为该文件是未合并和git status出现像这样:如何强制git认为文件未被合并?

# 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的回购是:

  • 克隆远程回购到一个新的临时混帐回购协议
  • 结帐该临时回购上次提交我们看到(保存在.piston.yml )
  • 结帐我们的本地回购(在一个新的分支),以最后一次提交,其中.piston.yml被更新
  • 我们的本地回购的文件复制到临时回购
  • 提交的临时改变一切回购(这些都是我们当地的变化为我们最后一次更新这个vendored项目)在临时回购
  • 运行git merge master与远程回购的变化
  • 忽略合并冲突(!),并复制所有的合并我们的局部变化从临时回购文件,以我们的本地回购
  • 提交这些文件(在我们的新的临时分支)我们本地回购
  • 结帐本地回购回到我们原来的出发点
  • 合并临时分支到本地回购(添加任何我们做出的进一步修改)

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

+0

请参阅“如何选择性地重新创建合并状态?”线程在Git邮件列表中:http://thread.gmane.org/gmane.comp.version-control.git/135059 – 2009-12-13 19:19:10

回答

12

在具有合并冲突的Git文件中(通常)索引中有三个版本,工作区中的版本冲突标记为diff3 -E/rcsmerge。索引中的版本是共同祖先的第1阶段,“我们”版本的第2阶段以及“他们的”版本的第3阶段。对于未合并文件,阶段0中没有版本(您可以使用git update-index --unresolve通过删除阶段0来恢复未合并状态)。

您将需要使用git ls-files --stagegit ls-tree <commit>获得的斑点(文件版本)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的邮件列表上线。

+0

合并冲突的两个文件版本位于另一个回购站中,并且可能合并了第三个版本现在。这不是问题吗? (虽然我承认我还没有完全理解你的回答。) – ScottJ 2009-12-08 22:21:49

+0

我开始明白了。我想我不得不将它设置为章鱼合并,不是吗?合并共同的祖先和供应商变更以及本地变更。这比我预想的要复杂得多,我不认为我已经准备好了。不过谢谢你的回答。 – ScottJ 2009-12-08 23:22:39

+0

没有章鱼:合并在Git中是3路合并,因此需要三个版本。我会尽量在后面提供一个例子。 – 2009-12-09 00:03:17