我该如何将最近的 N 次提交压缩成一个提交记录?
许多解答都基于git rebase
命令,但据我的经验,这对于刚开始使用Git的人来说有点复杂和高级。
假设你想压缩最近的3个提交记录。则按照以下步骤进行:
git log -1 --oneline
命令并记下现在状态的提交ID(以防万一您使用了错误的git reset操作)git reset --soft HEAD~3
,您将会回退3个提交记录(并且会忘记之前已经做过这三次提交)git commit -m <NEW_SINGLE_MESSAGE>
命令,它将自动将这三次提交记录合并为一个,并使用指定的消息。如果使用git reset时出现问题,则可以通过git reset --soft <ORIGINAL_COMMIT>
再次返回原始状态。
git reset --soft HEAD~3
命令之前创建一个新的分支作为备份。这样,你就有了一个精确、易于使用的起始副本。即使在最后进行强制推送之后也是如此。 - NateH06根据我找到的这篇文章,我发现这种方法对我的使用情况更简单。
我的“dev”分支比“origin/dev”超前了96次提交(所以这些提交尚未推送到远程)。
在推送更改之前,我想将这些提交压缩成一个。我更倾向于将分支重置为“origin/dev”的状态(这将使来自96次提交的所有更改保持未暂存状态),然后一次性提交更改:
git reset origin/dev
git add --all
git commit -m 'my commit message'
Anomies答案很好,但我对此感到不安,因此决定添加一些截图。
使用git log
查看当前所在位置。最重要的是找到第一个您不想合并的提交哈希值。只需:
执行git rebase -i [your hash]
。在我的情况下:
$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d
在我的情况下,我想将提交时间最早的所有内容压缩成一个。排序顺序是从先到后,与git log
完全相反。在我的情况下,我想要:
如果您只选择了一个提交并压缩了其余内容,则可以调整一个提交消息:
就是这样。一旦保存(:wq
),您就完成了。使用git log
查看它。
git log
。 - Timothy L.J. Stewart我认为最简单的方法是基于主分支创建一个新分支,并对功能分支执行merge --squash
操作。
git checkout master
git checkout -b feature_branch_squashed
git merge --squash feature_branch
那么你已经准备好提交所有的更改了。
git merge
的存在。 - Felipe Romero1)识别提交的短哈希值
# git log --pretty=oneline --abbrev-commit
abcd1234 Update to Fix for issue B
cdababcd Fix issue B
deab3412 Fix issue A
....
即使在这里也可以使用git log --oneline
来获取短哈希值。
2) 如果您想要合并最近的两个提交,请执行squash操作。
# git rebase -i deab3412
3) 这将打开一个 nano
编辑器,用于合并。界面如下所示:
....
pick cdababcd Fix issue B
pick abcd1234 Update to Fix for issue B
....
4) 将单词pick
重命名为squash
,该单词在abcd1234
之前。 重命名后应如下所示。
....
pick cdababcd Fix issue B
squash abcd1234 Update to Fix for issue B
....
5) 现在保存并关闭nano
编辑器。按ctrl + o
,然后按Enter
键保存。然后按ctrl + x
退出编辑器。
6) 然后nano
编辑器再次打开以更新注释,如果需要更新,则进行更新。
7) 现在已成功压缩,您可以通过检查日志来验证它。
# git log --pretty=oneline --abbrev-commit
1122abcd Fix issue B
deab3412 Fix issue A
....
8) 现在将更改推送到代码仓库。注意在分支名称前添加+
符号,这表示强制推送。
# git push origin +master
注意:这是基于在 Ubuntu
shell 上使用 Git。如果您使用不同的操作系统(Windows
或 Mac
),则以上命令相同,除了编辑器可能不同。
git add <files>
--fixup
选项提交,并且OLDCOMMIT
应该是我们需要合并(压缩)这个提交的位置。git commit --fixup=OLDCOMMIT
现在这将在HEAD顶部创建一个新的提交,其中包含fixup1 <OLDCOMMIT_MSG>
。
OLDCOMMIT
中。git rebase --interactive --autosquash OLDCOMMIT^
这里的^
表示前一次提交到OLDCOMMIT
。使用rebase
命令会在编辑器(vim或nano)上打开交互式窗口,
我们无需进行任何操作,只需保存并退出即可。因为传递给此选项的参数将自动将最新提交移动到旧提交的下一步,并将操作更改为fixup
(相当于squash)。然后rebase继续并完成。
--amend
与git-commit
一起使用。 # git log --pretty=oneline --abbrev-commit
cdababcd Fix issue B
deab3412 Fix issue A
....
# git add <files> # New changes
# git commit --amend
# git log --pretty=oneline --abbrev-commit
1d4ab2e1 Fix issue B
deab3412 Fix issue A
....
使用--amend
将新更改合并到最后一次提交cdababcd
并生成新的提交ID1d4ab2e1
git reset --soft HEAD~10 && git commit -m "squashed commit"
如果你也想要使用压缩的提交来更新远程分支:
git push -f
git reset --soft HEAD~3
git commit
git push origin <branch_name> --force
golden_repo_name
)克隆的远程分支(称为feature-branch
)上,那么这里是将你的提交压缩成一个的技术:
检出黄金仓库
git checkout golden_repo_name
按以下步骤从golden repo创建一个新分支
git checkout -b dev-branch
将您已经拥有的本地分支进行Squash合并。git merge --squash feature-branch
提交你的更改(这将是dev分支中唯一的提交)git commit -m "My feature complete"
将分支推送到您的本地代码库。git push origin dev-branch
git fold --from abc --to efg
这样的命令? - user27182