我们都知道,您可以使用git revert --no-commit
撤消特定更改的更改。这会更新工作副本和索引,但不会提交恢复。有没有办法进一步采取这一步只更新工作副本而不更新索引? (即改变将是不明显的)。我知道您可以使用git checkout
来获取特定提交的工作副本,但这也会创建一个分离的头。我只想用恢复的更改来更新工作副本。
答案 0 :(得分:3)
您可以使用临时索引保持原始索引不受干扰:
true_index=$(git rev-parse --git-dir)/index
export GIT_INDEX_FILE=.mytmpindex
cp "$true_index" .mytmpindex
git revert -n <some-commit-id>
rm .mytmpindex
unset GIT_INDEX_FILE
如果您没有希望保留的分阶段更改,则可以执行以下操作:
git revert -n <some-commit-id>
git reset
答案 1 :(得分:2)
如果您想要访问的树状态已经存在于您的历史记录中(例如,您正在恢复最新提交并且绝对希望以这种方式执行),只需连续使用两个重置:
wished_index=$(git rev-parse HEAD)
git reset --hard $wished_tree
git reset $wished_index
如果没有,您仍然可以使用revert
,之后您只需要修改索引:
git revert $commit
git reset HEAD^
两种方式都需要一个干净的工作树(否则git stash
到达那里)并留下一个肮脏的树。