2014-01-24 16 views
2

在Git中,讓我們說,我一直工作在當地的分支:如何使用本地和遠程Git存儲庫之間的差異創建單個提交?

Common ancestor  
     /\ 
     A \ 
    / X 
    B  \ 
    /  Y 
    C  remote 
local 

我做了本地提交A,B和C,並在平均時間的遠程分支移動與提交X和Y.所以我一拉,並得到:

Common ancestor  
     /\ 
     A \ 
    / X 
    B  \ 
    /  Y 
    C  /remote 
    \ /
    \ /
     \/
     \/ 
     M 
    local 

如果我現在推,遠程歷史將包括我所有的A,B,C和M提交...但是這不是我想要的。

我想只是把與我的本地分行的差異爲單一提交這樣的遠程分支將只是看起來像這樣有沒有合併的複雜性:

Common ancestor  
     \ 
      \ 
      X 
      \ 
      Y 
       \ 
       N 
      remote 

我怎樣才能做到這一點?

回答

1

做一個

git pull --rebase 

即相當於git fetchgit rebase,而不是一個git merge

1

剛剛合併本地更改到刪除的人得到ñ承諾:

  1. 創建,checout分支remote_n本地和遠程的主所有的數據拉入remote_n分支:

    git branch remote_n 
    git checkout remote_n 
    git pull origin master 
    
  2. 將主人的HEAD合併到remote_n,修復inconsisences,並提交更改,所以您將獲得單ñ提交(通過使用--squash選項):

    git merge --squash master 
    vim ... 
    git add . 
    git commit 
    
  3. 推結果ñ提交到遠程的master分支:

    git push remote master 
    

注:你會得到當地remote_n分公司作爲新的分支爲您的回購。

如果你真的需要避免合併手工做這樣的事情:

  1. 獲取的常見ç DIFF承諾:

    git diff Common_sha C_sha > common_c.diff 
    
  2. 復位樹上下來到通用提交,拉遠程更改,應用差異,並提交它:

    git reset --hard Common_sha 
    git pull remote master 
    git apply --ignore-space-change common_c.diff 
    git commit 
    
  3. 推結果ñ提交到遠程的master分支:

    git push remote master 
    

注:這種模式沒有考慮到二進制文件無法顯示通過git diff

+0

感謝您的回答,但不太清楚這將工作......'git merge master'將提交A,B和C帶入歷史記錄中,除了* N * commit之外,它們不會被推送嗎? –

+0

@SteveChambers所以你需要避免提交? –

+0

是的 - 讓我們換一種方式:我想讓它看起來好像我只是拉動了遠程分支並做了一些改變,而沒有其他人在同時改變任何東西 - 所以只有一行歷史。我明顯可以通過將遠程設備插入新的本地分支並快速重新應用我的更改來實現此目的,但我想知道是否有更簡單/更好的方法。 –

相關問題