将git提交应用于未加工的工作树?

And*_*zos 12 git

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

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> [8=master]
Run Code Online (Sandbox Code Playgroud)

我想将master转移到4(我可以做git branch -f master 4):

1 -> 2 -> 3 -> [4=master] -> 5 -> 6 -> 7 -> 8
Run Code Online (Sandbox Code Playgroud)

现在工作树处于状态4.

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

也就是说,在不影响.git文件夹的状态的情况下,我想将更改从未4->8分阶段应用到我的工作树.在此之后,工作树应该处于状态8,但是提交的状态和主分支应该处于状态4.

另一种说法:假装将主人移动到4后,我手动将4-> 8的更改手动更改为我的工作树而不将其添加到索引中.结果应该是一样的.

最简单的方法是什么?

小智 14

我知道我迟到了,但是对于其他人的参考,我认为最简单的方法就是:

git cherry-pick --no-commit 4..8

  • 之后加上 `git reset` 以使更改取消暂存。 (2认同)

jth*_*ill 5

git format-patch 4..8 | xargs git apply
Run Code Online (Sandbox Code Playgroud)

[编辑:下面评论中的下一个跳过制作单个补丁文件的过程]

git diff 4..8 | git apply
Run Code Online (Sandbox Code Playgroud)

  • 或者,同样,`git diff 4..8 | git apply` (2认同)

Lil*_*ard 2

就您而言,如果您实际上并不关心“未分阶段”位,那么最简单的事情可能就是

git checkout 8 -- .
Run Code Online (Sandbox Code Playgroud)

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

如果您确实希望让索引文件不受干扰,那么情况会稍微复杂一些,因为 git 总是从索引更新工作树。你可以做类似的事情

GIT_INDEX_FILE=/tmp/foo git checkout 8 -- .
Run Code Online (Sandbox Code Playgroud)

这将使用该路径/tmp/foo作为该命令的临时索引文件。然后您可能想删除该文件。


在更复杂的情况下,您想要重新应用补丁,但实际上不会将您带回提交 8 的精确状态,您可以按git cherry-pick --no-commit commit1 commit2 ...顺序应用提交。当然,这仍然会修改索引。