Git重置(软)所有相对于母版的更改

时间:2018-08-09 11:39:09

标签: git

我有一个工作了几天的分支。大量提交,并在此过程中几次与master合并。现在,我想在多个分支中呈现该工作以供审查。

所以我想进入一个与master相等的分支,但我的所有工作都标记为准备提交。然后,我将从一些文件中选择一些行,创建一个提交和一个PR,然后创建一个新的分支并提交更多内容。我很高兴(确实更愿意)丢失之前的所有提交。

我可以看到它将使用--soft,但不确定如何使用。

1 个答案:

答案 0 :(得分:3)

最简单的部分是进入您请求的状态。您想从签出分支开始,但要与分支分离(因此重置后它会保留在原位,以便在出现任何问题时轻松恢复)。

git checkout --detach your_branch

然后,您只需进行重置即可。由于您要增量提交更改,因此我将使用mixed而不是soft

git reset --mixed master

所有更改仍在您的工作树中,但显示为“未暂存”;您的索引看起来像master,并且您签出了master个提交。您仍然处于分离状态,因此现在您需要创建要作为PR出现的第一个分支。

git checkout -b new_branch_1

到目前为止,一切都很好……但是现在更难了。您说过要根据行范围提交更改。所以你必须要做类似的事情

git add -i

git add -p

以交互方式暂存第一次提交中所需的代码。有关详细信息,请参见git add文档(https://git-scm.com/docs/git-add

因为这很容易变得非常乏味(并且容易出错),所以我个人不建议这样做。一种更典型的方法是对您现有分支机构进行交互式基础调整。这样,您可以压扁或以其他方式重新排列现有提交中的更改,从而充分利用了最初对提交进行分组的方式,同时仍可以在上游呈现更少,组织更好的提交。例如,如果您

x -- x -- x -- O <--(master)
 \         \
  A -- B -- M -- C -- D <--(branch)

那你可以说

git rebase -i master branch

这将为您提供一个带有TODO列表的编辑器,例如

pick A   first commit
pick B   second commit
pick C   third commit
pick D   fourth commit

然后,例如,您可以对其进行编辑以将BC合并为1个提交(BC),并将D放在BC之前

pick A   first commit
pick D   fourth commit
pick B   second commit
squash C   third commit

结果应该是

x -- x -- x -- O <--(master)
                \
                 A' -- D' -- BC <--(branch)

如果您想以独立于O的多个分支结尾,这会比较棘手(多个rebase命令),但仍然可行。

您可以在https://git-scm.com/docs/git-rebase

中找到有关变基的更多详细信息。

这种方法有一些缺点。新创建的提交未经测试,因此,如果您想要一个干净的存储库,则应该测试每个提交。通过重新部署冲突解决方案可能更具挑战性,因为每次提交都以几乎独立的合并操作进行重放。

但这是要考虑的另一种选择,就像我说的那样,这似乎是一种更常见的解决方法。