使用与git-reset
手册页中相同的表格表示,我在git
存储库中有这些状态:
working index HEAD
------------------
B B A
什么命令会改变状态?
working index HEAD
------------------
A B A
换句话说,我想将工作目录状态“重置”到HEAD
状态,但不要触及暂存区状态。
答案 0 :(得分:2)
我认为这应该有效(订购事宜)。
首先需要提交索引中的内容(使HEAD看起来像这个索引和工作目录:B - 使用您的注释):
git commit
因此,HEAD将是B(使用您的注释)。
现在,打印reflog,因为我们需要B的哈希:
git reflog
现在,使用不同的选项运行几个reset
命令:
git reset --hard HEAD~ # makes the working directory, the index, and the HEAD looks like this: A, A, A (respectively)
git reset --mixed <hashOfB> # makes the working directory, the index, and the HEAD looks like this: A, B, B (respectively)
git reset --soft HEAD~ # makes the working directory, the index, and the HEAD looks like this: A, B, A (respectively)
我希望这会有所帮助。
答案 1 :(得分:1)
正如在this thread中讨论的那样,我最初想的是关于git checkout但是:
FWIW,我对该指数的理解是它是移动的中间人 从工作树到对象存储的东西以及用于移动东西的东西 对象存储到工作树。
因此,当您签出blob时,它首先会从对象存储区复制到索引,然后从索引复制到工作树。
所以(同一个线程)
如果您想绕过索引,可以使用
cat-file
或show
执行此操作;它只是在构建下一个的正常工作流程中不是一个有用的操作 提交当前的那个,这就是为什么存在的唯一原因 没有选项,例如“checkout --no-index HEAD~47 path
”。如果有人 可以编写一个令人信服的用例,说明它为什么有用,这样的 选项不应该很难添加。
git show @:myFile > myFile
您可以直接从文件所在的文件夹中执行此操作,并使用相对路径:
git show @:./myFile > myFile
答案 2 :(得分:1)
以下是一种逐个文件执行此操作的方法:
# for each staged file :
git show A:path/to/file > path/to/file
git show A:path/to/file
将在提交A
中输出所述文件的内容。
不完全符合您的要求:使用git stash
,您可以在藏匿处保留当前索引的备份:
# optional : stash away modifications which are *not* in index
$ git stash --keep-index
# 'git stash save' is the same as 'git stash',
# it only allows to put a more explicit message
$ git stash save "index while working on A"
$ git stash list
stash@{0}: On master: index while working on A
stash@{1}: WIP on master: 57632bc first
# you can access your index by using stash@{0} :
# git show stash@{0}:file
# git checkout stash@{0} .
# git stash apply
# etc ...
答案 3 :(得分:1)
执行此操作的方法是在执行git checkout
之前和之后手动备份和恢复索引:
cp .git/index .git/index.bak
git checkout HEAD -- .
mv .git/index.bak .git/index