我有一个分支,我已经工作了好几天。大量的提交,并在此过程中合并了几次 master。现在我想在多个分支中展示工作以供审查。
所以我想得到一个等于 master 的分支,但我的所有工作都标记为准备好提交。然后,我将从一些文件中选择一些行,创建一个提交和一个 PR,然后创建一个新分支并提交更多内容。我很高兴(甚至更愿意(丢失所有以前的提交。
我可以看到它将使用--soft
但不确定如何使用。
简单的部分是进入您要求的状态。 您想从检查分支开始,但从分支分离(因此重置时它将保持原位,以便在出现任何问题时轻松恢复(。
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
这将为您提供一个带有待办事项列表的编辑器,例如
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
,它会有点棘手(多个变基命令(,但仍然可行。
您可以在 https://git-scm.com/docs/git-rebase 中找到有关变基的更多详细信息
这种方法有缺点。 新创建的提交未经测试,因此如果您想要一个干净的存储库,则应测试每个提交。 使用变基解决冲突可能更具挑战性,因为每次提交都是在几乎像单独的合并操作中重播的。
但这是另一种需要考虑的选择,就像我说的,这似乎是一种更常见的方法。