一旦你准备好分享你的提交,或拉入远程提交——只需按下同步分支按钮。我们将执行一个更智能的版本,
pull --rebase && push
它可以减少合并提交,但不会重写您的合并。
什么是“更智能的版本” pull --rebase && push
?他们到底在做什么?是否有可能在命令行上做这个“更聪明”的事情?
一旦你准备好分享你的提交,或拉入远程提交——只需按下同步分支按钮。我们将执行一个更智能的版本,
pull --rebase && push
它可以减少合并提交,但不会重写您的合并。
什么是“更智能的版本” pull --rebase && push
?他们到底在做什么?是否有可能在命令行上做这个“更聪明”的事情?
博客文章“ Rebase Merge Commits in Git ”(来自Glen Maddern)说明了git pull --rebase
进行本地合并时的危险:
如果您在 now之上执行 a git pull --rebase
of ,您将删除您的本地 merge。
请参阅 rebase 后的下一张图片:不再合并提交。master
origin/master
由于很多原因,这很糟糕。
- 一方面,功能提交实际上是重复的,而实际上我只想重新合并合并。如果您稍后再次合并功能分支,则两个提交都将在
master
.- 并且
origin/feature
,应该完成并在 中master
,被悬空。
与遵循良好的分支/合并模型所获得的令人敬畏的历史不同,您实际上得到了误导性的历史。
例如,如果有人查看 上的分支origin
,它会显示为origin/feature
尚未合并到 master 中,即使它已合并!如果那个人然后进行部署,这可能会导致各种问题。这只是全面的坏消息。
这就是 Github for (Mac|Windows) 会检测和避免的。
如果你没有及时发现,同一篇博文中提到了以下恢复:
[master] git reset --hard origin/master
HEAD is now at 9f3e34d sneaky extra commit
[master] git merge --no-ff feature
实际解决方案:
您可以达到预期的效果:
而不是使用
git pull --rebase
,使用一个git fetch origin
和git rebase -p origin/master
我想“更智能的版本”pull --rebase
是“fetch + rebase 保留合并”的组合。
Glen还提出了以下别名来应对这样一个事实,即该命令序列将不再使用与本地分支关联的跟踪信息。
function git_current_branch() {
git symbolic-ref HEAD 2> /dev/null | sed -e 's/refs\/heads\///'
}
alias gpthis='git push origin HEAD:$(git_current_branch)'
alias grb='git rebase -p'
alias gup='git fetch origin && grb origin/$(git_current_branch)'
Jason Weathered发布了“ http://jasoncodes.com/posts/gup-git-rebase ”,但现在指的是git-up,来自Aanand Prasad。
尽管@VonC 的答案非常有用,但我想提一下较新的legit。基本上legit
所做的是智能合并(与 GitHub for Mac 所做的非常相似,如果不相等的话):
git log --merges branch..from_branch
merge
做,否则做rebase
git pull --rebase
不能按照@VonC 的回答工作,虽然git rebase --preserve-merges
更好,但是如果您合并了其他分支,则会创建重复提交;所以你需要在某个时候决定“rebase”是否真的有意义,或者你应该“合并”,这legit
正是这样做的(再次:就像 GitHub for Mac)。