2012-09-25 53 views
4

按照Github for Mac blog announcementGithub for Mac如何同步?

一旦你準備好分享您的提交,或拉遠程提交 - 只需按下同步分公司按鈕。我們將執行更智能的版本pull --rebase && push,這會減少合併提交,但不會重寫您的合併。

什麼是「更聰明的版本」pull --rebase && push?他們到底在做什麼?有沒有可能在命令行上做這個「更聰明」的事情?

回答

12

的博客文章 「Rebasing Merge Commits in Git」(從Glen Maddern)表示git pull --rebase的危險,當你在本地做出了合併:如果你在上面做的master一個git pull --rebase

local merge

origin/master現在,你會刪除你的本地合併
請參閱rebase之後的下一張圖片:不再合併提交。

no more merge commit

這是壞的一大堆理由。

  • 其中之一,功能提交實際上是重複的,當我真的只想要重新合併。如果稍後再次合併功能分支,則兩次提交都將在master的歷史記錄中。
  • origin/feature,應該完成,並在master,留下懸擺。
    與你從一個好的分支/合併模型獲得的真棒歷史不同,你實際上已經有了誤導的歷史。
    例如,如果有人看着origin上的分支,它會出現origin/feature還沒有被合併爲主,儘管它已經!如果這個人然後進行部署,會導致各種問題。這全是壞消息。

這就是Github上的(蘋果機|視窗)將檢測和避免。

如果沒有及時發現,同樣的博客中提到了以下恢復:

[master] git reset --hard origin/master 
HEAD is now at 9f3e34d sneaky extra commit 
[master] git merge --no-ff feature 

實際解決方案:

可以達到預期的效果:

desired result

而不是使用git pull --rebase,使用git fetch origingit rebase -p origin/master

我想的pull --rebase的「智能版本」是「取+重訂保留合併」該組合。

Glen也提議following aliases來對抗這一命令序列將不再使用與本地分支相關的跟蹤信息的事實。

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

+1

哇,這是一個很棒的答案,它可能是正確的。但是有什麼方法可以確定這是Github桌面客戶端在做什麼嗎? –

+0

@DanFabulich:是的,只需在你的一個本地分支和'master'之間合併,然後點擊那個「'Sync分支'」(假設你的本地'master'位於'origin/master'後面),並檢查是否您的本地合併被保留。 – VonC

+1

就像你說的那樣工作。哇,git的默認值真的很糟糕! –

3

儘管@ VonC的答案非常有用,但我想提及更新的legit。基本上,legit確實是smart merge(很多類似的,如果不相等,什麼GitHub上爲Mac一樣):

  1. 檢查日誌合併與git log --merges branch..from_branch
  2. 承諾如果有任何的話做平常merge ,否則做一個rebase

git pull --rebase不起作用按@ VonC的答案,而git rebase --preserve-merges是有點好轉,但創建重複提交如果您在合併其他分支機構;所以你需要在某個時候決定「rebase」是否真的有意義,或者你應該「合併」,而這正是legit準確的做法(同樣:就像Mac的GitHub一樣)。

+0

非常有趣! +1也許是我的(純粹的git)答案的一個很好的選擇。 – VonC

+0

是的,嗯......我相信你可以將'sync'替換成一些基本相同的bash-foo。你根本不必走「合法」的道路。我只是想把它指出給你們,就這些。乾杯! – Ali