我的历史看起来有点像这样但是时间10:
i - j - e'- k - h'- l - m feature-branch
/
a - b - c - d - e - f - g - h master
(撇号意思是樱桃选秀权) 我想改变这个:
i - j - k - l - m feature-branch
/
a - b - c - d - e - f - g - h master
我不介意该功能是否被压缩为1次提交。常规rebase的主要问题是它一次尝试重新设置一个提交,我必须一遍又一遍地修复和重新修复类似的冲突。
我想要的只是取决于我的分支的尖端和主人的尖端之间的差异,并将其应用于主人之上。
答案 0 :(得分:6)
实际上这很容易。
将master
合并到feature-branch
。您将立即解决所有合并冲突。 (我强烈建议停在这里。)
i - j - e'- k - h'- l - m - n feature-branch
/ /
a - b - c - d - e - f - g - h -------- master
然后,git reset --soft master
。这将使feature-branch
指向master
,但它会将所有更改保留在索引中,随时可以提交。
i - j - e'- k - h'- l - m - n (orphaned)
/ /
a - b - c - d - e - f - g - h -------- master, feature-branch
\
(index)
git commit
i - j - e'- k - h'- l - m - n (orphaned)
/ /
a - b - c - d - e - f - g - h -------- master
\
n' feature-branch
#2和#3的唯一目的是破坏feature-branch
的历史。如果你确定你永远不会需要那段历史,那很好。但是,为了删除实际发生的事情的准确记录,去除所有这些额外的麻烦似乎是浪费。
答案 1 :(得分:3)
我假设e'
和h'
分别是e
和h
的挑选。我还假设当Git尝试应用e'
和h'
时会出现冲突,但不会出现任何其他提交。如果我错了,请纠正我。
您有几个选择:
当git rebase
出现提示无法应用e'
或h'
时,请运行git rebase --skip
告诉Git跳过该提交。< / p>
一旦rebase完成,如果你想将提交压缩成一个:
git reset --soft master
git commit
做一个互动的rebase并告诉Git不要申请e'
和h'
:
git checkout feature-branch
git rebase -i master
# Git will launch an editor containing an interactive rebase recipe:
# 1. Delete the e' and h' lines.
# 2. Optionally change the j through m lines to 'squash' if you
# want to squash all of those commits into one.
# 3. Save the recipe and exit.
git rebase
是一种更简单的方法来执行一系列git cherry-pick
命令。您可以自己手动执行这些命令:
git checkout -b temp-branch master
git cherry-pick i j k l m
# optionally, if you want to squash i through m into a single commit:
# git reset --soft master
# git commit
git checkout feature-branch
git reset --hard temp-branch
git branch -D temp-branch