如何反向申请藏匿?

Pat*_*otz 208 git git-stash

我的git藏匿处保存了一个小补丁.我已经将它应用到我的工作副本中了git stash apply.现在,我想通过反向应用补丁来回退这些变化(有点像git revert对抗藏匿的东西).

有谁知道如何做到这一点?

澄清:我的工作副本还有其他变化.我的特殊情况很难描述,但您可以想象一些存储中的调试或实验代码.现在它在我的工作副本中混合了一些其他的变化,我希望看到效果有和没有来自藏匿的变化.

它当前看起来不像stash支持,但是git stash apply --reverse它将是一个很好的功能.

Gre*_*con 169

根据git-stash手册页,"存储被表示为一个提交,其树记录了工作目录的状态,其第一个父节点是HEAD创建存储时的提交",并git stash show -p给出了"记录在stas作为stashed状态和其原始父级之间的差异.

要保持其他更改不变,请git stash show -p | patch --reverse按以下方式使用:

$ git init
Initialized empty Git repository in /tmp/repo/.git/

$ echo Hello, world >messages

$ git add messages

$ git commit -am 'Initial commit'
[master (root-commit)]: created 1ff2478: "Initial commit"
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 messages

$ echo Hello again >>messages

$ git stash

$ git status
# On branch master
nothing to commit (working directory clean)

$ git stash apply
# On branch master
# 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:   messages
#
no changes added to commit (use "git add" and/or "git commit -a")

$ echo Howdy all >>messages

$ git diff
diff --git a/messages b/messages
index a5c1966..eade523 100644
--- a/messages
+++ b/messages
@@ -1 +1,3 @@
 Hello, world
+Hello again
+Howdy all

$ git stash show -p | patch --reverse
patching file messages
Hunk #1 succeeded at 1 with fuzz 1.

$ git diff
diff --git a/messages b/messages
index a5c1966..364fc91 100644
--- a/messages
+++ b/messages
@@ -1 +1,2 @@
 Hello, world
+Howdy all
Run Code Online (Sandbox Code Playgroud)

编辑:

对此的一个轻微改进就是用来git apply代替补丁:

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

或者,您也可以git apply -R用作速记git apply --reverse.

我最近发现这个非常方便...

  • 是的,`git apply -R`是一个改进,至少对我来说,在我的Windows框中使用git bash,因为`patch --reverse`有问题找到要修补的文件(没有真正的线索,为什么替代工作).+1和良好的解释 (5认同)
  • 我得到**错误:补丁失败:/src/filename.java:46****错误:src/filename.java补丁不适用** (4认同)
  • @Greg Bacon,嘿,我已经尝试通过你概述的脚本,但是当我运行`git stash show -p |时,补丁失败了 git apply -R -v`,消息:`检查补丁消息...错误:搜索时:Hello,world Hello再次错误:补丁失败:消息:1`.你知道什么可能是错的吗? (3认同)
  • 太好了,谢谢.看起来像这可能是藏匿的一个很好的功能. (2认同)

Jak*_*ski 76

git stash[save]获取您的工作目录状态和索引状态,并将它们隐藏起来,将索引和工作区域设置为HEAD版本.

git stash apply带回这些变化,所以git reset --hard会再次删除它们.

git stash pop带回这些更改并删除顶部存储的更改,因此git stash [save]在这种情况下将返回到上一个(pre-pop)状态.


小智 67

git checkout -f
Run Code Online (Sandbox Code Playgroud)

将删除任何非提交更改.

  • 这要简单得多 (5认同)
  • 谢谢,你帮助我从阶段性的改变,这是不是不适用. (4认同)
  • OP 并没有要求这样做,因为这将删除所有未提交的更改,而不仅仅是“存储应用”引入的更改。这可能会导致有用更改的丢失。 (3认同)

Cho*_*ith 19

git手册页直接剪切粘贴 它的措辞明确,甚至包含别名;

取消应用藏匿 在你可能希望应用藏匿的变化,做一些工作,一些用例场景,但随后不应用最初来源于藏匿这些变化.Git没有提供这样的stash unapply命令,但是可以通过简单地检索与存储关联的补丁并反向应用它来实现效果:

$ git stash show -p stash@{0} | git apply -R
Run Code Online (Sandbox Code Playgroud)

同样,如果您没有指定存储,Git会采用最新的存储:

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

您可能想要创建别名并有效地向Git添加stash-unapply命令.例如:

$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply
Run Code Online (Sandbox Code Playgroud)

  • 无论出于何种原因,您链接的“取消应用存储”的有用部分已从第二版中删除_-最新版本现在是本书的 2.1.146, 2019-04-15-_ [V2-Git Tools - Stashing and清洁](https://git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning)。可能是因为作者认为有更好的方法可以做到这一点,但我似乎找不到。 (2认同)

小智 13

这已经过了,但如果我正确地解释了问题,我找到了一个简单的解决方案,请注意,这是我自己的术语中的解释:

git stash [save] 将保存当前更改并将当前分支设置为"清洁状态"

git stash list 给出类似的东西: stash@{0}: On develop: saved testing-stuff

git apply stash@{0}将像以前一样设置当前分支 stash [save]

git checkout .将当前分支设置为 stash [save]

保存在存储中的代码不会丢失,可以git apply stash@{0}再次找到.

Anywhay,这对我有用!


Ach*_*hal 8

如何反向应用存储?

除了其他人提到的,最简单的方法是先做

git reset HEAD
Run Code Online (Sandbox Code Playgroud)

然后签出所有本地更改

git checkout . 
Run Code Online (Sandbox Code Playgroud)

  • 只要您*绝对没有*想要保存的本地工作,这是迄今为止最简单的方法。如果您将错误的存储应用到分支或遇到不想解决的合并冲突,这是通过将工作集完全恢复到分支的最新提交来撤消它的快速而简单的方法。 (3认同)

小智 7

您可以应用两个命令

git reset .// 反转文件

然后

git checkout . // 撤销更改

  • 请通过为每个命令添加解释来提高答案的质量。谢谢。 (6认同)