【发布时间】:2010-04-22 09:33:37
【问题描述】:
我刚刚将一个特性分支重新定位到另一个特性分支上(准备将所有内容重新定位到我的主人的头部),它涉及到相当多的棘手合并解决方案。
rebase 是否会自动保存为某处的提交?
这些修改在哪里?我在 gitk 或 git log --oneline 中看不到任何内容。
(当我在变基后合并回我的分支时,同样的问题。)
【问题讨论】:
我刚刚将一个特性分支重新定位到另一个特性分支上(准备将所有内容重新定位到我的主人的头部),它涉及到相当多的棘手合并解决方案。
rebase 是否会自动保存为某处的提交?
这些修改在哪里?我在 gitk 或 git log --oneline 中看不到任何内容。
(当我在变基后合并回我的分支时,同样的问题。)
【问题讨论】:
Rebase 将提交移至另一个分支之上。如果移动的提交导致合并冲突,则更改此提交以反映合并解决方案。
rebase 的目的是让你的提交看起来像是对你 rebase 的分支的更改。所以最合乎逻辑的方法是将合并冲突合并到这些提交中。因此不需要额外的提交。
Merge 是不同的,因为它是将分歧的分支合并在一起的显式操作。每个分支中的提交都没有更改。冲突解决反映在合并提交中。
【讨论】:
是的,成功的变基和合并会提交。他们只是不会提交存在需要解决的冲突,但是变基(或合并)的输出会告诉您这已经发生以及如何解决它。
对于rebase,你只需要解决索引中的冲突,然后git rebase --continue。
对于合并,您需要进行提交 (git commit),但系统会记住合并的事实,并会提供合适的默认提交消息供您编辑。
【讨论】:
在过去(2006 年,1.5.3 之前和its user manual),git rebase 是presented like so:
cherry-picking 的一个特例是如果你想移动整个分支 到较新的“基础”提交。
这是由git-rebase完成的。
您指定要移动的分支(默认HEAD)以及将其移动到的位置(无默认), 和:
git cherry-picks该分支的每个补丁,- 将其应用到目标之上,
- 并将
refs/heads/<branch>指针移动到新创建的提交。
所以根据定义,将进行提交(并且不需要进行提交)
rebase 的一种特殊情况是当您想要划分工作、移动(并重新创建新的)提交时。
来自同一个教程(作为 rebase 后不需要任何进一步提交的说明):
假设您在当前的 HEAD 中混合了两个功能的开发,一个名为“dev”的分支。
x-x-x-x (master)
\
-f1a-f1b-f1c-f2a-f2b-f2c (dev, HEAD)
你想把它们分成“dev1”和“dev2”。假设
HEAD是 master 的一个分支,那么你可以查看
git log master..HEAD
或者只是获取提交的原始列表
git rev-list master..HEAD
无论哪种方式,假设您在
dev1中找出您想要的提交列表并创建该分支:
git checkout -b dev1 master
for i in `cat commit_list`; do
git-cherry-pick $i
done
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f1a-f1b-f1c-f2a-f2b-f2c (dev)
您可以使用您编辑的列表的另一半来生成
dev2分支,但如果您不确定是否忘记了某些内容,或者只是不想做那种手动工作,那么您可以使用git-rebase 为你做这件事。
git checkout -b dev2 dev # Create dev2 branch
git-rebase --onto master dev1 # Subreact dev1 and rebase
这将找到所有在
dev而不是dev1的补丁,将它们应用到master 之上,然后调用结果dev2。
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f2a-f2b-f2c (dev2, HEAD)
【讨论】: