根据Github for Mac blog announcement,
准备好分享提交或提取远程提交后 - 只需按“同步分支”按钮即可。我们将执行更智能的
pull --rebase && push
版本,以减少合并提交但不会重写您的合并。
pull --rebase && push
的“更智能的版本”是什么?他们究竟在做什么?是否可以在命令行上执行“更智能”的操作?
答案 0 :(得分:12)
博文“Rebasing Merge Commits in Git”(来自 Glen Maddern )说明了进行本地合并后git pull --rebase
的危险性:
如果您现在在git pull --rebase
之上master
origin/master
master
,则删除您的本地合并。
请参阅rebase之后的下一张图片:不再进行合并提交。
由于很多原因,这很糟糕。
- 首先,功能提交实际上是重复的,当我真的只想重新合并时。如果稍后再次合并功能分支,则两个提交都将在
origin/feature
的历史记录中。- 而
master
本来应该在origin
中完成,而是留下悬挂。
与您通过良好的分支/合并模型获得的令人敬畏的历史不同,您实际上已经误导历史。
例如,如果有人查看了origin/feature
上的分支,那么[master] git reset --hard origin/master HEAD is now at 9f3e34d sneaky extra commit [master] git merge --no-ff feature
似乎没有合并到主分区,即使它有!如果那个人然后进行部署,这可能会导致各种问题。这全是坏消息。
这就是Github(Mac | Windows)会检测并避免的。
如果您没有及时发现,同一博客文章提到了以下恢复:
git pull --rebase
实际解决方案:
您可以达到预期的效果:
不使用
git fetch origin
,使用git rebase -p origin/master
和pull --rebase
我认为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)'
的“更智能版本”是“fetch + rebase保留合并”的组合。
Glen还建议following aliases来反驳这一命令序列将不再使用与本地分支相关联的跟踪信息这一事实。
{{1}}
Jason Weathered发布了“http://jasoncodes.com/posts/gup-git-rebase”,但现在引用了来自git-up的 Aanand Prasad 。
答案 1 :(得分:3)
尽管@ VonC的答案非常有用,但我想提及更新的legit。基本上legit
所做的是smart merge(与Mac的GitHub非常相似,如果不相同的话):
git log --merges branch..from_branch
merge
,否则执行rebase
git pull --rebase
不能按@ VonC的答案工作,而git rebase --preserve-merges
更好,但如果你合并了其他分支,则会创建重复的提交;所以你需要在某个时候决定“rebase”是否真的有意义,或者你应该“合并”而且legit
正是这样做的(再次:就像GitHub for Mac)。