2014-10-20 27 views
2

我是新來的Git,現在我只與本地存儲庫合作,但我最終會與其他開發人員共享我的工作。我試圖找出合併回主分支後,在主題分支上修復代碼的正確方法。下面是我有:git正確的方法來修復分支合併後的主題

enter image description here

我演講的題目是在C2實現在主題分支,然後合併在主分支。對於不同的主題,主人還有另一個提交C5。現在我剛剛發現了C2中實現的功能問題。我是否應該在主題分支中將它修復爲C6,然後在主分支上再次合併?或者我應該擺脫主題分支,因爲它已經被合併,並直接在主分支中修復它?

理想情況下,我想保持C2和C6在一個單一的提交,以便當我們實現遠程存儲庫時,我可以推出一個清晰的歷史。但我認爲我不能因爲合併而壓制C2和C6。有沒有辦法做到這一點?

在合併後修復主題會被認爲是一種很好的做法嗎?

回答

1

這將有助於你瞭解如何管理你的本地歷史記錄git rebase。例如,考慮這個歷史命令,我認爲大致再現您的情況,並使用git rebase -i重新安排當地的歷史可能的解決方案:

mkdir tmpfoo 
cd tmpfoo/ 
git init 
touch bar 
git add . 
git commit -am 'c1' 
git checkout -b topic 
touch baz 
git add . 
git commit -am 'c2' 
git checkout master 
touch foo 
git add . 
git commit -am 'c3' 
git merge topic 
touch quux 
git add . 
git commit -am 'c5' 
git checkout topic 
echo b >> baz 
git commit -am 'c6' 
git checkout master 
git merge topic 
git log --oneline --graph --decorate --all 
* 577f974 (HEAD, master) Merge branch 'topic' 
|\ 
| * 6750b0d (topic) c6 
* | 08ebbf2 c5 
* | 0cef647 Merge branch 'topic' 
|\ \ 
| |/ 
| * f1e6882 c2 
* | 0e19228 c3 
|/ 
* 90e6149 c1 
19933 git rebase -i 90e6149 
>>edit the sequence of commits to something like the following: 
pick 0e19228 c3 
pick 08ebbf2 c5 
pick f1e6882 c2 
s 6750b0d c6 
19934 git log --oneline --graph --decorate --all 
* 0e3afe0 (HEAD, master) c2 
* 7611fb9 c5 
* 0e19228 c3 
| * 6750b0d (topic) c6 
| * f1e6882 c2 
|/ 
* 90e6149 c1 
git diff ORIG_HEAD # no output here, the rebase didn't change the working tree's state 
+0

謝謝@jonderry,這看起來像我需要的。如果我理解正確,你可以使用rebase交互刪除歷史記錄中的c4,而不是合併主題分支,而是將它留在那裏,如果需要其他rebase,可以稍後使用它。 – loopkin 2014-10-20 21:02:49

+0

是的,如果您認爲在重新整理之前您可能需要重做舊作,那麼最好暫時離開分支,這樣您就不必搜索自己的reflog以查找舊的部分作品。交互式rebase可以對提交進行重新排序,並將多個提交「壓縮」爲一個更大的提交。 – jonderry 2014-10-20 21:20:54

+0

你可能想編輯你的答案並替換你的別名'commit'和'checkout' – 2014-10-20 21:37:53

1

嗯,我可以想到一個黑客做到這一點。它僅在主分支包含在遠程存儲庫中並且始終可以從該存儲庫中取出時起作用。然後,你應該做以下步驟在本地資源庫:

  1. git checkout master
  2. git reset --hard <C3> - 重置合併之前提交提交
  3. git checkout topic
  4. 你想在C6
  5. git commit --amend做什麼 - 這可以讓你在C2中節省C6實際上
  6. git checkout master
  7. git pull origin master - 拉你已經重置提交從遠程倉庫
  8. git merge topic

請注意,你可以做到這一點只有在主分支是不是你的本地分支,而是存儲在遠程存儲庫。此外,只有在尚未將工作推送到遠程存儲庫時纔有效。

+0

它聽起來並不像他有一個遠程倉庫。 – 2014-10-20 20:41:33

+0

我可以創建此存儲庫的副本並將其用作遠程實現您描述的「黑客」? – loopkin 2014-10-20 20:44:25

+0

@ZuoLi,謝謝你的回答。我不確定我可以直接應用它。我也更新了我的問題,我想我正在尋找的是如何處理這種情況的最佳做法。我沒有足夠的經驗讓Git知道我要求的是正確的做法。 – loopkin 2014-10-20 20:50:50