git 如何恢复隐藏的未提交更改

omjgkv6w  于 2022-11-27  发布在  Git
关注(0)|答案(8)|浏览(354)

我在开发分支中有一些未提交的更改,我使用git stash将它们隐藏起来,但是在这些隐藏的更改中有一些非常重要的更改。有没有办法恢复这些更改?
此外,我还对隐藏的代码文件做了一些修改。
如果可能的话,我是否有机会将隐藏的更改检索到一个新的分支?

vwkv1x7d

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,但有时会出现以下错误:

Conflicts in index.  Try without --index.

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

要记住的主要一点是,"stash"* 是 * 一个提交,它只是一个稍微"有趣/怪异"的提交,而不是"在一个分支上"。apply操作查看提交更改了什么,并试图在你现在所在的任何地方重复它。stash仍然会在那里(apply保持它在周围),所以你可以更多地看它,或者决定这是错误的地方apply它,并再次尝试不同的,或什么。
任何时候你有了一个stash,你都可以使用git stash show -p来查看stash中的内容的简化版本(这个简化版本只查看"最终工作树"的更改,* 而不是 * --index单独恢复的已保存索引的更改)。
即使你已经做了一些修改,apply命令也很乐意将一个stash应用到一个 * modified * 工作树(或者至少尝试应用它)。例如,你可以这样做:

git stash apply stash      # apply top of stash stack
git stash apply stash@{1}  # and mix in next stash stack entry too

你可以在这里选择“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.创建一个新分支,最后

  1. x1米60英寸
    这就是git stash branch *newbranch*所做的。(然后,它会删除成功应用的stash。)

关于--index的最后几句话(这到底是什么?)

--index的功能很容易解释,但内部有点复杂:

  • 当您有变更时,您必须在commit-ing之前先进行git add(或“stage”)。
  • 因此,当您执行git stash时,您 * 可能 * 编辑了foozorg两个档案,但只暂存其中一个档案。
  • 因此,当您要求取回存储时,如果它是git addadded内容,而 * 不是 * git add的非添加内容,这可能会很好。也就是说,如果您是add-ed foo,而不是在您执行stash之前的zorg,那么拥有完全相同的设置可能会很好。应该再次上演;已修改但未回写的内容应再次修改但未回写。

apply--index标志试图这样设置。如果你的工作树是干净的,这通常是正确的。如果你的工作树已经有了add-艾德的东西,你可以看到这里可能会有一些问题。如果你省略了--indexapply操作不会试图保留整个staged/unstaged设置。相反,它只是调用Git的合并机制,使用"stash bag"中的工作树提交。如果你不关心保留staged/unstaged,忽略--index可以使git stash apply更容易地完成它的任务。

fjaof16o

fjaof16o2#

git stash pop

我会让一切恢复原状
正如注解中所建议的,您可以使用git stash branch newbranch将stash应用到一个新的分支,这与运行:

git checkout -b newbranch
git stash pop
2nbm6dog

2nbm6dog3#

要检查您的隐藏内容:-
git隐藏列表
从存货清单中应用特定的存货编号:-
git stash应用stash@{2}
或者只应用第一个藏匿:-
git隐藏弹出

**注意:**git stash pop会将stash从你的stash列表中移除,而git stash apply则不会。因此,请相应地使用它们。

zaqlnxep

zaqlnxep4#

为了简化此操作,您有两个选项来重新应用您的存储:

  1. git stash pop-恢复到保存的状态,但会从临时存储中删除隐藏。
  2. git stash apply-恢复到保存的状态,并保留隐藏列表以备将来可能重用。
    您可以在本文中阅读有关git stashes的更多详细信息。
6ie5vjzr

6ie5vjzr5#

在Mac上,这对我很有效:
git stash list(查看您的所有stash)

git stash list

git stash apply(只从你的stash列表中选择你想要的数字)
就像这样:

git stash apply 1
rjzwgtxy

rjzwgtxy6#

您可以在git bash中使用一个命令

git stash pop
wlsrxk51

wlsrxk517#

您可以使用以下方法隐藏未提交的更改:

git stash

然后使用以下命令 checkout 到新分支:

git checkout -b

然后应用隐藏的提交:

git stash apply
kkbh8khc

kkbh8khc8#

正如很多人所说,执行git stash apply stash@{1}将获得当前分支上的更改,我不知道为什么这对我不起作用。
对我来说,做git stash apply stashNumber一直都是有效的。
例如-如果我想检索1号存储,那么这就是如何实现的-git stash apply 1
PS:你可以用pop来代替apply。唯一的区别是apply不会删除隐藏的号码,但是pop会删除你弹出的隐藏号码。

相关问题