假设我已经提交了A,它引入了一些代码泛化(一些额外的行(表示为+L1
))和一个新的特征(一些额外的行(表示为+L2
))。在那之后我意识到最好分成两个提交,分别引入+ L1和+ L2,所以我确实切了-L2行并将其作为B.现在我想要的是重新排列A和B为代码状态,而不是差异。使用rebase重新排序显然会产生冲突,因为我首先尝试删除不存在的-L1,然后添加+ L1 + L2。
换句话说,我想做什么:
这些步骤基本上可以用快照而不是差异来编写历史记录。
问题在于第1步 - 我不知道该怎么做。
答案 0 :(得分:0)
您可以使用git reset SHA
。默认的--mixed
模式会将您的分支和HEAD
移动到指定的提交,但将文件保留为当前磁盘上的文件。从那里,你可以git add --patch
个文件来创建你想要的提交,然后根据需要重复。
EG。如果您的存储库看起来像:
- A - B - C master
git reset A
会将master
移回A
,但您的文件不会被修改 - 他们仍会拥有自A
以来您所做的所有更改,即使您在提交C
后进行了更多编辑。
在开始之前记下您当前的提交哈希(或使用git reflog
),以防出现问题并且您想重新开始。在这种情况下,git reset --hard SHA
会再次移动您的分支,并将所有跟踪的文件设置回SHA
的方式。 --hard
选项是可以抛出未提交更改的少数危险行为之一,但只要在某些时候您的代码已经提交,您就可以随时返回它。