将git提交应用到工作树而不添加?

将git提交应用到工作树而不添加?,git,Git,假设我有一个8次提交和一个分支(主分支)的线性git历史: 我想将master移动到4(我可以使用git branch-f master 4执行此操作): 现在,工作树处于状态4 现在我想将4->8中的更改作为补丁应用到我的工作树中 也就是说,在不影响.git文件夹状态的情况下,我希望将4->8unstage中的更改应用于我的工作树。在此之后,工作树应处于状态8,但提交状态和主分支应处于状态4 另一种说法是:在将master移动到4之后,我手动将4->8的更改添加到我的工作树中,而没有将它们添加

假设我有一个8次提交和一个分支(主分支)的线性git历史:

我想将master移动到4(我可以使用git branch-f master 4执行此操作):

现在,工作树处于状态4

现在我想将
4->8
中的更改作为补丁应用到我的工作树中

也就是说,在不影响.git文件夹状态的情况下,我希望将
4->8
unstage中的更改应用于我的工作树。在此之后,工作树应处于状态8,但提交状态和主分支应处于状态4

另一种说法是:在将master移动到4之后,我手动将4->8的更改添加到我的工作树中,而没有将它们添加到索引中。结果应该是一样的


最简单的方法是什么?

在您的情况下,如果您实际上不关心“未老化”位,最简单的方法可能是

git checkout 8 -- .
这将更新您的树和索引以匹配commit 8的树和索引,而不更改您的提交历史记录。然后可以
git reset
放弃索引更改

如果您真的希望不干扰索引文件,那就稍微复杂一些,因为git总是从索引更新工作树。你可以这样做

GIT_INDEX_FILE=/tmp/foo git checkout 8 -- .
这将使用路径
/tmp/foo
作为此命令的临时索引文件。之后,您可能需要删除此文件


在更复杂的情况下,如果您希望重新应用补丁程序,而这些补丁程序实际上不会使您回到提交8的精确状态,则可以使用
git cherry pick--no commit commit1 commit2…
按顺序应用提交。当然,这仍然会修改索引

git format-patch 4..8 | xargs git apply
[编辑:下面评论中的下一个将跳过制作单个修补程序文件]

git diff 4..8 | git apply
这就是你所需要的。它的内容是“签出主机在一次之前指向的提交文件”。签出git reflog查看其工作原理

此外,您不应该像以前那样强行重新创建分支。这将允许git跟踪master过去指向的所有位置。使用

git stash -u 
以防您在工作目录中有一些工作。然后

git reset --hard master^^^^

你的工作树必须是干净的

git help cherry-pick

我知道我参加聚会迟到了,但我想最简单的方法就是:


git cherry pick--no commit 4..8

或者,同样地,
git diff 4..8 | git apply
“这将允许git跟踪master过去指向的所有位置。”-这是什么意思?你能再解释一下这个跟踪吗?他说他想应用未老化的更改。签出将暂存它们。然后再加上
git reset
,以取消暂存更改。
git stash -u 
git reset --hard master^^^^
git reset --hard master~4
git cherry-pick master~4 master~5 master~6 master~7 master~8
git help cherry-pick