【问题标题】: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。

也就是说,我想做什么:

  1. 签出一些提交,但留在旧的 HEAD。
  2. 暂存所有必要的文件。
  3. 提交

这些步骤基本上可以根据快照而不是差异来编写历史记录。

这里的问题在于第 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 选项是少数几个可能会抛出未提交更改的危险动作之一,但只要您的代码已提交,您就可以随时返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多