我有两个分支。提交a是一个的头,而另一个有b, c, d, e和f在a的顶部。我想移动c, d, e和f到第一个分支,而不提交b。使用樱桃采摘很容易:签出第一个分支樱桃采摘一个接一个c到f,并重新建立第二个分支到第一个。但是有没有办法在一个命令中选择所有的c-f ?
下面是场景的可视化描述(感谢JJD):
我有两个分支。提交a是一个的头,而另一个有b, c, d, e和f在a的顶部。我想移动c, d, e和f到第一个分支,而不提交b。使用樱桃采摘很容易:签出第一个分支樱桃采摘一个接一个c到f,并重新建立第二个分支到第一个。但是有没有办法在一个命令中选择所有的c-f ?
下面是场景的可视化描述(感谢JJD):
当前回答
最简单的方法是使用on选项来调整基数。假设电流在a处结束的支路叫做mybranch这就是你想要移动c-f的支路。
# checkout mybranch
git checkout mybranch
# reset it to f (currently includes a)
git reset --hard f
# rebase every commit after b and transplant it onto a
git rebase --onto a b
其他回答
最简单的方法是使用on选项来调整基数。假设电流在a处结束的支路叫做mybranch这就是你想要移动c-f的支路。
# checkout mybranch
git checkout mybranch
# reset it to f (currently includes a)
git reset --hard f
# rebase every commit after b and transplant it onto a
git rebase --onto a b
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
git rev-list打印从分支b到分支f(反向)的所有修订,这样当每一行(提交哈希)按顺序传递时,它会将每一行都樱桃式地选择到当前git HEAD中。例如,git选择{哈希的c};Git选择{哈希的d};... ——@coderatchet评论
我需要樱桃选择从一个分支到另一个优先级的提交,但这里的提交很难理解,希望下面的帮助与一个简单的:
步骤如下:
从“dev”分支获取1个带名字的提交(“移除姓氏字段”) 在"hotfix1"分支中提交
1。从“dev”分支获取提交细节
// Go to "dev" branch
git checkout dev
// Get the commit id (1e2e3e4e1 here)
git log --oneline
> ...
> ...
> 1e2e3e4e1 Remove Last Name field
> ...
> ...
2。推送提交到“hotfix1”分支
// Go to "hotfix1" branch
git checkout hotfix1
// Get the commit (1e2e3e4e1) from "dev" branch to "hotfix1" branch
git cherry-pick 1e2e3e4e1
// verify changes are correct
gitk
// push to "hotfix1" branch
git push
如果要一次做多个,只需要在上面修改一个,按顺序给出所有的提交id:
git cherry-pick 1e2e3e4e1 1e2e3e4e2 1e2e3e4e3
如果你有选择性的修订要合并,比如从A,B,C,D,E,F,G,H,I,J提交A, C, F, J,简单地使用下面的命令:
git cherry-pick A C F J
实际上,最简单的方法是:
记录两个分支之间的merge-base: MERGE_BASE=$(git merge-base branch-a branch-b) 快进或将旧的分支重置到新的分支上 从步骤1的merge base开始,将生成的分支重新基于自身,并手动删除不需要的提交: ${SAVED_MERGE_BASE} -i 或者,如果只有几个新的提交,则跳过第1步,直接使用 git rebase HEAD^^^^^^^ -i 在第一步中,使用足够的^来移动合并基础。
你会在交互的rebase中看到类似这样的东西:
pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f
然后删除行b(和任何其他你想要的)