在Git中删除一个藏匿的流行音乐

Casebash 225 git git-stash

我突然出现了一个合并冲突.与列为重复的问题不同,我已经在目录中保留了一些未提交的更改.我不只是想让合并冲突消失,而且还要让我的目录恢复到pop之前的状态.

我试过了git merge --abort,但是git声称没有合并正在进行中.是否有一种简单的方法可以在不破坏我最初在目录中进行的更改的情况下中止流行音乐?

jmoz.. 251

我的用例:刚尝试弹出错误的分支并发生冲突.我只需要撤消pop,但将其保存在存储列表中,这样我就可以在正确的分支上弹出它.我这样做了:

git reset HEAD --hard
git checkout my_correct_branch
git stash pop

简单.

  • 这不是原始问题的答案,因为它会擦除未提交的本地更改. (40认同)
  • 那么你想要藏匿的东西会留在藏匿列表中,直到你有一个成功的流行音乐? (17认同)
  • @RyanClark请参阅下面的[DavidG的答案](/sf/ask/17360801/).基本上,是的,它保留在存储列表中. (9认同)
  • 现在这已经救了我两次. (4认同)
  • 我希望我能做出正确的答案! (3认同)

Ben Jackson.. 47

好吧,我想我已经解决了"git stash unapply".它比git apply --reverse你需要反向合并操作更复杂,以防万一有合并完成git stash apply.

反向合并要求将所有当前更改推送到索引中:

  • git add -u

然后反转merge-recursive,是由做git stash apply:

  • git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1

现在你将只留下非藏匿变化.他们将在索引中.git reset如果您愿意,可以使用它来取消更改.

鉴于你的原始git stash apply失败,我认为反向也可能失败,因为它想要撤消的一些事情没有完成.

这是一个示例,显示工作副本(via git status)如何再次清理:

 $ git status
# On branch trunk
nothing to commit (working directory clean)
 $ git stash apply
Auto-merging foo.c
# On branch trunk
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo.c
#
no changes added to commit (use "git add" and/or "git commit -a")
 $ git add -u
 $ git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Auto-merging foo.c
 $ git status
# On branch trunk
nothing to commit (working directory clean)

  • `git stash apply`从不丢弃存储,当合并失败时,`git stash pop`也会保留存储 (6认同)
  • 在这样做之后,以前被隐藏的编辑会永远丢失,还是他们回到了藏匿处? (2认同)

DavidG.. 43

编辑:从git help stashpop部分的文档:

应用国家可能会因冲突而失败; 在这种情况下,它不会从隐藏列表中删除.您需要手动解决冲突并随后手动调用git stash drop.

如果使用--index选项,则尝试不仅恢复工作树的更改,还尝试恢复索引的更改.但是,如果存在冲突(存储在索引中,因此您无法再像以前那样应用更改),则可能会失败.

尝试将所有repo硬编辑到一个新目录中(所以你有一份副本)并运行:

git stash show 如果您关心它,请将输出保存在某个地方.

然后:git stash drop丢弃冲突的存储然后:git reset HEAD

这应该让你的回购处于以前的状态(希望,我仍然无法重复你的问题)

===

我试图重新解决你的问题,但是当我使用时,我得到的git stash pop是:

error: Your local changes to the following files would be overwritten by merge:
...
Please, commit your changes or stash them before you can merge.
Aborting

在一个干净的目录:

git init
echo hello world > a
git add a & git commit -m "a"
echo hallo welt >> a
echo hello world > b
git add b & git commit -m "b"
echo hallo welt >> b
git stash
echo hola mundo >> a
git stash pop

我没有看到git尝试合并我的更改,它只是失败了.您有任何我们可以遵循的重复步骤来帮助您吗?


hugo der hun.. 6

如果您不必担心所做的任何其他更改,并且您只想返回上一次提交,那么您可以执行以下操作:

git reset .
git checkout .
git clean -f