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
找到),git checkout -b new-tmp1 master
git cherry-pick h i
git checkout -b new-tmp2 master
git cherry-pick j k
如果new-tmp1
和new-tmp2
符合您的需求,那么只需移动旧引用:
git branch -f tmp1 new-tmp1
git branch -f tmp2 new-tmp2
git checkout
如何使用 -b
和两个分支名称吗? - Wynell-b
命令让 Git 创建一个新的分支并切换到该分支。第一个参数是新分支的名称,第二个参数告诉 Git 在创建时将新分支指向哪里。 - Romain Valeri
# make sure you have a clean working directory before running reset --hard
中的意思是什么?这里会发生什么? - Wynellrebase
?或者 2) 同时对两个进行 rebase,而不是分别对它们进行 rebase? - Wynellgit rebase --onto <e> <g> tmp2~1
命令来获取第二张图片上的状态吗? - Wynellgit branch -D tmp2
命令,以获得与图片上相同的结果。 - Wynellgit rebase --onto 1 2 3
的第三个参数,则会在变基后移动该分支。如果使用的不是分支名称(例如:tmp2~1
,它解析为“tmp2父提交的哈希值”),则会构建提交,并使存储库处于“分离的 HEAD”状态;您必须选择如何处理您的分支。您可能需要重新创建tmp2
分支:git branch tmp2
。 - LeGEC