如何将整个存储库压缩到第一次提交?
我可以将base转换为第一次提交,但这将留给我2次提交。 有没有办法在第一个提交之前引用这个提交?
如何将整个存储库压缩到第一次提交?
我可以将base转换为第一次提交,但这将留给我2次提交。 有没有办法在第一个提交之前引用这个提交?
当前回答
最简单的方法是使用'plumbing'命令update-ref删除当前分支。
你不能使用git branch -D,因为它有一个安全阀来阻止你删除当前的分支。
这会让你回到“初始提交”状态,在那里你可以开始一个新的初始提交。
git update-ref -d refs/heads/master
git commit -m "New initial commit"
其他回答
也许最简单的方法是用工作副本的当前状态创建一个新的存储库。如果你想保留所有的提交消息,你可以先执行git log > original.log,然后在新的存储库中编辑你的初始提交消息:
rm -rf .git
git init
git add .
git commit
or
git log > original.log
# edit original.log as desired
rm -rf .git
git init
git add .
git commit -F original.log
假设你有这些从06年到10年的提交。
您希望将06年后的提交合并为一个提交Id。
commit 10
commit 09
commit 08
commit 07
commit 06
你可以软复位git。
git reset --soft "06"
然后,运行下面的命令将这些更改推送到远程分支。
git push origin HEAD --force
现在,您之前所做的所有提交都应该作为您的本地更改可用,您可以将所有这些提交合并到单个提交中。
现在,新的提交结构应该如下所示:
commit <new_commit_containing_all_7_8_9_10>
commit 06
由于我在这里提出的解决方案中遇到了一些麻烦,我想分享一个非常简单的解决方案(将一个特性分支上的所有提交压缩成一个):
git merge origin/master && git reset --soft origin/master
前面的合并cmd确保,在提交时,没有来自master的最近更改会出现在您的头上!之后,只需提交更改并执行git push -f
从git 1.6.2开始,你可以使用git rebase——root -i
对于除第一次提交外的每个提交,将pick更改为squash。
当我从git存储库恢复模板时,我通常会压缩整个树,以获得更干净的历史记录,并确保合法合规。我的工作流程是这样的:
git clone https://git.invalid/my-awesome-template.git my-awesome-foo
cd !$
git branch -M master my-awesome-template/master
git checkout --orphan master
git rm -rf /
git commit --allow-empty --allow-empty-message -m 'Initial commit'
git merge --squash --allow-unrelated-histories my-awesome-template/master
git commit
git branch -D my-awesome-template/master
# you can now `drop' that "Initial commit":
git rebase -i --root
这将把整个历史记录压缩到一个大的提交消息中。
在这个例子中:
Master是工作分支 My-awesome-template /master是一个中间分支