我刚刚将一个功能分支重新设置到另一个功能分支上(准备将所有内容重新设置为我的主人),它涉及了一些棘手的合并解决方案。
rebase是否自动保存为某处的提交?
这些修改在哪里生活?我在gitk中看不到任何内容,或git log --oneline
。
(同样的问题,我在重新定位后合并我的分支。)
答案 0 :(得分:8)
Rebase正在另一个分支上移动提交。如果移动的提交导致合并冲突,则更改此提交以反映合并解析。
rebase的目的是让你的提交看起来好像它们是你重新加入的分支的变化。因此,最合乎逻辑的方法是将合并冲突合并到这些提交中。因此,不需要额外的提交。
合并是不同的,因为它是将不同分支合并在一起的明确行为。每个分支中的提交都不会更改。冲突解决方案反映在合并提交中。
答案 1 :(得分:5)
是的,成功的rebase和merges提交了。他们只是不会提交需要解决的冲突,但是rebase(或者合并)的输出会告诉你这已经发生了以及如何解决它。
对于rebase,您只需解决索引中的冲突,然后git rebase --continue
。
对于合并,您需要进行提交(git commit
),但会记住它是合并的事实,并且将提供合适的默认提交消息供您编辑。
答案 2 :(得分:2)
在过去(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
是主分支,那么你可以查看
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
中的所有修补程序,将其应用于主数据库,并调用结果dev2
。
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f2a-f2b-f2c (dev2, HEAD)