2011-05-17 95 views
19

我想把我的最後幾個提交從主人移到他們自己的分支。如何將提交移動到另一個分支?

在我的電腦上的樹看起來像這樣:

W (some branch) 
/  
X1--X2--X3--X4--Y--Z1--Z2 (master) 

我想它看起來像:

W (some branch) 
/  
X1--X2--X3--X4 (master) 
      \ 
       Y--Z1--Z2 (my new branch) 

然而,樹在GitHub上的樣子:

W (some branch) 
/  
X1--X2--X3--X4--Y (master) 

這就是我看到的將最後一次提交移動到另一個分支的解決方案:

git checkout master 
git branch my_new_branch 
git reset <commit_id> 

我的問題是:我能否在將提交移動到新分支後成功推送到GitHub,如果需要執行比這三個命令還要做的其他操作嗎?

+1

你不希望Y在主或你只是想你的分支從X4開始?我的意思是,Y在掌握一個錯誤? – CharlesB 2011-05-17 19:14:13

回答

16

(我假設<commit_id>X4對象名稱...)

這些命令確實會結束您與您希望在本地的東西。 (您可能需要使用git reset --hard保持工作樹和索引一樣提交你重新設置,但像往常一樣,要非常小心,git status是乾淨的,你使用該命令。)

如果你算賬試着把主人推給GitHub,它會告訴你所有的事情都已經是最新的了,因爲GitHub上的master就是一次提交。你可以強制推送,這樣主人在GitHub上重置,但這是重寫公共歷史記錄,所以你應該這樣做,只有當(a)你是唯一從GitHub獲取master或者(b)你可以讓你的合作者知道這樣做是自己不小心合併Y回到如果沒關係,你可以這樣做:。

git push --force origin master 

...然後在GitHub上master將與您的本地版本。

+1

+1 6秒鐘;) – VonC 2011-05-17 19:14:01

+0

同樣爲+1更簡潔的答案 - 7秒對於16分鐘的老問題是苛刻的! – 2011-05-17 19:17:09

+0

謝謝馬克。我現在是唯一一個承諾該項目的人。一個人實際上已經分解了這個項目,但他正在自己的工作。那麼,在那種情況下,我沒有理論上的危險,破壞了我的項目歷史,對他而言,他的叉子有問題嗎?對不起,我的*不太明亮*的問題。 :-) – 2011-05-17 19:34:27

3

它應該工作,但你將需要:

  • push -f origin master(強制推送,這將帶來麻煩,如果其他人已經克隆你的回購)
  • 推那麼你的新的分支(這將然後找到sha1,在其上設置新的分支)。
0

沒有人提到你可以簡單地將櫻桃選擇提交到另一個分支。這樣你的提交信息將仍然存在。

只需複製要移動的提交的修訂ID即可。 git log --oneline

比前代的頂部創建一個新的分支承諾,改變它: git checkout -b "$newBranchName" HEAD~$n (HEAD〜$ n代表第n次提交) 或 git checkout -b "$newBranchName" $formerRevsion

現在你只需要櫻桃挑選想要的承諾: git cherry-pick $revision

舊的提交將仍然在另一個分支,但你可以用rebase修復。移回你的舊分支,並使用rebase: git rebase -i HEAD~$n

只要刪除櫻桃採摘提交的提交行,你的分支將重新出售它。您必須使用git push -f,因爲所有重新提交的提交的修訂已更改。

相關問題