Ver*_*gen 427 git rebase git-rebase squash git-rewrite-history
你如何将整个存储库压缩到第一次提交?
我可以重新设置第一次提交,但这会让我有2次提交.有没有办法在第一个之前引用提交?
Jor*_*wis 621
在最新版本的git中,您可以使用git rebase --root -i
.
对于除第一个之外的每个提交,请更改pick
为squash
.
rye*_*nus 291
我做了一个别名git squash-all
.
用法示例:git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Run Code Online (Sandbox Code Playgroud)
警告:记得提供评论,否则将使用默认提交消息"新的开始".
或者,您可以使用以下命令创建别名:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
Run Code Online (Sandbox Code Playgroud)
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Run Code Online (Sandbox Code Playgroud)
注意:这里A new start
只是一个例子,随意使用您自己的语言.
无需压缩,用于git commit-tree
创建孤立提交并使用它.
通过创建一个提交 git commit-tree
这git commit-tree HEAD^{tree} -m "A new start"
是什么:
基于提供的树对象创建新的提交对象,并在stdout上发出新的提交对象ID.除非给出-m或-F选项,否则将从标准输入中读取日志消息.
将当前分支重置为新提交
然后git reset
只需将当前分支重置为新创建的提交对象.
这样,工作区中没有任何东西被触及,也不需要变形/壁球,这使得它非常快.所需时间与存储库大小或历史深度无关.
这对于使用另一个存储库作为模板/ archetype/seed/skeleton在新项目中创建"初始提交"很有用.例如:
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")
Run Code Online (Sandbox Code Playgroud)
这样可以避免将模板仓库添加为远程(origin
或其他),并将模板仓库的历史记录折叠到初始提交中.
小智 158
如果您只想将所有提交压缩到根提交,那么同时
git rebase --interactive --root
Run Code Online (Sandbox Code Playgroud)
可以工作,对于大量提交(例如,数百次提交)来说是不切实际的,因为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
Run Code Online (Sandbox Code Playgroud)
文档:
另一个有效的解决方案是简单地对根提交使用混合或软重置<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
Run Code Online (Sandbox Code Playgroud)
文档:
Pat*_*otz 129
也许最简单的方法是使用工作副本的当前状态创建一个新的存储库.如果要保留所有可以先执行的提交消息git log > original.log
,然后在新存储库中编辑初始提交消息:
rm -rf .git
git init
git add .
git commit
Run Code Online (Sandbox Code Playgroud)
要么
git log > original.log
# edit original.log as desired
rm -rf .git
git init
git add .
git commit -F original.log
Run Code Online (Sandbox Code Playgroud)
kus*_*sma 48
echo "message" | git commit-tree HEAD^{tree}
Run Code Online (Sandbox Code Playgroud)
这将使用HEAD树创建一个孤立提交,并在stdout上输出它的名称(SHA-1).然后在那里重置你的分支.
git reset SHA-1
Run Code Online (Sandbox Code Playgroud)
Log*_*gan 38
以下是我最终如何做到这一点,以防它适用于其他人:
请记住,做这样的事情总是存在风险,在开始之前创建保存分支绝对不错.
从记录开始
git log --oneline
Run Code Online (Sandbox Code Playgroud)
滚动到第一次提交,复制SHA
git reset --soft <#sha#>
Run Code Online (Sandbox Code Playgroud)
替换<#sha#>
w /从日志中复制的SHA
git status
Run Code Online (Sandbox Code Playgroud)
确保一切都是绿色的,否则运行 git add -A
git commit --amend
Run Code Online (Sandbox Code Playgroud)
修改当前第一次提交的所有当前更改
现在强行推动这个分支,它将覆盖那里的东西.
CB *_*ley 34
最简单的方法是使用'plumbing'命令update-ref
删除当前分支.
您不能使用git branch -D
因为它有一个安全阀来阻止您删除当前分支.
这会使您回到"初始提交"状态,您可以从新的初始提交开始.
git update-ref -d refs/heads/master
git commit -m "New initial commit"
Run Code Online (Sandbox Code Playgroud)
R. *_*des 31
我读了一些关于使用移植物的内容,但从未对它进
无论如何,你可以手动压缩最后2次提交,如下所示:
git reset HEAD~1
git add -A
git commit --amend
Run Code Online (Sandbox Code Playgroud)
kyb*_*kyb 13
git checkout --orphan new_root_branch && git commit
Run Code Online (Sandbox Code Playgroud)
小智 9
为此,您可以将本地 git 存储库重置为第一个提交主题标签,以便在该提交之后的所有更改都将取消暂存,然后您可以使用 --amend 选项进行提交。
git reset your-first-commit-hashtag
git add .
git commit --amend
Run Code Online (Sandbox Code Playgroud)
然后根据需要编辑第一个提交 nam 并保存文件。
小智 9
假设您的分支中有 3 个提交,并且它已经被推送到远程分支。
例子:
git log -4
Run Code Online (Sandbox Code Playgroud)
将显示如下结果:
<your_third_commit_sha>
<your_second_commit_sha>
<your_first_commit_sha>
<master_branch_commit_sha - your branch created from master>
Run Code Online (Sandbox Code Playgroud)
您希望将最后 3 次提交压缩为一次提交并推送到远程分支。以下是步骤。
git reset --soft <master_branch_commit_sha>
Run Code Online (Sandbox Code Playgroud)
现在所有提交更改都已集成但未提交。验证方式:
git status
Run Code Online (Sandbox Code Playgroud)
通过消息提交所有更改:
git commit -m 'specify details'
Run Code Online (Sandbox Code Playgroud)
强制将单个提交推送到远程分支:
git push -f
Run Code Online (Sandbox Code Playgroud)
创建一个备份
git branch backup
Run Code Online (Sandbox Code Playgroud)
重置为指定的提交
git reset --soft <#root>
Run Code Online (Sandbox Code Playgroud)
然后将所有文件添加到暂存
git add .
Run Code Online (Sandbox Code Playgroud)
提交而不更新消息
git commit --amend --no-edit
Run Code Online (Sandbox Code Playgroud)
推送新的分支并压缩回购
git push -f
Run Code Online (Sandbox Code Playgroud)
添加一个文件.git/info/grafts
,把你想成为根的提交哈希放在那里
git log
现在将从那个提交开始
让它“真正”运行 git filter-branch
我通常这样做:
确保所有内容都已提交,并记下最新的提交 ID,以防出现问题,或者创建一个单独的分支作为备份
运行git reset --soft `git rev-list --max-parents=0 --abbrev-commit HEAD`
以将头重置为第一次提交,但保持索引不变。自第一次提交以来的所有更改现在都将显示为可以提交。
运行git commit --amend -m "initial commit"
将您的提交修改为第一个提交并更改提交消息,或者如果您想保留现有的提交消息,您可以运行git commit --amend --no-edit
运行git push -f
以强制推动您的更改
对我来说,它是这样工作的:我总共有 4 次提交,并使用了交互式变基:
git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)
第一个提交仍然存在,我进行了 3 个最新提交。
如果您卡在接下来出现的编辑器中,您会看到如下内容:
pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
Run Code Online (Sandbox Code Playgroud)
你必须首先提交并把其他人压在上面。你应该拥有的是:
pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
Run Code Online (Sandbox Code Playgroud)
为此,请使用 INSERT 键更改“插入”和“编辑”模式。
要保存并退出编辑器,请使用:wq
. 如果您的光标位于这些提交行之间或其他位置,请按 ESC 并重试。
结果我有两次提交:第一个保留下来,第二个带有消息“这是 3 个提交的组合。”。
在此处查看详细信息: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
假设您从 06 到 10 有这些提交。
您想要将 06 后的提交合并到单个提交 ID。
commit 10
commit 09
commit 08
commit 07
commit 06
Run Code Online (Sandbox Code Playgroud)
你可以做一个 git 重置软件。
git reset --soft "06"
Run Code Online (Sandbox Code Playgroud)
然后,运行以下命令将这些更改推送到远程分支。
git push origin HEAD --force
Run Code Online (Sandbox Code Playgroud)
现在,您之前所做的所有提交都应该可以作为本地更改使用,并且您可以将所有这些提交合并到一个提交中。
现在,新的提交结构应如下所示:
commit <new_commit_containing_all_7_8_9_10>
commit 06
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
195229 次 |
最近记录: |