2012-09-12 27 views
0

我開始從我的主分支一個新的分支。但我不想要新的分支上的整個歷史。我想只有1個提交開始分支。擠壓或墊底,而分支

我創建了新的分支,並試圖重訂的所有提交,但因爲我沒有以前提交它不工作。我不明白的東西「以前的承諾」 ...

也許會更好壓垮提交。但是我的新分支在創建時已經與主人合併了。

我不知道該怎麼做。你有好主意嗎?

+0

對不起,我不能這樣做...... – Franck

回答

2

你可以做,使用一個小水管:

tree=$(git log -1 --format=%T master) 
commit=$(git commit-tree $tree -m "initial commit") 
git checkout -b new_branch $commit 

說明:

  1. 只提取樹(數據)從目前提交的master,因爲那是你真正感興趣。樹目標的SHA1打印git log -1 --format=%T,並保存到$tree

  2. 創建通訊它沒有父母的那棵樹。這是通過管道命令git commit-tree完成的,該命令採用樹對象和提交消息,並創建一個提交對象。它通常也需要父提交,但在這種情況下,我們不需要父代,所以我們不提供一個。該命令輸出結果提交的SHA1,我們將其保存到$commit

  3. 第三個最簡單的步驟是創建一個新的提交作爲起點的分支,用通常的git checkout -b完成。

編輯:一個更簡單的方式做到這一點是使用git checkout --orphan new_branch master之後git commit -m "Initial commit",用完全相同的結果。我爲了教育目的而離開了上述解釋,因爲研究它教給我一些關於git的細節。另外,請注意,git使得這很難做 - 歷史跟蹤受到高度鼓勵 - 所以如果你這樣做,一定要有一個很好的理由。

+1

它實際上是很容易:'git的更新裁判-d $(GIT象徵-REF HEAD); git commit -m'非常糟糕的主意' – fork0

+1

謝謝;同時我還發現了'git checkout --orphan',這看起來明顯是爲這種事情設計的。 – user4815162342

+0

'git checkout --orphan new_branch master'是解決方案。但是這種行爲有點奇怪。在我執行初始提交之前,我沒有看到新的分支。初始提交後,新的分支是可見的,我的bash表明正確的當前分支。 – Franck

1

當我看到你不明白一個分支是什麼。一個分支只是一個指向提交的指針。當你從master創建一個分支時,你不會創建任何提交,新分支只是指向與master相同的提交,它們都表示相同。所以,沒有任何東西可以擠壓或變硬,而且還沒有歷史。

你做一些修改,並提交它們在樹枝上只有後,那麼你的問題會使感:如何合併作爲一個提交到主分支的所有更改?只需使用git merge --squash branch即可。

+1

他可能不知道git分支是什麼,但很明顯,他不希望'git log'顯示所有以前的提交歷史記錄,這會在正常的git分支中發生。換句話說,他想做類似於將主分支的樹導入由'git init'創建的新回購的類似事物。除了他希望能夠繼續與其他分支和對象進行回購合作。 – user4815162342

+0

@ user4815162342:坦率地說,我不確定這是他想要的。這是一種先進的使用方法_ – fork0

+0

它對您和我都很重要,但可能不適用於OP。想象一下,有一堆線性歷史記錄的回購測試提交。完成之後,您想要將所有這些都壓縮到一個「初始」提交中,從中您將開始真正的工作。 'git rebase -i'似乎完全有能力完成這項工作,除了它不能從歷史上第一次提交開始的小麻煩之外,因爲不能從頭開始提供理論上的承諾!所以人們覺得這個愚蠢的初始提交會「卡住」,唯一的選擇是創建一個全新的回購。 – user4815162342