【问题标题】:Recover stage state after reset复位后恢复阶段状态
【发布时间】:2019-09-13 12:50:53
【问题描述】:

git reset --mixed 之后,我之前暂存的新文件变为未暂存。
是否可以恢复 git reset 执行之前的阶段状态?

【问题讨论】:

  • 可能的,使用git fsck --lost-found,它将未引用的 blob 放入可以检查它们的子目录中。不过,这通常比重新创建它们要困难得多,因为往往有很多这样的 blob,并且 所有 名称都被破坏了,而且很难弄清楚lost+found 中的哪些文件是哪些。
  • @torek 我并没有丢失我的文件,它们只是没有暂存
  • 请注意,--lost-found 选项不仅适用于 files,它还可以查找悬空提交。但是,您确实丢失了暂存区中的副本。但这就是为什么所有这些都是评论而不是答案的原因——这些都是围绕“暂存区”如何真正运作的一般概念的外围内容。具体来说,该阶段包含进入下一次提交的每个 文件的副本。当您使用 git reset --mixed 时,您是在告诉 Git:删除其中的副本,然后放入来自 HEAD 的副本。

标签: git reset stage


【解决方案1】:

不幸的是,git 不会自动存储暂存历史记录,没有直接的方法可以将索引恢复到之前的状态。


在未来,您可以采取以下措施:

  • 更频繁地提交
  • 一个变体:提交然后回滚:

    # add stuff :
    git add ... / git add -p ...
    
    git commit -m "work in progress"
    git reset --soft HEAD^
    

    这会将创建的提交添加到当前分支的 reflog 中,
    使用git reset --soft 将保留暂存区

  • 使用git stash && git stash apply
    git stash 创建两个提交:

    1. 一个用于暂存区的内容,
    2. 一个用于所有修改文件的内容

这是命令的输出:

$ git stash && git stash apply
Saved working directory and index state WIP on master: 7475d1d {message}
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
[...]

这是隐藏提交的样子:

    $ git log --oneline --graph stash@{0}
    *   79d9cd7 (refs/stash) WIP on master: 7475d1d {message} # <- full stash
    |\  
    | * 43f3da0 index on master: 7475d1d {message}            # <- staging area's content
    |/  
    *   7475d1d (HEAD -> master, origin/master) {message}     # <- current active commit
    |\
    ...

【讨论】:

    【解决方案2】:

    您可以重新添加文件:

    git add path/to/the/file
    

    如果只有部分文件被暂存,您可以补丁添加:

    git add --patch path/to/the/file
    

    【讨论】:

    • 这是我必须做的,但是当您需要从许多不同的目录中选择性地添加许多文件并像以前一样保持其他文件未暂存时,这会很复杂。这就是为什么我想知道是否有办法以某种非手动方式恢复阶段状态。
    • @serhii AFAIK 分期没有历史记录。考虑尽早提交,不要太担心。
    • 有一些方法可以恢复已上演的内容,例如git reset --hard,但在您的情况下,您并没有丢失文件的内容,所以恐怕这无济于事git add 是这里的唯一途径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2014-04-25
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多