假设我有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的更改手动更改为我的工作树,而不将其添加到索引中。结果应该是一样的。
最简单的方法是什么?
答案 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