我在开发分支中有一些未提交的更改,我使用了 git stash
命令将它们存储,但其中有一些非常重要的更改被存储了起来。有没有办法恢复这些更改?
另外,我在存储的代码文件上进行了一些更改。
如果可能,有没有机会将存储的更改检出到一个新的分支中?
我在开发分支中有一些未提交的更改,我使用了 git stash
命令将它们存储,但其中有一些非常重要的更改被存储了起来。有没有办法恢复这些更改?
另外,我在存储的代码文件上进行了一些更改。
如果可能,有没有机会将存储的更改检出到一个新的分支中?
git stash apply
只需切换到您想要更改的分支,然后使用git stash apply
。然后使用git diff
查看结果。
完成所有更改后-apply
看起来很好,并且您确定不再需要stash-然后使用git stash drop
将其删除。
我总是建议使用git stash apply
而不是git stash pop
。区别在于apply
会保留stash以便轻松重试apply
,或查看等等。如果pop
能够提取stash,它将立即drop
它,如果随后意识到您想在其他地方(在不同的分支中)或使用--index
等提取它,则不那么容易。如果您使用apply
,则可以选择何时drop
。
虽然这些都是小问题,但对于 Git 新手来说,影响不大。如果您是新手,请跳过其余部分!
至少有三到四种“使用git stash”的方法。上面是“方式1”,即“简单的方式”:
这是简单的情况,如上所述。运行git stash save
(或普通的git stash
,同样的事情)。切换到另一个分支并使用git stash apply
。这使得Git合并您之前的更改,使用Git的相当强大的合并机制。仔细检查结果(使用git diff
)以查看是否喜欢它们,如果喜欢,使用git stash drop
删除stash。完成!
git stash apply stash@{2}
等方式来应用或者丢弃特定的存储,丢弃一个特定的存储只会重新编号高编号的存储。同样,没有编号的存储也是stash@{0}
。stash@{7}
还是stash@{4}
?等等,我刚刚又推送了一个,现在它们是8和5了吗?)。我个人更喜欢将这些更改传输到新分支,因为分支有名称,cleanup-attempt-in-December
对我来说比stash@{12}
更有意义。(git stash
命令带有一个可选的保存消息,这些消息可以帮助,但不知怎么的,我所有的存储都被命名为WIP on branch
。)
(Extra-advanced) You've used git stash save -p
, or carefully git add
-ed and/or git rm
-ed specific bits of your code before running git stash save
. You had one version in the stashed index/staging area and another (different) version in the working tree. You want to preserve all this. So now you use git stash apply --index
, and that sometimes fails with:
Conflicts in index. Try without --index.
You're using git stash save --keep-index
in order to test "what will be committed". This one is beyond the scope of this answer; see this other StackOverflow answer instead.
git status # see if there's anything you need to commit
# uh oh, there is - let's put it on a new temp branch
git checkout -b temp # create new temp branch to save stuff
git add ... # add (and/or remove) stuff as needed
git commit # save first set of changes
git status # see if there's anything you need to commit
# status says "nothing to commit"
git checkout -b temp # optional: create a new branch for "apply"
git stash apply # apply stashed changes; see below about --index
git stash show -p
来查看stash中的简化版本。(这个简化版本仅查看“最终工作树”更改,而不是--index
单独恢复的保存索引更改。)命令git stash apply
,不带--index
,只是尝试在您的工作树中进行相同的更改。apply
命令很乐意将stash应用于修改过的工作树(或者至少尝试应用它)。例如,您可以执行以下操作:git stash apply stash # apply top of stash stack
git stash apply stash@{1} # and mix in next stash stack entry too
假设你正在进行大量高级Git操作,已经创建了一个存储,想要使用git stash apply --index
,但是由于自从你保存它以来分支发散太多,因此无法再应用保存的存储。
这就是git stash branch
的用途。
如果你:
stash
时所在的精确提交,然后git stash apply --index
重现更改的尝试肯定会成功。这就是git stash branch newbranch
的作用。(然后它删除了存储,因为它已成功应用。)
--index
的一些最终说明(到底是什么?)--index
的作用很容易解释,但在内部有些复杂:
git add
(或“暂存”)。git stash
时,您可能已编辑了文件foo
和zorg
,但只暂存了其中一个。git add
了added
的内容并且不git add
未添加的内容,那就太好了。也就是说,如果在执行stash
之前,您将foo
添加,但没有添加zorg
,那么最好保持相同的设置。应该再次暂存已经暂存的内容;修改但未暂存的内容应该再次修改,但不应该暂存。apply
命令的 --index
标志会尝试进行这样的设置。如果您的工作树是干净的,通常情况下它会正常工作。但是,如果您的工作树已经有了一些 add
操作,那么可能会出现问题。如果省略 --index
,则 apply
操作不会尝试保留整个暂存/未暂存的设置。相反,它只会使用 "stash bag" 中的工作树提交来调用 Git 的合并机制。如果您不关心保留暂存/未暂存的内容,则省略 --index
可以使 git stash apply
更容易实现其功能。git stash pop
吗?还是你是指:你编辑了一些文件,但尚未再次运行 git stash
?或者你是指完全不同的事情? - torekapply
一个存储之前先提交您现在拥有的内容。您不必这样做,但这使您查看事情变得更加简单。您可以使用rebase -i
将多个提交压缩在一起,或稍后挑选特定的更改,或进行其他操作。 - torekgit stash apply --index
(记住两个破折号)。如果你省略了 --index
,也没关系;--index
的唯一目的是保持暂存/未暂存的设置。(你可能一开始就没有任何特殊的设置。)然后使用 git status
等命令,根据需要添加/提交等操作。当(且仅当)你完成了所有的隐藏操作时,使用 git stash drop
来丢弃它。 - torekgit stash branch
(请参见上面的部分,或[Pro Git book](http://git-scm.com/book/ch6-3.html)在[Shunya's answer](http://stackoverflow.com/a/19005203/1256452)中)。然后,您可以`git checkout该分支,或者从该分支中
git cherry-pick`提交等。 - torekgit stash pop
会把一切都恢复原位
如评论中所建议,您可以使用 git stash branch newbranch
将stash应用于新分支,这与运行以下命令相同:
git checkout -b newbranch
git stash pop
git stash branch newbranch
确实可以做到这一点;但请注意,它会创建一个新分支,并将其父提交设置为当时进行“stash”操作时的“HEAD”提交。换句话说,它适用于当您在一段漫长的编程会话后回来时,看着混乱的代码并决定“我应该把它放到一个分支上,而不是存储”。 :-) - torek要查看您的暂存内容:
git stash list
从暂存列表中应用特定的stash编号:
git stash apply stash@{2}
或者只应用第一个stash:
git stash pop
注意: git stash pop将从您的暂存列表中移除该stash,而git stash apply则不会。 因此,请根据需要使用它们。
git stash pop
- 恢复到保存的状态,但删除临时存储中的存储内容。git stash apply
- 恢复到保存的状态,并将存储列表留作可能的后续重用。要恢复被存储的更改...您只需使用一个命令即可
git stash pop
查看暂存更改列表
git stash list
git stash clear
在Mac上,以下操作对我有效:
git stash list(查看所有隐藏的存储)
git stash list
使用 git stash apply 命令(加上要应用的备份列表中编号)
像这样:
git stash apply(只需从备份列表中选择相应的编号即可)
git stash apply 1
git stash
然后使用以下命令检出到一个新的分支:
git checkout -b
然后应用保存的提交:
git stash apply
就像很多人说的那样,执行git stash apply stash@{1}
将会获取当前分支上的更改,但我不知道为什么对我不起作用。
对我来说,执行git stash apply stashNumber
总是有效的。
例如,如果我想要检索存档编号1,这就是我如何做到的- git stash apply 1
PS:你可以使用pop
代替apply
..唯一的区别是apply
不会删除stash,但是执行pop
会删除你弹出的stashnumber。