3 回答

TA貢獻1873條經驗 獲得超9個贊
現在,您可以將所有提交重新設置為根,然后選擇第二個提交Y與第一個壓縮X。
git rebase -i --root master
pick sha1 X
squash sha1 Y
pick sha1 Z
git rebase [-i] --root $tip
現在可以使用此命令重寫從“ $tip”到根提交的所有歷史記錄。
見提交df5df20c1308f936ea542c86df1e9c6974168472在GitHub上從克里斯·韋伯(arachsys)。
我相信您會在SO問題“ 如何合并git存儲庫的前兩次提交? ”中找到不同的配方。
查爾斯·貝利(Charles Bailey)在此處提供了最詳細的答案,提醒我們一次提交就是一棵完整的樹(不僅僅是與先前狀態的差異)。
在這里,舊的提交(“初始提交”)和新的提交(壓縮結果)將沒有共同的祖先。
這意味著您不能commit --amend將初始提交變成新的提交,然后將先前的初始提交的歷史記錄(新的沖突)基于新的初始提交。
(最后一句話對不再適用git rebase -i --root <aBranch>)
而是(使用A原始的“初始提交”,而B隨后的提交需要壓縮為初始提交):
返回我們要形成初始提交的最后一個提交(分離HEAD):
git checkout <sha1_for_B>
將分支指針重置為初始提交,但完整保留索引和工作樹:
git reset --soft <sha1_for_A>
使用'B'中的樹來修改初始樹:
git commit --amend
臨時標記此新的初始提交(或者您可以手動記住新的提交sha1):
git tag tmp
返回原始分支(此示例為master):
git checkout master
將B之后的所有提交重播到新的初始提交上:
git rebase --onto tmp <sha1_for_B>
刪除臨時標簽:
git tag -d tmp
這樣,“ rebase --onto”不會在合并過程中引入沖突,因為它會將最后一次提交()之后要壓縮的歷史重新建立B到最初的提交(A)中tmp(代表被壓縮的新的初始提交):瑣碎的快進僅合并。
既適用于“ A-B”,也適用于“ ” A-...-...-...-B(可以將任意數量的提交壓縮為初始提交)

TA貢獻1847條經驗 獲得超11個贊
我對VonC的腳本進行了重新設計,使其可以自動完成所有操作,而不要求我做任何事情。您給它兩個提交SHA1,它將把它們之間的所有內容壓縮到一個名為“壓縮歷史”的提交中:
#!/bin/sh
# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout $2
# reset the branch pointer to the initial commit (= $1),
# but leaving the index and working tree intact.
git reset --soft $1
# amend the initial tree using the tree from $2
git commit --amend -m "squashed history"
# remember the new commit sha1
TARGET=`git rev-list HEAD --max-count=1`
# go back to the original branch (assume master for this example)
git checkout master
# Replay all the commits after $2 onto the new initial commit
git rebase --onto $TARGET $2

TA貢獻1853條經驗 獲得超18個贊
如果您只是想將所有提交壓縮到一個初始提交中,只需重置存儲庫并修改第一個提交即可:
git reset hash-of-first-commit
git add -A
git commit --amend
Git重置將使工作樹保持完整,因此一切仍然存在。因此,只需使用git add命令添加文件,然后使用這些更改來修改第一次提交。與rebase -i相比,您將失去合并git注釋的能力。
- 3 回答
- 0 關注
- 621 瀏覽
添加回答
舉報