4

根据Github for Mac 博客公告

一旦你准备好分享你的提交,或拉入远程提交——只需按下同步分支按钮。我们将执行一个更智能的版本,pull --rebase && push它可以减少合并提交,但不会重写您的合并。

什么是“更智能的版本” pull --rebase && push?他们到底在做什么?是否有可能在命令行上做这个“更聪明”的事情?

4

2 回答 2

12

博客文章“ 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 origingit 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

于 2012-09-25T05:57:15.440 回答
3

尽管@VonC 的答案非常有用,但我想提一下较新的legit。基本上legit所做的是智能合并(与 GitHub for Mac 所做的非常相似,如果不相等的话):

  1. 检查日志以查看合并提交git log --merges branch..from_branch
  2. 如果有的话,就照常merge做,否则做rebase

git pull --rebase不能按照@VonC 的回答工作,虽然git rebase --preserve-merges更好,但是如果您合并了其他分支,则会创建重复提交;所以你需要在某个时候决定“rebase”是否真的有意义,或者你应该“合并”,这legit正是这样做的(再次:就像 GitHub for Mac)。

于 2013-08-30T12:43:08.790 回答