2010-06-11 49 views
8

在我的筆記本電腦和工作以及家中的桌面上工作了幾個星期後,我的筆記本電腦和工作以及六個不同的分支和合並之後,我的歷史變得有些複雜。例如,我剛剛進行了一次抓取,然後將原生與主人合併。現在,當我做git show-branches時,輸出如下所示:如何使用git rebase清理錯綜複雜的歷史

 
! [login] Changed domain name. 
! [master] Merge remote branch 'origin/master' 
    ! [migrate-1.9] Migrating to 1.9.1 on Heroku 
    ! [rebase-master] Merge remote branch 'origin/master' 
---- 
- - [master] Merge remote branch 'origin/master' 
+ + [master^2] A bit of re-arranging and cleanup. 
- - [master^2^] Merge branch 'rpx-login' 
+ + [master^2^^2] Commented out some debug logging. 
+ + [master^2^^2^] Monkey-patched Rack::Request#ip 
+ + [master^2^^2~2] dump each request to log 
.... 

我想用git rebase清理它。我爲此創建了一個新分支,rebase-master,並在此分支上嘗試了git rebase <共同祖先>。但是,我必須解決許多衝突,並且分支rebase-master的最終結果不再與已經過測試的master上的相應版本匹配!

我以爲我看到了解決這個問題的地方,但無法找到它了。有誰知道如何做到這一點?或者當我開始刪除我已經合併的不需要的分支時,這些令人費解的ref名字會消失嗎?

我是這個項目的唯一開發者,所以沒有其他人會受到影響。

+9

;-)哲學筆記:歷史變得複雜。這是生活中的事實。克服它。 – 2010-06-25 17:25:30

回答

5

正常的過程中,正回購在那裏你可以強制推送分支(由一個重訂本地創建一個新的更換遙控歷史),是做:

git rebase --interactive 

但同樣,這只是如果您是唯一從您的回購協議中提取的人,那麼這是有效的,即使那樣,您也必須將您當地的某些分支重新初始化爲新的已重寫的遠程跟蹤分支。

從rebase會話,你可以trimming Git commits and squash history,以獲得你需要的歷史類型。

+0

另請參閱http://stackoverflow.com/questions/2719579/howto-add-a-changed-file-to-an-older-not-last-commit-in-git/2719631#2719631 – VonC 2010-06-11 21:37:52

+0

嗯...它的沒有從遠程拉動的大量有效。你可以輕鬆地rebase -i (或基本上幾乎任何東西)本地分支,遠程分支,提交。 – xenoterracide 2010-07-12 04:22:07

10

清理錯綜複雜的歷史的最好方法是保持歷史線性。你可以通過避免任何形式的合併而不是快進。

工作流程是這樣的。

$ git checkout -b foobranch 
<do stuff> 
$ git commit 
<do stuff> 
$ git commit 
... 

當需要將分支集成到主設備中時,請不要合併它。相反,將這個分支與主人分開。這將使分支不再看起來像一個分支,但只是樹上的更多增長。您在重新綁定期間解決任何合併衝突。

$ git fetch origin 
$ git rebase origin/master 

現在,將分支合併到主。這將是一個快速合併。

$ git checkout master 
$ git merge foobranch 

現在推動上游工作。

$ git push