2012-02-09 79 views
1

這裏是我的gitk(改善我覺得從這個問題,謝謝@amber:Merging commits from branch to master -> odd-looking tree):如何解決和合並這個混帳樹?

frontend是在左邊。您可以在右下角看到masterremotes/origin/master的提示,並以黃色顯示。

gitk --all git tree
我需要做兩件事情,我經歷過約36小時的麻煩:

  1. 我怎麼可以開始添加frontend的承諾掌握(一個接一個,「添加推遲'首先),所以我可以推他們?我不想合併整個分支,因爲涉及很多代碼,並且兩個分支都有工作樹,我不想打擾。
  2. 我似乎在frontend附近有兩個相同的「批量更新」條目,左上角沒有分支。我怎樣才能擺脫頂部的無網格bulk update的東西,所以有2個乾淨的分支?我想有它看起來像這樣:

    | # frontend 
    | # Bulk update. 
    | # ...commits... 
    | # move this frontend commit to master 
    | | #master's changes 
    | | #master, remotes/origin/master, remotes/staging/master 
    

我真的很想做這自己,但最後一天,掙扎的一半表明,在我進入絲毫不準確常常導致在搞亂它更多。

回答

0

您應該將您的問題分爲兩個獨立的SO問題,以遵循Q & A格式。話雖這麼說:

  1. 結帳掌握和運用git cherry-pick -e <sha>其中<sha>是要添加到masterfrontend參考每個簽入。所以你會先使用git cherry-pick -e <sha of 'adding delay'>。您可以按照您想要的任何順序挑選櫻桃,以便您可以按照與master不同的順序從frontend安排您想要的支票。請參閱http://technosophos.com/content/git-cherry-picking-move-small-code-patches-across-branches

    另一種方法是rebase,但如果不使用機制,這可能比使用cherry-pick更容易混淆。我建議你先試着用這種方法克隆你的repo。你總是可以撤消我所說的話,但如果你已經被時間緊迫的話,你不想浪費你的時間去思考如何去做。

    首先結帳frontend然後創建一個新分支tmp(因爲你不想實際刪除前端)。

    然後做git rebase -i --onto master master tmp。這將帶來一個編輯器,刪除並重新安排將在您的前端分支中以任何您需要的順序簽入主登錄後提交的checkins。

    當你與tmp做將是你要掌握這麼結賬master,做git reset --hard tmp並刪除tmp分支git branch -d tmp

    Pro Git書有很好的關於rebase的信息,但我已將這些概念應用到您的用例中。 http://progit.org/book/ch3-6.html

  2. 首先確保列出的批量更改實際上是重複的。您可以使用git diff <sha of bulk1> <sha of bulk2>來查看差異。如果它是相同的或不相同的,那麼從列表中刪除它的關鍵是刪除你在某個時候給你的git。如果它不是重複的,請確保在刪除存儲之前決定如何處理差異。

    雖然在一個分支做git stash pop,如果你真的不希望你藏在儲存做git reset --hard HEAD。在這一點上,如果你重新運行你的gitk(刷新不會顯示這個),你會看到左上角的那些條目被刪除。你的gitk圖表顯示隱藏是由主人索引的,所以這就是我要使用隱藏的地方,但你最好知道哪個分支,masterfrontend,你可能想要使用它。

    您也可以使用git stash pop並提交您保存的更改,它將消失。在gitk中有一個分支歷史記錄的唯一原因是顯示git如何知道如何重新創建存儲中的差異。一旦你彈出這個藏匿處,它就會忘記藏匿的任何祖先,這就像將藏匿物重新放到你彈出的地方。

    @Jefromi有隻刪除藏匿,如果你不從他們需要什麼,一個更簡潔的方法,這些都不是他的原話,但他指出:

    使用git stash clear刪除所有藏匿。你可以使用git stash drop [email protected]{n}來放棄那個。使用git stash list來查看n應該是什麼。

+1

這一切都是正確的。不過,你在第二個問題上有點偏離。提交不僅僅是快照 - 它們還包括元數據。這兩個提交可以具有相同的樹,但是不同的消息(和時間戳)。你遺漏了一件重要的事情:那個提交的第二個版本幾乎肯定是由'git commit --amend'創建的;重要的是要知道修改提交會創建一個新的提交,並且舊提交仍然懸而未決。在這種情況下,它被固定在那裏。 – Cascabel 2012-02-09 23:43:37

+0

至於彈出存儲:你可能不想在master上這樣做,因爲它可能隱藏了在前端分支上下文中有意義的工作。如果它的內容很重要,那麼在彈出它之前可能需要檢查前端。如果你想把它扔掉,你可以使用'git stash clear'去除所有的stash,或者'git stash drop stash @ {n}'去掉那個(使用'git stash list'來查看'n'應該)。 – Cascabel 2012-02-09 23:45:16

+0

@Jefromi謝謝,我不記得其他事情可能已經改變,這將改變提交的唯一性。我更新了我的答案。 – James 2012-02-10 18:05:35