git stash和编辑的帅哥

时间:2010-10-30 10:58:42

标签: git conflict git-stash git-add

我非常喜欢git add -pgit stash但我偶尔会遇到以下问题,这些问题可通过以下命令序列重现:

  • git add -p my_file:然后我手动编辑一个大块(使用e),因为git建议的拆分不适合我
  • git stash --keep-index:然后我做了一些测试,如果测试通过我不提交
  • git stash pop:现在问题出现了:文件my_file 现在被认为是冲突的,而git已完全搞砸了我编辑过的hunk,所以我必须编辑文件,删除无用的合并标记,然后运行git add my_file,然后运行git reset HEAD

我很困惑,因为只有在手动编辑大块时才会发生这种情况。我不知道这应该如何产生任何不同。


重现问题:

  • touch newfile
  • git add newfile
  • git commit -m 'newfile'
  • 在文件中添加两行
  • git add -p newfile
  • 编辑大块(e),删除大块中的一行,然后退出git add(q
  • git stash --keep-index
  • git stash pop

现在文件newfile处于未合并状态。请注意,问题仅在手动编辑的帅哥中出现。如果没有手动编辑任何块,上面的命令没有任何问题。

顺便提一下,文件的前面的状态是在第三阶段(git show :3:newfile),而先前阶段的版本是在第二阶段(git show :2:newfile)。因此,我可以通过一些git black magic设法将第二阶段放在这个索引中,并将第三阶段放在工作回购中......但我不知道如何做到这一点,所以我手工完成。 : - (

3 个答案:

答案 0 :(得分:7)

要创建和测试包含部分工作树更改的索引,包括手动编辑的帅哥,请执行以下操作:

git add --patch <files>

git stash --keep-index

<test the indexed changes>

git reset --hard

git stash pop --index

此时没有冲突,存储库,索引和工作目录处于git stash之前的状态。您现在可以git commit索引更改。

当然,这很奇怪而且不太直观,我真的想知道是否有更简单的方法来做到这一点。

答案 1 :(得分:4)

我在git邮件列表中问了这个问题。我所描述的是预期的行为。这不是一个错误。 : - (

这是我得到的答案:

  

如果你没有手动编辑大块,每个大块都会在   状态HEAD或状态A,并在HEAD和A之间应用差异   这样的文件将是no-op(已应用的hunk)或a   成功申请。

对我而言,这是git add --patch的严重限制,我不明白这种行为对任何人都有用,但我会学会忍受它。

答案 2 :(得分:2)

git stash --keep-index会保留您的索引,但它仍会将索引内容添加为存储的一部分。

尝试git stash save -p - 保存藏匿点会更乏味,但可能会做你想要的。