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

  • 本文关键字:相对于 重置 Git git
  • 更新时间 :
  • 英文 :


我有一个分支,我已经工作了好几天。大量的提交,并在此过程中合并了几次 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

然后,例如,您可以对其进行编辑以将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,它会有点棘手(多个变基命令(,但仍然可行。

您可以在 https://git-scm.com/docs/git-rebase 中找到有关变基的更多详细信息

这种方法有缺点。 新创建的提交未经测试,因此如果您想要一个干净的存储库,则应测试每个提交。 使用变基解决冲突可能更具挑战性,因为每次提交都是在几乎像单独的合并操作中重播的。

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

最新更新