【问题标题】:git -- reorderging commits in terms of revisions (snapshots) not diffsgit - 根据修订(快照)而不是差异重新排序提交
【发布时间】:2016-07-03 21:39:09
【问题描述】:
假设我有提交 A,它引入了一些代码泛化(一些额外的行(表示为 +L1))和一个新功能(再次添加一些额外的行(表示为 +L2))。之后我意识到最好将其分成两个提交分别引入 +L1 和 +L2,所以我确实剪切了 -L2 行并将其提交为 B。现在我想要将 A 和 B 重新排列为 代码状态,而不是差异。使用 rebase 重新排序显然会产生冲突,因为基本上我首先尝试删除不存在的 -L1,然后添加 +L1 +L2。
也就是说,我想做什么:
- 签出一些提交,但留在旧的 HEAD。
- 暂存所有必要的文件。
- 提交
这些步骤基本上可以根据快照而不是差异来编写历史记录。
这里的问题在于第 1 步——我不知道该怎么做。
【问题讨论】:
标签:
git
commit
rebase
git-rewrite-history
【解决方案1】:
您可以为此使用git reset SHA。默认的--mixed 模式会将您的分支和HEAD 移动到指定的提交,但将您的文件保留为当前在磁盘上。从那里,您可以git add --patch 文件片段来创建您想要的提交,然后根据需要重复。
例如。如果您的存储库如下所示:
- A - B - C master
git reset A 会将master 移回A,但您的文件不会被修改 - 它们仍会保留您自A 以来所做的所有更改,即使您在提交后进行了更多编辑C.
在开始之前记下您当前的提交哈希(或使用git reflog),以防出现问题并且您想重新开始。在这种情况下,git reset --hard SHA 将再次移动您的分支并将所有跟踪的文件设置回它们在SHA 的方式。 --hard 选项是少数几个可能会抛出未提交更改的危险动作之一,但只要您的代码已提交,您就可以随时返回。