我正在尝试将一个分支基于主分支进行变基,这是我以前做过无数次的事情。但是今天它不起作用了:
> git status
On branch mystuff
Your branch and 'master' have diverged,
and have 6 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working directory clean
> git rebase
First, rewinding head to replay your work on top of it...
> git status
On branch mystuff
Your branch is up-to-date with 'master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
[a directory from the project]
nothing added to commit but untracked files present (use "git add" to track)
>
一切开始正常,但是Git完成rebase后,没有把我的提交放到那里;我的分支mystuff与master相同的提交。显然的结论是,我的提交已经在master的某个地方了。但是我发誓它们不在,我已经回溯了历史记录。这些提交在其他一些功能分支中,但它们不在master的历史记录中。(并且当我检出master时,可以根据文件状态知道它们不在master中)。所以,如果提交还没有在上游历史记录中,为什么git rebase会拒绝将我的提交放在顶部呢?奇怪的是,如果我一个一个地将提交拾取到主分支上,那么就能解决这个问题。然后我可以将我的mystuff分支移动到最后,然后将master恢复到原来的位置。(但是我为什么要这样做呢?)编辑:git rebase的文档如下:
“当前分支被重置为或(如果提供了--onto选项)。这与git reset --hard (或)具有完全相同的效果。ORIG_HEAD被设置为指向重置之前分支的末端。 接下来,之前保存在临时区域中的提交将按顺序逐个重新应用于当前分支。请注意,任何在HEAD中引入与HEAD.. 中的提交相同的文本更改的提交都将被省略(即,已经使用不同的提交消息或时间戳在上游接受的补丁将被跳过)。”
这将符合我目前看到的行为,如果提交实际上存在于上游...但它们不存在。正如评论中提到的那样,git rebase master可以正确工作并应用所有提交。但是没有master的git rebase却不能,尽管master被设置为上游分支。我的分支配置如下:
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "mystuff"]
remote = .
merge = refs/heads/master
git rebase
和git rebase --onto master
都像上面一样失败了...但是git rebase master
可以工作!但是为什么呢?如果master是上游分支,那么git rebase
不应该需要分支参数吗? - Ryan Lundygit rebase
会有任何不同于git rebase master
的表现。 - joshtkling