我在我的开发分支中有一些未提交的更改,我使用git stash将它们隐藏起来,但在这些隐藏的更改中有一些非常重要的更改。有什么办法能把这些改变拿回来吗?
此外,我在存储的代码文件上做了一些更改。
如果可能的话,我是否有机会将存储的更改检索到新的分支?
我在我的开发分支中有一些未提交的更改,我使用git stash将它们隐藏起来,但在这些隐藏的更改中有一些非常重要的更改。有什么办法能把这些改变拿回来吗?
此外,我在存储的代码文件上做了一些更改。
如果可能的话,我是否有机会将存储的更改检索到新的分支?
git stash pop
一切都会恢复正常吗
正如评论中所建议的,你可以使用git的stash分支newbranch将stash应用到一个新的分支,这与运行相同:
git checkout -b newbranch
git stash pop
简单问题的简单答案是git stash apply
只需签出你想要更改的分支,然后git stash apply。然后使用git diff查看结果。
当你所有的改变都完成后——应用看起来很好,你确定你不再需要stash了——然后使用git stash drop来摆脱它。
我总是建议使用git stash apply而不是git stash pop。不同之处在于apply留下了隐藏的地方,以便于重新尝试apply,或查看,等等。如果pop能够提取stash,它也会立即删除它,如果您随后意识到您想在其他地方(在不同的分支中)提取它,或者使用——index或其他类似的方法,这就不那么容易了。如果你申请了,你可以选择什么时候放弃。
不过,这些都是非常小的,对于Git新手来说,应该是差不多的。(你可以跳过这一切!)
如果你做的是更高级或更复杂的事情呢?
可以说,至少有三到四种不同的“使用git stash的方法”。以上是“方法1”,也就是“简单的方法”:
您从一个干净的分支开始,正在进行一些更改,然后意识到您在错误的分支中执行这些更改。您只是想将现在拥有的更改“移动”到另一个分支。
这是上面描述的简单情况。运行git stash save(或普通git stash,相同的事情)。查看其他分支,并使用git stash apply。这将使Git使用Git相当强大的合并机制合并早期的更改。仔细检查结果(使用git diff),看看你是否喜欢它们,如果你喜欢,使用git stash drop来drop stash。你已经完成了!
你开始做一些改变,然后把它们藏起来。然后您切换到另一个分支并开始更多的更改,忘记了您已经存储了这些更改。
现在,您希望保留甚至移动这些更改,并应用您的存储。
事实上,你可以再次保存git stash,因为git stash会做出“堆栈”的更改。如果你这样做,你有两个存储,一个叫stash -但你也可以写stash@{0}和一个拼写为stash@{1}。使用git隐藏列表(在任何时候)来查看它们。最新的总是编号最低的。当你git stash drop时,它会删除最新的,而原来是stash@{1}的会移到堆栈顶部。如果你有,甚至,原来的stash@{2}变成了stash@{1},以此类推。
你也可以应用然后删除一个特定的stash: git stash apply stash@{2},等等。删除特定的存储只会重新编号较高的存储。同样,没有数字的也是stash@{0}。
如果你堆了很多藏宝,它可能会变得相当混乱(我想要的藏宝是stash@{7}还是stash@{4}?)等等,我刚刚又推了一个,现在他们是8和5了?)我个人更喜欢将这些更改转移到一个新的分支,因为分支有名称,12月清理尝试对我来说比stash@{12}更重要。(git stash命令接受一个可选的保存消息,这些消息可能有帮助,但不知为何,我所有的存储都以分支上的WIP命名。)
(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
要记住的主要事情是“stash”是一个提交,它只是一个不“在分支上”的稍微“有趣/奇怪”的提交。apply操作查看提交更改的内容,并尝试在您现在所在的位置重复它。存储仍然会在那里(apply保留它),所以您可以更多地查看它,或者确定这是应用它的错误位置,并重新尝试不同的地方,等等。
任何时候你有一个存储,你都可以使用git stash show -p来查看存储的简化版本。(这个简化版本只查看“最终工作树”的更改,而不是保存的索引更改——index单独恢复。)命令git stash apply,没有——index,只是尝试在你的工作树中做同样的改变。
即使您已经进行了一些更改,这也是正确的。apply命令很乐意将隐藏应用到修改后的工作树(或者至少尝试应用它)。例如,你可以这样做:
git stash apply stash # apply top of stash stack
git stash apply stash@{1} # and mix in next stash stack entry too
您可以在这里选择“应用”顺序,选择特定的存储以特定的顺序应用。然而,请注意,每次你基本上都在做“git合并”,正如合并文档警告的那样:
运行git合并非平凡的未提交的更改 气馁:虽然有可能,但它可能会让你处于一种艰难的状态 退出:在发生冲突时退出
如果你从一个干净的树开始,只是做几个git apply操作,很容易退出:使用git reset——很难回到干净的状态,改变你的apply操作。(这就是为什么对于这些复杂的情况,我建议先从一个干净的工作树开始。)
那最坏的情况呢?
假设你正在做很多高级Git的事情,你已经创建了一个stash,并且想要Git stash apply——index,但它不再可能应用保存的stash与——index,因为分支已经从你保存它的时候发散了太多。
这就是git stash分支的用途。
如果你:
那么,看看你在最初的时候到底是在做什么 创建一个新分支,最后 Git stash应用——index
重新创造变化的尝试肯定会奏效。这就是git stash branch newbranch所做的。(然后它会因为成功应用而删除隐藏。)
关于index(这到底是什么?)
index的作用解释起来很简单,但内部有点复杂:
When you have changes, you have to git add (or "stage") them before commit-ing. Thus, when you ran git stash, you might have edited both files foo and zorg, but only staged one of those. So when you ask to get the stash back, it might be nice if it git adds the added things and does not git add the non-added things. That is, if you are add-ed foo but not zorg back before you did the stash, it might be nice to have that exact same setup. What was staged, should again be staged; what was modified but not staged, should again be modified but not staged.
The --index flag to apply tries to set things up this way. If your working tree is clean, this usually just works. If your working tree already has stuff add-ed, though, you can see how there might be some problems here. If you leave out --index, the apply operation does not attempt to preserve the whole staged/unstaged setup. Instead, it just invokes Git's merge machinery, using the working tree commit in the "stash bag". If you don't care about preserving staged/unstaged, leaving out --index makes it a lot easier for git stash apply to do its thing.
简单来说,你有两个选择来重新应用你的收藏:
git stash pop -恢复到保存状态,但它会从临时存储中删除stash。 git stash apply -恢复到保存的状态,并留下存储列表,以便以后可能重用。
您可以在本文中阅读更多关于git存储的详细信息。
检查您的藏匿内容:-
Git藏匿清单
从收藏列表中应用一个特定的收藏:-
Git应用stash@{2}
或者只应用第一藏:-
Git隐藏pop
注意:git stash pop将从你的stash列表中删除stash,而git stash apply惯有。所以要相应地使用它们。
在mac上,这对我来说很管用:
Git存储列表(查看你所有的存储)
git stash list
Git stash应用(只是你想从你的stash列表的数字)
是这样的:
git stash apply 1
你可以使用以下方法来隐藏未提交的更改:
git stash
然后使用以下命令签出到一个新的分支:
git checkout -b
然后应用存储的提交:
git stash apply
就像很多人说的那样,做git stash apply stash@{1}将获得当前分支的更改,我不知道为什么这对我不起作用。
对我来说,做git stash应用stashNumber工作的所有时间。
举个例子,如果我想找回1号藏匿点这就是我要做的,git藏匿应用1
PS:你可以用pop代替apply..唯一的区别是,apply不会删除隐藏,但做pop将删除stashnnumber你要弹出。