我刚刚将一个特性分支重新定位到另一个特性分支上(准备将所有内容重新定位到我的主人的头上),它涉及到很多棘手的合并解决方案。
变基会自动保存为某处的提交吗?
这些修改在哪里?我在 gitk 中看不到任何东西,或者git log --oneline
.
(当我在变基后合并回我的分支时也有同样的问题。)
Rebase is moving commits on top of another branch. If a commit that is moved causes merge conflict, this commit is changed to reflect merge resolution.
The purpose of rebase is make your commits look as if they were changes to the branch you rebase onto. So the most logical way is to incorporate merge conflicts into these commits. No additional commits is required thus.
Merge is different, because it's an explicit action of merging diverged branches together. No commits in each of branches is changed. Conflict resolution is reflected in the merge commit.
是的,成功的变基和合并会提交。他们只是不会提交存在需要解决的冲突,但是变基(或合并)的输出会告诉您这已经发生以及如何解决它。
对于变基,您只需要解决索引中的冲突,然后git rebase --continue
.
对于合并,您需要进行提交 ( git commit
),但是会记住它是合并的事实,并且会提供合适的默认提交消息供您编辑。
在过去(2006 年,1.5.3及其用户手册之前),git rebase
呈现如下:
挑选樱桃的一个特殊情况是,如果您想将整个分支移动到更新的“基础”提交。
这是由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 之上,然后调用 resultdev2
。
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f2a-f2b-f2c (dev2, HEAD)