如何重新定位这个分支?

How to rebase this branch?

下图由两部分组成: 第一部分 是存储库示例模型,第二部分 是我想使用 git 变基获取的存储库状态。

第二部分我没有忘记任何东西。这正是我想要的。

在那种情况下,我会选择只重建分支而不是徘徊在忍者 rebase 尝试中:

git checkout -b new-tmp1 master
git cherry-pick h i
git checkout -b new-tmp2 master
git cherry-pick j k

然后如果 new-tmp1new-tmp2 满足您的需要,只需移动旧参考:

git branch -f tmp1 new-tmp1
git branch -f tmp2 new-tmp2

如果您要操作的提交数量与图中一样小:使用cherry-pick

git checkout tmp1
# make sure you have a clean working directory before running reset --hard :
git reset --hard <e>
git cherry-pick <h> <i>

git rebase 具有 select 一系列提交的语法:

git checkout tmp1
# you need to mention <g>, the *parent* of the first commit you
# want to replay, not <h>
git rebase --onto <e> <g> tmp1

git checkout tmp2
git reset --hard <k>
git rebase --onto <e> <g> tmp2

关于 git reset --hard 的注释:

git reset --hard <target> 是少数几个危险的 git 命令之一,它可以从您的磁盘中删除修改,而无需先将它们保存在某个地方。

它将活动提交设置为 <target>并丢弃对所有跟踪文件的任何修改(这是危险的部分)。

你至少应该在使用前知道它的效果。

一些避免丢失未提交工作的简单方法是:

  • git stash 使用前的工作git reset --hard,
  • 在使用之前提交您的工作(即使在 git reset 之后,提交仍然可以通过 git reflog),