git stash 和 edited hunks

标签 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,所以我必须编辑文件,删除无用的 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/

相关文章:

git - 如何在忽略本地更改的同时进行 git pull?

git - GitHub 上 Pull Requests 的最佳实践

ruby-on-rails - Ruby 已经在使用我的模型的类名

git - 解决大型项目团队中的冲突

ruby - 冲突的 ruby

git - git 保存了多少/多长时间的存储?

git - 如何备份多个存储?

git - 将本地 Git 存储库与远程存储库同步

git - 我可以运行一个使用一个 git 分支的程序,同时在另一个分支上工作吗?

git - 在不 merge 的情况下将更改推送到分支?