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

Cas*_*ash 225 git git-stash

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

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

jmo*_*moz 251

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

git reset HEAD --hard
git checkout my_correct_branch
git stash pop
Run Code Online (Sandbox Code Playgroud)

简单.

  • 这不是原始问题的答案,因为它会擦除未提交的本地更改. (40认同)
  • 那么你想要藏匿的东西会留在藏匿列表中,直到你有一个成功的流行音乐? (17认同)
  • @RyanClark请参阅下面的[DavidG的答案](/sf/answers/933713511/).基本上,是的,它保留在存储列表中. (9认同)
  • 好的。读完这篇文章后,我查看了 git stash pop 文档,它说“应用状态可能会因冲突而失败;在这种情况下,它不会从存储列表中删除。”。因此,这就是为什么在重置/签出后能够重新弹出存储的原因。 (5认同)
  • 现在这已经救了我两次. (4认同)
  • 我希望我能做出正确的答案! (3认同)
  • 我认为遇到这种情况的绝大多数用户都会发现这个解决方案是理想的。我无法想象在尝试将 pop 放入工作目录之前,我在工作目录中有未提交的更改的情况。这听起来像是灾难的秘诀。 (3认同)
  • 清除_您想要保留的所有本地更改。简单的。XD (2认同)

Ken*_*sta 227

我一直用

git reset --merge

我不记得它曾经失败过。

  • 给这个人一枚奖章 (32认同)
  • 这张纸条确实需要更大一些。不丢失分阶段的变化是我寻找这个的全部目的=/ (19认同)
  • 如果执行此操作,之前隐藏的内容会怎样?它是被放回藏匿处还是丢失了? (6认同)
  • 最好的一个我不知道为什么人们不给出这一行 ans (5认同)
  • 惊人的答案!值得点赞! (3认同)
  • @AdamParkin当`git stash pop`由于合并冲突而失败时,存储内容将自动存储在存储中而不是删除它 (3认同)
  • 有用!但是——这与 `git merge --abort` 有什么不同?在错误的 stash pop/apply 期间,git 甚至会说“自动合并...冲突...自动合并...”,然后没有正在进行的合并可以中止,但是有一个需要重置吗?啊哈。 (3认同)
  • 它被放回储藏处。 (2认同)

Ben*_*son 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)
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*idG 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
Run Code Online (Sandbox Code Playgroud)

在一个干净的目录:

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
Run Code Online (Sandbox Code Playgroud)

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


hug*_*ige 6

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

git reset .
git checkout .
git clean -f
Run Code Online (Sandbox Code Playgroud)


age*_*nzo 5

好的,我想我已经找到了一个工作流程,可以让您回到需要的位置(就好像您没有完成弹出操作一样)。

提前备份!我不知道这是否适合您,因此请复制您的整个存储库,以防万一它不起作用。

1)修复合并问题并通过选择来自补丁的所有更改来修复所有冲突(在tortoisemerge中,这显示为one.REMOETE(他们的))。

git mergetool
Run Code Online (Sandbox Code Playgroud)

2) 提交这些更改(它们已通过 mergetool 命令添加)。给它一个“合并”的提交消息或你记得的东西。

git commit -m "merge"
Run Code Online (Sandbox Code Playgroud)

3) 现在,您仍然会拥有最初开始的本地未暂存更改,以及补丁中的新提交(我们可以稍后删除它)。现在提交未暂存的更改

git add .
git add -u .
git commit -m "local changes"
Run Code Online (Sandbox Code Playgroud)

4) 反转补丁。这可以通过以下命令来完成:

git stash show -p | git apply -R
Run Code Online (Sandbox Code Playgroud)

5) 提交这些更改:

git commit -a -m "reversed patch"
Run Code Online (Sandbox Code Playgroud)

6) 摆脱补丁/取消补丁提交

git rebase -i HEAD^^^
Run Code Online (Sandbox Code Playgroud)

由此,删除其中包含“merge”和“reversed patch”的两行。

7) 取回未更改的更改并撤消“本地更改”提交

git reset HEAD^
Run Code Online (Sandbox Code Playgroud)

我用一个简单的例子来运行它,它可以让你回到你想要的地方——就在弹出存储之前,你的本地更改和存储仍然可以弹出。