Git 还原与解压

Git 还原与解压,git,Git,众所周知,您可以使用git revert--no commit撤消特定更改中的更改。这会更新工作副本和索引,但不会提交恢复。有没有办法更进一步,只更新工作副本而不更新索引?(即,更改将不被更改)。我知道您可以使用git checkout获取特定提交的工作副本,但这也会创建一个分离的头部。我只想用还原的更改更新工作副本。您可以使用临时索引使原始索引不受干扰: true_index=$(git rev-parse --git-dir)/index export GIT_INDEX_FILE=.myt

众所周知,您可以使用git revert--no commit撤消特定更改中的更改。这会更新工作副本和索引,但不会提交恢复。有没有办法更进一步,只更新工作副本而不更新索引?(即,更改将不被更改)。我知道您可以使用
git checkout
获取特定提交的工作副本,但这也会创建一个分离的头部。我只想用还原的更改更新工作副本。

您可以使用临时索引使原始索引不受干扰:

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
true\u index=$(git rev parse--git dir)/index
导出GIT_索引_文件=.mytmpindex
cp“$true_index”,mytmpindex
git-n
rm.mytmpindex
取消设置GIT\u索引\u文件
如果您没有要保留的阶段性更改,您只需执行以下操作:

git revert -n <some-commit-id>
git reset
git还原-n
git重置

如果您想要达到的树状态已经存在于您的历史记录中(例如,您正在还原最新的提交,并且绝对希望这样做),只需在一行中使用两次重置:

wished_index=$(git rev-parse HEAD)
git reset --hard $wished_tree
git reset $wished_index
如果没有,您仍然可以使用
还原
,之后只需修复索引:

git revert $commit
git reset HEAD^

这两种方法都需要一个干净的工作树(否则,
git-stash
才能到达那里),而留下一个脏树。

你是说
git-revert--no-commit
?@JB.:
git-checkout--
将提取旧文件,但“写入”索引,将更改暂存。然后您必须使用git reset来取消阶段性更改。@torek啊,对了。还有什么<代码>git cat文件和一点手写管道?我不知道有哪个命令直接从repo到working tree,或者做一个额外的克隆并检查旧版本,也许吧。最初的
git reset
的目的是什么?@ExplosionPills:它是为了构建新的索引文件,但它可能更快,更符合您只需复制当前真实索引的内容,所以我对其进行了编辑。这很酷,但这比只执行
git revert-n
然后执行
git reset
(可能使用
--soft
)更复杂/步骤更多。这种方法有什么好处吗?但是
git reset--soft
不会恢复原始索引,而且
git reset
也不会,因为它会将其重置为当前的
HEAD
。(正如您所指出的,
git revert-n
会影响您当前的索引。);这通常是通过一个干净的工作副本来完成的。它会丢失原始索引中未提交的更改。但是OP知道如何使用
git-stash
。但是你没有使用git-stash?此外,您还遗漏了创建“愿望树”的部分。不太可能已经有一棵树表示对当前索引的给定提交的还原。