2013-01-31 291 views
72

有沒有一種方法來重新分配一個分支到另一個分支的單個提交?git rebase一次提交

所以我

-- -- -- -- -- (Master) 
      \ 
       -- -- -- -- -- XX (Feature-branch) 

和所有我想要做的就是變基特徵的分支的最後一次提交到主站和回滾功能分支一個承諾。

-- -- -- -- -- XX (Master) 
      \ 
       -- -- -- -- -- (Feature-branch) 

我該怎麼做?

+3

如果您可以重新綁定任何數量的提交,那麼您爲什麼會要求重新綁定一個提交?如果我可以在SO中提出問題,我會問,重新分配(一次提交)和挑選櫻桃有什麼區別。 – Val

+1

因爲我不知道櫻桃採摘是否存在,我做了「關於分支」,「請求修復不同分支」,「修復它」,「承諾錯誤的分支」,「哦! 「足以說問題是有用的。 –

回答

76

你可以櫻桃採摘XX掌握。

git checkout master 
git cherry-pick <commit ID of XX> 

並使用git reset從功能分支中刪除上次提交。

git checkout Feature-branch 
git reset --hard HEAD^ 
+26

一個具體叫做'git rebase ...'的問題如何能夠接受的答案比包含一個櫻桃挑選,這是一個完全不同的概念,有時候本身被認爲是不潔淨的? – Bondax

+1

不確定這是否相關,但是我想重新綁定的提交中有一些文件被移動,並且「cherry-pick」使它們看起來好像它們已從舊位置刪除並在新位置創建。 我想rebase會照顧到這一點,但現在我已經推上游,所以我不能測試。無論如何,請注意您是否有類似的情況。 – waldyrious

+0

注意:爲了將'Feature-branch'中的更改推送到原點,您需要'git push -f origin Feature-branch',因爲'Feature-branch'現在被認爲是在origin/Feature -branch'。 – jojo

51
git rebase --onto master branch~1 branch 

這是說「變基上主分支的尖端最後前分支和分支之間的提交(即,XX提交)的範圍」

該操作branch尖端上提交移動後XX,所以你要設置它帶回

git checkout branch 
git reset --hard [email protected]{1}^ 

它說「分支的頂端重置前以前的狀態提交」

所以櫻桃採摘是一個更簡單的解決方案...

+3

這似乎不適用於我,我在XX之前失去了提交,並且分支被重新設置爲單獨提交,但是我之前從未使用過'--onto',所以我可能會做錯某些事情。順便說一句OP說,但他似乎想要做一個櫻桃選擇。 – tewe

+1

我的錯誤,rebase確實移動master上的分支,它必須被重置 – CharlesB

+0

這個解決方案和[tewe之一](https://stackoverflow.com/a/14635752/452775)之間的實際區別是什麼? – Lii

1

@Charles迴應是正確的。反正最後我用這個這麼多次,最重要的是要變基的一個項目

 
    * a8f9182 (HEAD -> production) production configuration 
    | * daa18b7 (pre) preproduction configuration 
    |/ 
    | * d365f5f (local) local configuration 
    |/ 
    * 27d2835 (dev) amazing new feature that will save the world 
* | 56d2467 (master) boring state of the art for project 
|/ 

,我爲它創建一個新的命令的具體配置:

 
$ cat ~/bin/git-rebaseshot 
COMMIT=$1 
DEST=${2:-HEAD} 
git rebase ${COMMIT}^ ${COMMIT} --onto $DEST 

通常你想自動完成分支名稱該命令,因此添加它的採購該功能(加入的.bashrc或.profile):

 
_git_rebaseshot() 
{ 
    __gitcomp_nl "$(__git_refs)" 
} 

GIT中自動完成將搜索它

你可以使用這個命令是這樣的:

# rebase config on prepro on actual HEAD 
$ git rebaseshot prepro 
# rebase config on local onto dev 
$ git rebaseshot local dev 
# rebase production config on master 
$ git rebaseshot pro master 

當你正確劃分功能,possibities是無止境的。

 
* a8f9182 (HEAD -> postgres) BBDD config 
* a8f9182 (local) local config 
* a8f9182 (debug) log level config 
* a8f9182 (dev) new feature 
| 

我猜這是quilt人們喜歡做的事情。

此命令將與您提供力所能及的SHA/REF反正工作:

$ git rebaseshot <Feature branch> master 
$ git rebaseshot <commit of XX> master 
+0

//,你可以鏈接到任何項目,我們可以看到這在行動? –

+0

就其性質而言,可用於rebasehot的分支不在本地回購之外進行。只需在主站(日誌級別,數據庫連接,配置)之上創建多個分支並在它們之間使用命令。很明顯看到效果。 – albfan

+0

//,我遇到了一些問題。我會再試一次。 –

6

這是很簡單的實際做。解決的辦法是做一個交互式重新分配,並「放棄」你不想包含在rebase中的所有提交。

git rebase -i <target_branch>其中target_branch是要變基上

然後你會編輯你想被打開的文件和pick的提交和drop(或d的簡稱)你穿上提交」分支不想帶上。

+0

IMO是一個更好的解決方案,它實際上解決了這個問題。 – GabrielOshiro