如何使用 Git 作为一次提交变基
How can I rebase as one commit using Git
我的历史看起来有点像这样,但是乘以 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 次提交。常规变基的主要问题是它试图一次变基一个提交,我必须一遍又一遍地修复和重新修复类似的冲突。
我只想获取我的分支的提示和大师的提示之间的差异,并将它们应用到大师之上。
这其实很简单。
将 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
的历史。如果你确定你永远不需要那段历史,那很好。但是,为了删除实际发生的事情的准确记录而花费所有这些额外的麻烦似乎是一种浪费。
我假设 e'
和 h'
分别是 e
和 h
的精选。我还假设当 Git 尝试应用 e'
和 h'
而不是任何其他提交时会出现冲突。如有不妥请指正
您有几个选择:
当 git rebase
掉落到一个提示说它不能应用 e'
或 h'
时,运行 git rebase --skip
告诉 Git 跳过该提交。
rebase 完成后,如果您想要将提交压缩为一个:
git reset --soft master
git commit
进行交互式变基并告诉 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
我的历史看起来有点像这样,但是乘以 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 次提交。常规变基的主要问题是它试图一次变基一个提交,我必须一遍又一遍地修复和重新修复类似的冲突。
我只想获取我的分支的提示和大师的提示之间的差异,并将它们应用到大师之上。
这其实很简单。
将
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
的历史。如果你确定你永远不需要那段历史,那很好。但是,为了删除实际发生的事情的准确记录而花费所有这些额外的麻烦似乎是一种浪费。
我假设 e'
和 h'
分别是 e
和 h
的精选。我还假设当 Git 尝试应用 e'
和 h'
而不是任何其他提交时会出现冲突。如有不妥请指正
您有几个选择:
当
git rebase
掉落到一个提示说它不能应用e'
或h'
时,运行git rebase --skip
告诉 Git 跳过该提交。rebase 完成后,如果您想要将提交压缩为一个:
git reset --soft master git commit
进行交互式变基并告诉 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