按照Github for Mac blog announcement,Github for Mac如何同步?
一旦你準備好分享您的提交,或拉遠程提交 - 只需按下同步分公司按鈕。我們將執行更智能的版本
pull --rebase && push
,這會減少合併提交,但不會重寫您的合併。
什麼是「更聰明的版本」pull --rebase && push
?他們到底在做什麼?有沒有可能在命令行上做這個「更聰明」的事情?
按照Github for Mac blog announcement,Github for Mac如何同步?
一旦你準備好分享您的提交,或拉遠程提交 - 只需按下同步分公司按鈕。我們將執行更智能的版本
pull --rebase && push
,這會減少合併提交,但不會重寫您的合併。
什麼是「更聰明的版本」pull --rebase && push
?他們到底在做什麼?有沒有可能在命令行上做這個「更聰明」的事情?
的博客文章 「Rebasing Merge Commits in Git」(從Glen Maddern)表示git pull --rebase
的危險,當你在本地做出了合併:如果你在上面做的master
一個git pull --rebase
origin/master
現在,你會刪除你的本地合併。
請參閱rebase之後的下一張圖片:不再合併提交。
這是壞的一大堆理由。
- 其中之一,功能提交實際上是重複的,當我真的只想要重新合併。如果稍後再次合併功能分支,則兩次提交都將在
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
實際解決方案:
可以達到預期的效果:
而不是使用
git pull --rebase
,使用git fetch origin
和git 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。
儘管@ VonC的答案非常有用,但我想提及更新的legit。基本上,legit
確實是smart merge(很多類似的,如果不相等,什麼GitHub上爲Mac一樣):
git log --merges branch..from_branch
merge
,否則做一個rebase
git pull --rebase
不起作用按@ VonC的答案,而git rebase --preserve-merges
是有點好轉,但創建重複提交如果您在合併其他分支機構;所以你需要在某個時候決定「rebase」是否真的有意義,或者你應該「合併」,而這正是legit
準確的做法(同樣:就像Mac的GitHub一樣)。
哇,這是一個很棒的答案,它可能是正確的。但是有什麼方法可以確定這是Github桌面客戶端在做什麼嗎? –
@DanFabulich:是的,只需在你的一個本地分支和'master'之間合併,然後點擊那個「'Sync分支'」(假設你的本地'master'位於'origin/master'後面),並檢查是否您的本地合併被保留。 – VonC
就像你說的那樣工作。哇,git的默認值真的很糟糕! –