Github for Mac如何同步?

时间:2012-09-25 04:55:56

标签: git github

根据Github for Mac blog announcement

  

准备好分享提交或提取远程提交后 - 只需按“同步分支”按钮即可。我们将执行更智能的pull --rebase && push版本,以减少合并提交但不会重写您的合并。

pull --rebase && push的“更智能的版本”是什么?他们究竟在做什么?是否可以在命令行上执行“更智能”的操作?

2 个答案:

答案 0 :(得分:12)

博文“Rebasing Merge Commits in Git”(来自 Glen Maddern )说明了进行本地合并后git pull --rebase 的危险性

local merge

如果您现在在git pull --rebase之上master origin/master master,则删除您的本地合并
请参阅rebase之后的下一张图片:不再进行合并提交。

no more merge commit

  

由于很多原因,这很糟糕。

     
      
  • 首先,功能提交实际上是重复的,当我真的只想重新合并时。如果稍后再次合并功能分支,则两个提交都将在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

实际解决方案:

您可以达到预期的效果:

desired result

  

不使用git fetch origin使用git rebase -p origin/masterpull --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非常相似,如果不相同的话):

  1. 使用git log --merges branch..from_branch
  2. 检查日志以查找合并提交
  3. 如果有,请执行常规merge,否则执行rebase
  4. git pull --rebase不能按@ VonC的答案工作,而git rebase --preserve-merges更好,但如果你合并了其他分支,则会创建重复的提交;所以你需要在某个时候决定“rebase”是否真的有意义,或者你应该“合并”而且legit正是这样做的(再次:就像GitHub for Mac)。