如何将整个代码库压缩到第一个提交?
我可以将其变基到第一个提交,但这样会留下两个提交。是否有一种方法可以引用第一个提交之前的提交?
如何将整个代码库压缩到第一个提交?
我可以将其变基到第一个提交,但这样会留下两个提交。是否有一种方法可以引用第一个提交之前的提交?
从 git 1.6.2 开始,你可以使用 git rebase --root -i
对于第一个提交以外的每个提交,将 pick
改为 squash
。
git push -f
- philshemg
。你只想要替换每行中第一个出现的单词 pick
。更好的方法是 :%s/^pick/squash/
。 - user137369你可以从 HEAD
直接创建一个 squash-all commit,完全不需要 rebase,只需运行以下命令:
git reset $(git commit-tree HEAD^{tree} -m "A new start")
注意:这需要一个类似于bash/zsh的POSIX兼容shell,或者在Windows上使用Git Bash。
~/.gitconfig
中创建别名[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} \"$@\");};f"
然后只需运行:git squash-all -m“全新的开始”
注意:要么从标准输入提供提交消息,要么通过-m
/-F
选项提供,就像git commit命令一样。请参见git-commit-tree手册。
或者,您可以使用以下命令创建别名:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} "$@");};f'
通过git commit-tree
创建单个提交
git commit-tree HEAD^{tree} -m "A new start"
的作用是:
基于提供的树对象创建新的提交对象,并将新的提交对象ID输出到标准输出。如果没有给出-m或-F选项,则从标准输入读取日志消息。
表达式HEAD^{tree}
表示与HEAD
对应的树对象,即当前分支的末端。参见Tree-Objects和Commit-Objects。
将当前分支重置为新提交
然后git reset
将当前分支简单地重置为新创建的提交对象。
这种方法不会触及工作区,也不需要rebase/squash操作,所以速度非常快。而且所需的时间与存储库大小或历史深度无关。
这对于使用其他存储库作为模板/原型/种子/骨架创建新项目的“初始提交”非常有用。例如:
cd my-new-project
git init
git fetch --depth=1 -n https://github.com/toolbear/panda.git
git reset --hard $(git commit-tree FETCH_HEAD^{tree} -m "initial commit")
这样可以避免将模板仓库作为远程仓库(origin
或其他)添加,同时将模板仓库的历史记录合并到你的初始提交中。
git push -f
进行推送以进行传播。 - ryenusgit clone
的项目模板存储库来启动新项目的方法时找到了这个答案。如果你在 git reset
中添加 --hard
,并将 HEAD
与 FETCH_HEAD
在 git commit-tree
中交换,那么在获取模板存储库后就可以创建一个初始提交。我在答案的最后编辑了一个部分来演示这一点。 - user23987${1?请输入一条信息}
来替换掉那个 "Caveat"。此举不会改变原有含义,同时使语义更加通俗易懂。 - Elliot Camerongit rebase --interactive --root
虽然git的rebase操作可以实现提交合并,但当需要合并大量提交时(例如数百次提交),这种方法很不切实际。因为交互式rebase编辑器需要生成大量提交清单列表,而且进行rebase过程也会非常缓慢。
下面是两种更快速、高效的解决方案,用于合并大量提交:
在当前分支的末尾(即最近的提交)创建一个新的孤立分支。这个孤立分支将作为完全新的、独立的提交历史树的初始根提交,并且等效于合并所有提交:
git checkout --orphan new-master master
git commit -m "Enter commit message for your new initial commit"
# Overwrite the old master branch reference with the new one
git branch -M new-master master
文档:
另一个高效的解决方案是使用混合或软重置到根提交<root>
:
git branch beforeReset
git reset --soft <root>
git commit --amend
# Verify that the new amended root is no different
# from the previous branch state
git diff beforeReset
文档:
git push origin master --force
。 - Eddy Verbruggengit push --force
。 - NecipAllef也许最简单的方法就是使用当前工作副本的状态创建一个新仓库。如果您想保留所有提交消息,可以先执行git log > original.log
,然后在新仓库中编辑这个文件以用作初始提交消息:
rm -rf .git
git init
git add .
git commit
或者git log > original.log
# edit original.log as desired
rm -rf .git
git init
git add .
git commit -F original.log
git rebase -i --root
。参见:https://dev59.com/CnI-5IYBdhLWcg3w0cKG#9254257。 - David J.echo "message" | git commit-tree HEAD^{tree}
这将创建一个孤立的提交,其树对象与HEAD相同,并将其名称(SHA-1)输出到标准输出。然后只需将你的分支重置到该提交上即可。
git reset SHA-1
要一步完成以上操作:
git reset $(git commit-tree HEAD^{tree} -m "Initial commit.")
git reset $(git commit-tree HEAD^{tree} -m "commit message")
将会更加方便。 - ryenusecho "message" | git commit-tree "HEAD^{tree}"
- Bernard这是我用的方法,希望对其他人有用:
记住这样做总会存在风险,在开始之前创建一个保存分支永远不是坏主意。
首先进行登录
git log --oneline
git reset --soft <#sha#>
<#sha#>
。git status
确保一切都是绿色的,否则运行git add -A
git commit --amend
修改所有当前更改为当前首次提交
现在强制推送此分支,它将覆盖原有内容。
我读到有关使用修补合并(grafts)的内容,但从未深入研究。
无论如何,您可以手动使用以下类似代码压缩最后2个提交:
git reset HEAD~1
git add -A
git commit --amend
最简单的方法是使用“管道”命令update-ref
删除当前分支。
你不能使用git branch -D
,因为它有一个安全阀来阻止你删除当前分支。
这会将你带回到“初始提交”状态,你可以从新的初始提交开始。
git update-ref -d refs/heads/master
git commit -m "New initial commit"
用六个单词概括:
git checkout --orphan new_root_branch && git commit
git help checkout
有关于 --orphan
的内容。 - kyb创建备份
git branch backup
重置到指定提交
git reset --soft <#root>
然后将所有文件添加到暂存区
git add .
提交时不更新信息
git commit --amend --no-edit
将压缩后的提交推送到存储库中的新分支
git push -f
<root>
提交。 git commit --amend --no-edit
将提交所有更改到当前提交<root>
,无需编辑提交消息。 - David