1.您正在使用git stash save --keep-index来测试"将提交什么"。请参阅this other StackOverflow answer。 对于复杂的情况,我建议首先从一个"干净"的工作树开始,提交你现在所做的任何更改(如果你喜欢的话,在一个新的分支上)。这样,你正在应用它们的"某处"就没有其他东西了,你只是在尝试隐藏的更改:
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
8条答案
按热度按时间vwkv1x7d1#
简单问题的简单答案是
git stash apply
只需要检查你想要修改的分支,然后使用
git stash apply
,然后使用git diff
来查看结果。在您完成所有更改之后-
apply
看起来不错,并且您确定不再需要隐藏-* 然后 * 使用git stash drop
将其删除。我总是建议使用
git stash apply
而不是git stash pop
。不同之处在于apply
会将隐藏项留在周围,以便于重新尝试apply
,或者查看等。如果pop
能够提取隐藏项,它会立即将其也drop
,如果您随后意识到您想在其他地方提取它(在不同的分支),或者用--index
,或者类似的东西,那就不那么容易了。如果你用apply
,* 你 * 可以选择什么时候用drop
。这些都是很小的一部分,对于Git新手来说,应该是一样的。(你可以跳过剩下的部分!)
如果您要做更高级或更复杂的事情,该怎么办?
可以说,至少有三到四种不同的"使用git stash的方法"。以上是"方法1",即"简单的方法":
1.您从一个干净的分支开始,正在进行一些更改,然后意识到您在错误的分支中进行这些更改。您只想将现有的更改"移动"到另一个分支。
如上所述,这是一种简单的情况。(或者是
git stash
,同样的操作)。检查另一个分支并使用git stash apply
。这会让Git使用Git相当强大的合并机制,合并您之前的更改。* 仔细检查结果 (使用git diff
)来查看您是否喜欢它们,如果喜欢,使用git stash drop
来删除隐藏的内容。操作完成!1.你开始了一些改变,并把它们藏起来。然后你切换到另一个分支,开始了更多的改变,忘记了你已经藏起来了。
现在,您希望保留甚至移动 * 这些 * 更改, 并 * 应用您的存储。
事实上,你可以再次使用
git stash save
,因为git stash
会产生一个"堆栈",如果你这样做,你就有了两个堆栈,一个叫做stash
--但你也可以写stash@{0}
--另一个拼写为stash@{1}
。(在任何时候)查看所有文件。最新的文件总是编号最低的。当你git stash drop
时,它会删除最新的文件,而原来是stash@{1}
的文件会移到堆栈的顶部。如果你有,甚至更多,原来是stash@{2}
的那个变成stash@{1}
等等。你也可以
apply
然后drop
一个特定的藏匿处:git stash apply stash@{2}
,以此类推。删除特定的stash只会对编号较高的stash重新编号。同样,没有编号的stash也是stash@{0}
。如果你把很多东西都藏起来,会变得很乱(我想要的stash是
stash@{7}
还是stash@{4}
?等等,我刚刚推了另一个,现在它们是8和5?)我个人更喜欢将这些更改转移到一个新分支,因为分支有名称,cleanup-attempt-in-December
对我来说比stash@{12}
更有意义(git stash
命令接受一个可选的保存消息,这些消息可能会有所帮助,但不知何故,我的所有存储最终都被命名为WIP on branch
)。1.(特别高级)在运行
git stash save
之前,您已经使用了git stash save -p
,或者仔细地对代码的特定位进行了git add
-ed和/或git rm
-ed。您在隐藏索引/临时区域中有一个版本,而在工作树中有另一个(不同的)版本。您希望保留所有这些版本。所以现在您使用git stash apply --index
,但有时会出现以下错误:1.您正在使用
git stash save --keep-index
来测试"将提交什么"。请参阅this other StackOverflow answer。对于复杂的情况,我建议首先从一个"干净"的工作树开始,提交你现在所做的任何更改(如果你喜欢的话,在一个新的分支上)。这样,你正在应用它们的"某处"就没有其他东西了,你只是在尝试隐藏的更改:
现在,你已经站在了一个"干净"的起点上,或者说,它更像是这样:
要记住的主要一点是,"stash"* 是 * 一个提交,它只是一个稍微"有趣/怪异"的提交,而不是"在一个分支上"。
apply
操作查看提交更改了什么,并试图在你现在所在的任何地方重复它。stash仍然会在那里(apply
保持它在周围),所以你可以更多地看它,或者决定这是错误的地方apply
它,并再次尝试不同的,或什么。任何时候你有了一个stash,你都可以使用
git stash show -p
来查看stash中的内容的简化版本(这个简化版本只查看"最终工作树"的更改,* 而不是 *--index
单独恢复的已保存索引的更改)。即使你已经做了一些修改,
apply
命令也很乐意将一个stash应用到一个 * modified * 工作树(或者至少尝试应用它)。例如,你可以这样做:你可以在这里选择“apply”的顺序,挑选出特定的stash以特定的顺序应用。但是,请注意,每次你基本上都是在做一个“git merge”,正如merge文档所警告的:
不建议在运行git merge时使用非平凡的未提交更改:虽然这是可能的,但它可能会使您处于一种在发生冲突时难以退出的状态。
如果您从一个干净的树开始,并且只执行几个
git apply
操作,则很容易退出:使用git reset --hard
返回到干净状态,并更改apply
操作(这就是为什么我建议在这些复杂情况下首先从干净的工作树开始)。最坏的情况又如何呢?
假设你正在做很多高级Git的东西,你已经做了一个stash,并且想要使用
git stash apply --index
,但是它不再可能使用--index
来应用保存的stash,因为自从你保存它以来分支已经发散了太多。这就是
git stash branch
的用途。如果您:
1.检查您执行原始
stash
时的 * 确切提交 *,然后1.创建一个新分支,最后
这就是
git stash branch *newbranch*
所做的。(然后,它会删除成功应用的stash。)关于
--index
的最后几句话(这到底是什么?)--index
的功能很容易解释,但内部有点复杂:commit
-ing之前先进行git add
(或“stage”)。git stash
时,您 * 可能 * 编辑了foo
和zorg
两个档案,但只暂存其中一个档案。git add
的added
内容,而 * 不是 *git add
的非添加内容,这可能会很好。也就是说,如果您是add
-edfoo
,而不是在您执行stash
之前的zorg
,那么拥有完全相同的设置可能会很好。应该再次上演;已修改但未回写的内容应再次修改但未回写。apply
的--index
标志试图这样设置。如果你的工作树是干净的,这通常是正确的。如果你的工作树已经有了add
-艾德的东西,你可以看到这里可能会有一些问题。如果你省略了--index
,apply
操作不会试图保留整个staged/unstaged设置。相反,它只是调用Git的合并机制,使用"stash bag"中的工作树提交。如果你不关心保留staged/unstaged,忽略--index
可以使git stash apply
更容易地完成它的任务。fjaof16o2#
我会让一切恢复原状
正如注解中所建议的,您可以使用
git stash branch newbranch
将stash应用到一个新的分支,这与运行:2nbm6dog3#
要检查您的隐藏内容:-
git隐藏列表
从存货清单中应用特定的存货编号:-
git stash应用stash@{2}
或者只应用第一个藏匿:-
git隐藏弹出
**注意:**git stash pop会将stash从你的stash列表中移除,而git stash apply则不会。因此,请相应地使用它们。
zaqlnxep4#
为了简化此操作,您有两个选项来重新应用您的存储:
git stash pop
-恢复到保存的状态,但会从临时存储中删除隐藏。git stash apply
-恢复到保存的状态,并保留隐藏列表以备将来可能重用。您可以在本文中阅读有关git stashes的更多详细信息。
6ie5vjzr5#
在Mac上,这对我很有效:
git stash list(查看您的所有stash)
git stash apply(只从你的stash列表中选择你想要的数字)
就像这样:
rjzwgtxy6#
您可以在git bash中使用一个命令
wlsrxk517#
您可以使用以下方法隐藏未提交的更改:
然后使用以下命令 checkout 到新分支:
然后应用隐藏的提交:
kkbh8khc8#
正如很多人所说,执行
git stash apply stash@{1}
将获得当前分支上的更改,我不知道为什么这对我不起作用。对我来说,做
git stash apply stashNumber
一直都是有效的。例如-如果我想检索1号存储,那么这就是如何实现的-
git stash apply 1
PS:你可以用
pop
来代替apply
。唯一的区别是apply
不会删除隐藏的号码,但是pop
会删除你弹出的隐藏号码。