Git 隐藏时合并状态丢失

Git 隐藏时合并状态丢失,git,merge,Git,Merge,在我们进行隐藏后,有关合并的信息会丢失。下面比较了常用合并和隐藏合并 右:合并+推送 结果与预期一样,合并提交: 错误:合并+隐藏+推送 在这里,我处于一个场景中,我需要隐藏合并更改,以便查看合并之前的行为 git merge release-2013-11-06 # Conflicts fixed, but detected inappropriate behaviour git stash git stash pop git commit -am "Upgraded to rel

在我们进行隐藏后,有关合并的信息会丢失。下面比较了常用合并和隐藏合并

右:合并+推送 结果与预期一样,合并提交:

错误:合并+隐藏+推送 在这里,我处于一个场景中,我需要隐藏合并更改,以便查看合并之前的行为

git merge release-2013-11-06
# Conflicts fixed, but detected inappropriate behaviour
git stash
git stash pop
git commit -am "Upgraded to release 2013-11-06"
git push origin dev
结果:此提交不再是“合并”。我们还丢失了合并中包含的所有单作者提交,就像我做了所有这些更改一样


那么,合并时我们不应该隐藏任何东西吗?那么如何避免这种行为呢?

当您进行合并时。但似乎
git stash
并没有保存引用

您可以尝试将
MERGE\u HEAD
设置回应用隐藏后要合并的提交:

假设您正在将release-2013-11-06分支合并到master上,最后一次提交是-
3be2c99
,那么您可以执行以下操作:

git stash apply --index
git update-ref MERGE_HEAD 3be2c99
git status
# All conflicts fixed but you're still merging
# ....
注意应用隐藏时使用的
--index
。这是在索引中获取更改所必需的,否则您将只在工作树中获取隐藏的更改


附言:理想情况下,您应该避免隐藏未提交的合并。

我将强调使用
--index
git stash pop
:没有它,更改将不会应用于索引,而只应用于工作树,“冲突已解决”状态意味着“确定提交”有冲突的文件的状态在索引中。@kostix Yup,添加了一条关于它的注释:)@StéphaneBruckert我的答案中有一个小的更正,请重新查看。实际上,MERGE_HEAD应该指向您正在合并的分支中的commit,即您的情况下的release-2013-11-06。只是不要使用
stash
。没有任何
stash push/pop
可以做到
git commit-a-m stash commit
git checkout分支的stash commit和&git reset HEAD^
已经做到了完美无瑕(没有任何像您描述的
stash
那样的akward行为)。我真的看不出有什么理由使用<代码> Git Stase,我认为这是早期Git开发的一个Relek。我不确定遵循您的观点。一旦我修复了合并中的许多冲突,我需要恢复到合并前的状态“只是为了检查一些东西”。
commit
checkout
reset
之间的任何冲突都不会暂时保存我花了很长时间修复的冲突。只有
藏匿
会。或者,您是想说我应该在没有验证之前的行为,甚至使用一些“错误的”代码/合并的情况下提交我的文件?更特别的是,没有人应该藏任何东西,是吗?
git stash apply --index
git update-ref MERGE_HEAD 3be2c99
git status
# All conflicts fixed but you're still merging
# ....