git - 重新排序提交的修订(快照)不是差异

时间:2016-03-17 13:40:02

标签: git commit rebase git-rewrite-history

假设我已经提交了A,它引入了一些代码泛化(一些额外的行(表示为+L1))和一个新的特征(一些额外的行(表示为+L2))。在那之后我意识到最好分成两个提交,分别引入+ L1和+ L2,所以我确实切了-L2行并将其作为B.现在我想要的是重新排列A和B为代码状态,而不是差异。使用rebase重新排序显然会产生冲突,因为我首先尝试删除不存在的-L1,然后添加+ L1 + L2。

换句话说,我想做什么:

  1. 结帐一些提交,但留在旧HEAD。
  2. 暂存所有必要的文件。
  3. 提交
  4. 这些步骤基本上可以用快照而不是差异来编写历史记录。

    问题在于第1步 - 我不知道该怎么做。

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选项是可以抛出未提交更改的少数危险行为之一,但只要在某些时候您的代码已经提交,您就可以随时返回它。