为什么在 "git stash --keep-index" 后立即执行 "git stash pop" 会导致冲突?

3

我做了:

$ git stash --keep-index
$ git stash pop

Git让我解决冲突,这是为什么?我做错了什么吗?如何暂存未提交的文件(测试程序),然后恢复所有内容(使所有已提交的文件不受影响,未提交的文件回来并保持未提交状态)?


3
你为什么要使用 --keep-index - Claudio
2
@Claudio,使用仅存储的更改测试程序。 - klm123
2个回答

6
问题出在--keep-index参数上。你stash的改动和已经暂存的改动发生了冲突。
下面是可以使用的命令来复现问题:
echo bar > foo
git add foo
echo baz > foo
git stash --keep-index
git stash pop #CONFLICT

在这种情况下,Git 不知道 foo 中应该存在 bar 还是 baz...
解决方案是不使用 --keep-index 参数或先提交您添加的更改(稍后可以修改提交)。
您也可以通过使用 git stash branch 命令将工作目录恢复到之前的状态(然后您需要合并分支)。

那么 git stash --keep-index 命令会将相对于代码库的更改存储,而不是暂存区域?这些存储的更改将包括未暂存和已暂存的更改,对吗? - klm123
那个例子没有冲突。 - Géry Ogam

0

git stash 命令可以保存从 HEAD 状态到工作树状态的转换。它还将工作树设置为 HEAD 状态。

git stash --keep-index 命令可以保存从 HEAD 状态到索引状态的转换。它还将工作树设置为 index 状态。

git stash pop 命令可以应用最后保存的转换。因此,如果工作树不在 HEAD 状态(例如,在将更改暂存到索引并执行 git stash --keep-index 后),可能会发生冲突。您可以在执行 git stash pop 命令之前执行 git reset --hard 将工作树设置为 HEAD 状态以避免冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接