我需要创建预提交挂钩来对项目进行一些“健全性测试”(主要检查部署是否不会出现问题)。 因为我只需要测试即将提交的更改,所以我需要在运行测试之前存储非暂存的更改,并在执行此操作后弹出存储的更改。但是有一个问题,因为在以下情况下,存储和索引之间可能会发生冲突:
假设我有一个名为
testfile
的文件,其中包含以下内容:
first line
second line
third line
现在我将在第二个和第三个之间添加一行
first line
second line
second and a half line
third line
并运行
git add
,这样它就会上演。
现在我将在上一行之后添加下一行,以便文件看起来像这样
first line
second line
second and a half line
second and three quarters line
third line
所以现在第一行和第二行已提交,第二半已上演,第二行和四分之三未上演,第三行已提交。
我们直接进入正题吧。现在,当我运行
git stash --keep-index
,然后执行测试并尝试运行 git stash pop
时,结果如下:
Auto-merging testfile
CONFLICT (content): Merge conflict in testfile
文件内容如下所示:
first line
second line
second and a half line
<<<<<<< Updated upstream
=======
second and three quarters line
>>>>>>> Stashed changes
third line
我不知道如何在运行测试后重新应用隐藏的更改并避免这种类型的冲突。我很感激您能以此为我指明正确的方向。
如果您想在存储中拥有该版本(
git checkout --theirs
指的是它),那么您基本上需要--theirs
(对于冲突的文件)。
然后
git reset HEAD
从索引中删除更改(由于冲突而添加到那里),最后git stash drop
。
如果有一个选项可以让
git-stash pop
更好地处理这个问题,那就太好了,因为这通常就是您想要的。
我知道我来晚了,但这多年来一直是我的痛点,我只是回避它,而不是真正解决它。
今天,我真的很想让它发挥作用,所以我决定不择手段地寻找解决方案......
这就是我的想法:
$ git stash --keep-index
$ git diff -R stash | git apply
$ git stash drop
这似乎完全完美地完成了所需的工作。索引和工作树恢复原样;并且任何已索引的内容都不会面临删除的风险(仅触及未索引的更改)。