5

我手头没有具体的问题,但我在过去遇到过一些我不小心炸毁索引的情况,并希望我可以回到给定文件的先前状态,该状态在某个时候被索引。

一些示例是:

$ git add <file>
# find out that I already had an indexed version of <file>,
# and that for some reason I shouldn't have added the extra modifications

$ git stash pop
# find out afterwards that I have a mix of "the index I had"
# and "the index in the stash"

$ git stash
# with an active index, which is now mixed with the state of the working tree

$ git reset <typo>
# accidentally resetting the wrong file, or the whole directory

可以求助于挖掘git fsck --full --unreachable --no-reflog(如建议here),我想知道是否有更方便的方法来做到这一点。

问题 :

索引是否有某种 reflog ?

4

2 回答 2

3

reflog 包含 refs 的条目......而不是索引。

但是,也许工作流程调整是这里的答案......(这是给我的)。

如果工作时间超过 5-10 分钟,请随用随提交(并在推送之前进行清理)。否则,即兴表演

index很棒……我整天都在用它!但只有当我知道我将在一两分钟内提交(基本上是原子工作流操作)时,我才会真正使用它。这是因为我害怕我会做一些愚蠢的事情并吹走我的索引。

在我工作的时候,每当我达到一个小里程碑时,我都会进行一次私人提交,通常在我有机会先进行一些清理之前不会推送。在解决特定问题时,我会不断做出承诺,通常会进行修改。

然后,一旦我真正达到了一个稳定的点,我想创建一个公共提交,我将(如果需要)我所有的小 wip 提交压缩在一起,给出一个很好的提交消息并推送。

如果需要,这提供了在我的 reflog 中创建小面包屑的巨大优势。

这是我的工作流程:

# start work
git checkout -b featurea
# work
vim file.txt
# reach a little milestone
git commit -a -m "working on feature..."
# work some more
vim file.txt
# reach another little milestone
git commit -a --reuse-message=HEAD --amend
# work some more
vim file.txt
# another little milestone...
git commit -a --reuse-message=HEAD --amend
# finishing touches...
vim file.txt
# ok, done now, put everything back in working dir so I can review
git reset HEAD~
# decide what goes in this commit
# perhaps use `git add -p`
git add file.txt
# give a nice commit message (use editor)
git commit
# now merge to master and push with confidence!

这可能看起来像很多打字,但如果你擅长在 shell 上飞行(利用set -o emacs或者set -o vi是一个好方法),那么这种方法几乎是即时的。

如果我正在做的事情确实是一个非常快速的解决方案,我通常只会使用即用即用的方法,但任何比这更长的时间我都需要在我进行时填充我的 reflog 的安全性。

于 2016-07-06T12:33:32.260 回答
1

不,索引没有 reflog。您将不得不按照您在命令中git fsck使用或不使用--lost-found标志的方式来解决问题。

您可以使用文件的时间戳 (SHA-1) 按创建日期对文件进行“排序”,并根据文件创建时间进行一些基本的 reflog。

于 2016-07-06T12:26:21.937 回答