Git stash pop在存在冲突时无法解压未跟踪的文件吗?

4
这种行为对我来说更像是一个bug,但也许我还有所疏漏。
首先,这就是我所做的:
0) `mkdir mytest && cd mytest`
1) `git init`: Created an empty git repo
2) `echo "test" >test.txt && git commit -a -m "init"`: Created 1 commit with a single file
3) `echo "test2" >test.txt && echo "test2" >test2.txt`: Made some changes in the file i committed + created a new file
4) `git stash -u`: Used stash -u to save my changes
5) `echo "test3" >test.txt && git commit -a -m "2"`: Created a second commit with a different change on the existing file in order to force a conflict
6) `git stash pop`: I git stash pop to create a conflict between the second commit and my stash from my first commit

我原以为我的当前工作目录中会有一个冲突的文件和一个未跟踪的文件,但是当我运行 git status 命令时,我只发现了冲突的文件:

mytest git:(master)  git status
On branch master
Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
    both modified:   test.txt

这是预期的行为吗?我该如何解决冲突并找回我的未跟踪文件?


我建议避免使用git stash。这个命令在历史上有很多bug,而且似乎又出现了一个新的。它会做一些不应该做的事情(创建提交,但你无法以任何正常方式找到或使用它们),而且使用起来很困难。 - torek
3个回答

4

请注意,技术上来说,存储在stash中的是一个提交(更精确地说是一个合并提交)。

您可以运行以下命令查看:

git log --oneline --graph stash

运行git stash -u命令时,未跟踪文件所在的部分是stash提交的第3个父级: stash^3
如果使用git stash applygit stash pop恢复已跟踪文件的部分时触发冲突,您可以执行以下操作:
  • 解决该部分的问题(例如:解决test.txt上的冲突),
  • 使用其他git命令列出或提取存储中"未跟踪文件"的部分:
git show --name-only stash^3
git checkout stash^3 -- that/file # warning : will overwrite the content of
                                  # 'that/file' if you have a local one

# if you have a clean index :
git checkout stash^3 -- .
git reset HEAD

# etc ...

只有在冲突无法解决为一个或另一个时,OP的情况才会出现,而重置将撤消已暂存的解决方案。 - jthill
@jthill:你说得对,我考虑在一个干净的索引上运行这些命令。希望我的更新答案更清晰明了。 - LeGEC
对于我的情况,我不得不像这样将stash部分放在引号中 git checkout 'stash@{1}^3' -- . 我不知道那是因为我的特定shell还是其他原因。 - dantheman
@dantheman: 你是在使用PowerShell吗?如果是的话,花括号需要加引号(否则它们与bash中的$(...)等效)。 - LeGEC
@LeGEC 不,我正在使用zsh。 - dantheman

1

对我来说,我切换到一个提交,然后运行git stash,再运行git stash apply,这样我的未跟踪的文件就回来了


感谢您的回答,我成功地从存储区中获取了大量未跟踪的文件。 - K. Shaikh

0
如果冲突解决为其中之一,那么你就可以轻松地解决它,然后再次使用git stash pop获取未跟踪的文件,但是如果任何解决块与任一父级不完全相同,则必须手动执行此操作:解决合并冲突,然后。
# after resolving conflicts
index=`git write-tree`
git read-tree -u --prefix= stash^3
git read-tree $index

不,这不应该是正常的。


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