我非常喜欢git add -p
和git 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设法将第二阶段放在这个索引中,并将第三阶段放在工作回购中......但我不知道如何做到这一点,所以我手工完成。 : - (
答案 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
- 保存藏匿点会更乏味,但可能会做你想要的。