我非常喜欢 git add -p
和 git stash
但我偶尔会遇到以下问题,可以通过以下命令序列重现:
git add -p my_file
:然后我手动编辑一个大块头(使用e
)因为git建议的拆分不适合我git stash --keep-index
:然后我做一些测试,如果测试通过,我不提交git stash pop
:现在问题出现了:文件my_file
现在被认为是冲突的,而 git 已经完全弄乱了我的编辑hunk,所以我必须编辑文件,删除无用的 merge 标记,然后运行 git add my_file
,然后运行 git reset HEAD
我很困惑,因为只有在手动编辑大块头时才会发生这种情况。我完全看不出这应该有什么不同。
重现问题:
触摸新文件
git add newfile
git commit -m 'newfile'
- 在文件中添加两行
git add -p newfile
- 编辑 hunk (
e
),删除 hunk 中的一行,然后退出 git add (q
) git stash --keep-index
git stash pop
现在文件 newfile
处于未 merge 状态。再次注意,问题只发生在手动编辑的 hunk 上。如果不手动编辑任何 block ,则上述命令没有任何问题。
顺便说一下,文件的前一个状态是在第三阶段(git show :3:newfile
),而前一个阶段的版本是在第二阶段(git show :2 :新文件
)。所以我可以,通过一些 git 黑魔法,设法把第二阶段放在这个索引中,把第三阶段放在工作仓库中……但我不知道该怎么做,所以我手工做。 :-(
最佳答案
要创建和测试包含部分工作树更改的索引,包括手动编辑的 hunk,请执行以下操作:
git add --patch <files>
git stash --keep-index
<test the indexed changes>
git reset --hard
git stash pop --index
此时没有冲突,版本库、索引和工作目录处于git stash
之前的状态。您现在可以 git commit
索引更改。
当然,这很奇怪而且不是很直观,我真的很想知道是否有更简单的方法来做到这一点。
关于git stash 和 edited hunks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4058372/