编辑:此问题不“如何恢复到之前的提交”。
假设我的master
看起来像这样:
A B C D
假设我想将提交B
推送到origin/master
而不重置它并丢失提交C
和D
。
这是我使用普通git reset --hard
得到的,但就像我说我在B
之后失去了任何提交,所以这没有用:
A B
相反,我希望提交链看起来像这样:
A B C D B
这可能吗?换句话说,我想让本地文件与提交B
匹配,然后提交它们,而不重置链。新提交在技术上将提交E
,但它的文件将与提交B
相同。
由于这将由自动脚本运行,我不想使用分支,可能会创建一个乌鸦巢。
答案 0 :(得分:0)
我想我可能已经找到了解决方案。在寻找解决方案时,我发现这也可以被认为是"如何提交一个分离的头部"。这通常被认为是不好的,git并不希望你这样做,因为你会删除其他人的任何其他提交。
然而,由于没有人从这个回购中撤出并进行更改,因此不会有任何覆盖其他任何人工作的风险。唯一的提取是自动从Web服务器。
所以步骤是:
git reset --hard master
摆脱任何会导致脚本崩溃的未提交的更改。
git checkout B
这会将文件更改为正确的提交。
git reset --soft master
这会将HEAD更改为master
,但会将文件保留为提交B
git checkout master
这解决了"分离的HEAD"让我们回到树的尖端问题,但由于上一个命令已经让我们回到那里,没有文件被更改。
此时我们可以像普通一样添加和提交,git将提交补丁本质上从提交master
到B
。
我必须做更多的测试,以确保它能按照我的预期运作。