如何将此分支进行变基操作?

4
下图分为两部分: 第一部分是存储库示例模型,第二部分是我想使用git rebase获取的存储库状态。
第二部分中没有遗漏任何内容。这正是我想要的。 enter image description here
2个回答

5
如果您想要操纵的提交数量像图片中一样少:请使用 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有一种语法可以选择一段提交范围:

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 reset --hard之前,git stash保存你的工作,
  • 在使用它之前进行提交(即使在git reset之后,提交仍然可以通过git reflog找到),

谢谢。并且请解释一下在 # make sure you have a clean working directory before running reset --hard 中的意思是什么?这里会发生什么? - Wynell
还有,我能否 1) 在不检出它们的情况下进行 rebase?或者 2) 同时对两个进行 rebase,而不是分别对它们进行 rebase? - Wynell
同时,重新定位tmp2时,我应该使用 git rebase --onto <e> <g> tmp2~1 命令来获取第二张图片上的状态吗? - Wynell
我还执行了 git branch -D tmp2 命令,以获得与图片上相同的结果。 - Wynell
如果您将命名分支用作 git rebase --onto 1 2 3 的第三个参数,则会在变基后移动该分支。如果使用的不是分支名称(例如:tmp2~1,它解析为“tmp2父提交的哈希值”),则会构建提交,并使存储库处于“分离的 HEAD”状态;您必须选择如何处理您的分支。您可能需要重新创建 tmp2 分支:git branch tmp2 - LeGEC

5
在这种情况下,我会选择重建分支,而不是尝试进行“忍者 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

谢谢。另外,你能告诉我 git checkout 如何使用 -b 和两个分支名称吗? - Wynell
1
-b 命令让 Git 创建一个新的分支并切换到该分支。第一个参数是新分支的名称,第二个参数告诉 Git 在创建时将新分支指向哪里。 - Romain Valeri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接