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

时间:2013-01-09 22:34:30

标签: git

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

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> [8=master]

我想将master移动到4(我可以使用git branch -f master 4):

1 -> 2 -> 3 -> [4=master] -> 5 -> 6 -> 7 -> 8

现在工作树处于状态4。

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

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

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

最简单的方法是什么?

5 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:4)

git format-patch 4..8 | xargs git apply

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

git diff 4..8 | git apply

答案 2 :(得分:2)

在您的情况下,如果您实际上并不关心“未分期”位,最简单的事情可能是

git checkout 8 -- .

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

如果您确实希望保持索引文件不受干扰,那么它会稍微复杂一些,因为git总是从索引中更新工作树。你可以做点什么

GIT_INDEX_FILE=/tmp/foo git checkout 8 -- .

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


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

答案 3 :(得分:0)

 git checkout master@{1} -- .

就是你所需要的。它读取“检出master之前提交的提交文件”。结帐git reflog以查看其工作原理。

此外,你不应该像你一样强行重新制作分支。这将允许git跟踪master曾经指向的所有位置。使用

git stash -u 

如果你在工作目录中有一些工作。然后

git reset --hard master^^^^

git reset --hard master~4

答案 4 :(得分:0)

git cherry-pick master~4 master~5 master~6 master~7 master~8

你的工作树必须是干净的

git help cherry-pick