假设我有一个包含8次提交和一个分支(master)的线性git历史:
我想把master移到4(我可以用git branch -f master 4
来做):
现在工作树处于状态4。
现在我想将来自4 -> 8
的更改作为补丁应用到我的工作树。
也就是说,在不影响.git文件夹状态的情况下,我想将4->8
unstaged的更改应用到我的工作树。在此之后,工作树应该处于状态8,但提交状态和主分支应该处于状态4。
换个说法就是:假设在将master移到4之后,我手动地对我的工作树进行了从4->8的更改,而没有将它们添加到索引中。结果应该是一样的。
最简单的方法是什么?
6条答案
按热度按时间c9x0cxw01#
我知道我迟到了,但作为其他人的参考,我认为最简单的方法是:
git cherry-pick --no-commit 4..8
xe55xuns2#
[edit:下面的注解中的下一个跳过制作单个补丁文件]
pgvzfuti3#
在您的情况下,如果您实际上并不关心“未登台”的部分,那么最简单的做法可能是
这将更新你的树和索引来匹配commit 8,而不会改变你的commit历史。然后,您可以
git reset
放弃索引更改。如果你真的不想让索引文件受到干扰,那么它会稍微复杂一些,因为git总是从索引更新工作树。你可以这样做
这将使用路径
/tmp/foo
作为此命令的临时索引文件。然后,您可能希望删除此文件。在一个更复杂的情况下,如果你想重新应用补丁,而这些补丁实际上并不能把你带回到commit 8的精确状态,你可以使用
git cherry-pick --no-commit commit1 commit2 ...
来按顺序应用提交。当然,这仍然会修改索引。j2cgzkjk4#
使OP的状态发生:
这样,我们就处于OP的状态:
所以,现在有一个简单的命令,可以将OP的当前状态带到OP的期望状态:
现在我们正处于我们想要的位置:
所以,在OP的当前状态和OP的期望状态之间只有一个命令(
git restore --source=tip .
)--假设Git的版本足够新。1mrurvl15#
就是你所需要的。它读作“checkout the files that the commit that master was pointed to one time ago”。查看
git reflog
以了解其工作原理。此外,您不应该像以前那样强制重新创建分支。这将允许git跟踪master曾经指向的所有位置。使用方式
如果你在工作目录中有一些工作。然后
或
qni6mghb6#
你的工作树必须是干净的