问题是我需要查看我要合并的分支是否未发布。
如果它们没有发布,您应该重新设置它们的基准。
但检查变基是否确实可行有点棘手:
首先,获取后,您可以轻松查看如果您有尚未推送的本地提交 https://stackoverflow.com/q/4082175/6309:
git log origin/master..master
o--o--o (origin/master)
/
x--x--x--y--y (master)
在这种情况下,rebase 是完全可以的,除非master
已经被推到another来自您的存储库的分支。
但您也可以通过以下方式轻松检查:
git branch -r --contains master
如果有任何远程(-r
) 分支包含您想要变基的分支,那么这是一个不太安全的想法,并且最好进行合并。
但是,如果远程分支本身被重新定位(并强制推送),那么您需要小心,如“您如何处理已经重新定位的公共存储库? https://stackoverflow.com/a/20423983/6309":
o--o--o (OLD origin/master)
/
x--x--X--y--y (master)
\
o'--o'--o' (origin/master, as seen after a 'git fetch')
盲目变基master
在之上origin/master
将重放提交X
,这是left out when origin/master
被重新设定。不好。
今天(2014年1月),处理这个案件的唯一方法是:
- 创建一个 'tmp' 标记分支
origin/master
,
-
git fetch
,
- 检查是否
git branch --contain tmp
lists origin/master
(它已被获取,如果它被重新设置并强制推送,则可能具有不同的历史记录)。
明天(git 1.9,2014 年第一季度),您无需在获取之前标记远程分支:
fork_point=$(git merge-base --fork-point origin/upstreamBranch yourBranch)
# return X
git rebase --onto origin/upstreamBranch $fork_point yourBranch
回顾一下:
After a git fetch
(标记后origin/master
before获取),
- if
git log origin/master..master
返回提交来自master
哪些不属于origin/master
(这意味着那些本地提交还没有被推送到origin/master
)
- AND if
git branch -r --contains master
是空的(意思是master
没有被推送到其他任何地方,在您可以通过a看到的任何远程跟踪分支上git fetch
)
Then:
- if
origin/master
包括标记分支 'tmp
' (意义origin/master
本身没有重新定位),你可以git rebase origin/master master
.
- 其他:你可以
git rebase --onto origin/master $(git merge-base tmp master) master
(你需要tmp
在这里仅对您的分支进行变基。 Git 1.9 将不再需要 tmp 分支)
在任何其他情况下:merge origin/master
to master
.