我有一个工作了几天的分支。大量提交,并在此过程中几次与master合并。现在,我想在多个分支中呈现该工作以供审查。
所以我想进入一个与master相等的分支,但我的所有工作都标记为准备提交。然后,我将从一些文件中选择一些行,创建一个提交和一个PR,然后创建一个新的分支并提交更多内容。我很高兴(确实更愿意)丢失之前的所有提交。
我可以看到它将使用--soft
,但不确定如何使用。
答案 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
然后,例如,您可以对其进行编辑以将B
和C
合并为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
中找到有关变基的更多详细信息。这种方法有一些缺点。新创建的提交未经测试,因此,如果您想要一个干净的存储库,则应该测试每个提交。通过重新部署冲突解决方案可能更具挑战性,因为每次提交都以几乎独立的合并操作进行重放。
但这是要考虑的另一种选择,就像我说的那样,这似乎是一种更常见的解决方法。