一旦你准备好分享你的提交,或拉入远程提交——只需按下同步分支按钮。我们将执行一个更智能的版本,
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 --rebaseof ,您将删除您的本地 merge。
请参阅 rebase 后的下一张图片:不再合并提交。masterorigin/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_branchmerge做,否则做rebasegit pull --rebase不能按照@VonC 的回答工作,虽然git rebase --preserve-merges更好,但是如果您合并了其他分支,则会创建重复提交;所以你需要在某个时候决定“rebase”是否真的有意义,或者你应该“合并”,这legit正是这样做的(再次:就像 GitHub for Mac)。