如何将两个提交合并为一个提交?
Posted
技术标签:
【中文标题】如何将两个提交合并为一个提交?【英文标题】:How can I combine two commits into one commit? 【发布时间】:2012-09-13 09:44:49 【问题描述】:我有一个包含 2 次提交的分支“firstproject”。我想摆脱这些提交并使它们显示为单个提交。
命令git merge --squash
听起来很有希望,但是当我运行git merge --squash
时,我的终端只会显示该命令的选项。什么是正确的命令?
Commit 1:
Added 'homepage.html'
Added 'contacts.html'
Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'
【问题讨论】:
我认为这不是正确的命令。另外,我怀疑您甚至可以更改这样的提交。 不,您可以将多个提交更改为一个提交:git-scm.com/book/en/Git-Tools-Rewriting-History 我的问题只是关于它的具体命令。 @BSull 您绝对可以以任何您想要的方式更改提交。它们几乎在任何时候都是完全可编辑的。如果您与他人共享代码,这样做会改写您的历史,您将有效地使用与其他人不同的分支。 这不应该被欺骗。事实上,另一个应该被关闭的太宽泛了。另一个被标记为受骗的问题是不必要的复杂,因为它涉及放弃先前的变基。 【参考方案1】:你想git rebase -i
执行interactive rebase。
如果您当前在您的“提交 1”,并且您要合并的提交“提交 2”是之前的提交,您可以运行 git rebase -i HEAD~2
,它将生成列出 rebase 将遍历的所有提交的编辑器。您应该看到以“pick”开头的两行。要继续挤压,将第二行的第一个单词从“pick”更改为“squash”。然后保存文件,然后退出。 Git 会将你的第一个提交压缩到你的第二个最后提交。
请注意,此过程会重写您的分支的历史记录。如果您将代码推送到某个地方,则必须发送至 git push -f
,任何共享您的代码的人都必须跳过一些障碍来拉取您的更改。
请注意,如果有问题的两个提交不是分支上的最后两个提交,则过程会略有不同。
【讨论】:
Then write your file, and quit
怎么办?我正在使用 android Studio 终端、git 控制台本身,甚至是由 SourceTree 软件打开的 git 控制台。但是如何保存和退出呢?
如何合并不是分支上最后两个提交的 2 个提交?
@meagar 我认为这确实有道理......如果你检查这个问题(这个问题的副本),挤压“方向”会产生很大的不同,并且是整个问题的根源(参见第一条评论大约有 200 个关于“以错误的方式挤压”的评论)-***.com/a/2568581/43453
@PandaWood 你误读了答案。第一种方法很简单错误,而不是不同。您可以仅向后压缩,考虑将较旧的提交压缩到较新的提交是没有意义的,但如果您可以,这将是相同的操作。
我理解为“更改第二行的第一个单词” - 第二行是什么?【参考方案2】:
-
检查您的分支并计算所有提交的数量。
打开 git bash 并写入:
git rebase -i HEAD~<quantity of your commits>
(即git rebase -i HEAD~5
)
在打开的txt
文件中,将所有提交的pick
关键字更改为squash
,但第一次提交(位于顶部)除外。对于最上面的一个,将其更改为reword
(这意味着您将在下一步中为此提交提供新评论),然后单击保存!如果在 vim 中,请按 esc
,然后输入 wq!
保存并按 Enter。
提供评论。
打开 Git 并进行“获取所有”以查看新更改。
完成
【讨论】:
【参考方案3】:像我这样健忘的懒人简单版:
git rebase -i HEAD~3
或者但是很多提交而不是 3。
转这个
pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage
进入这个
pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage
并执行一些操作,点击esc
然后点击enter
以保存更改。 [1]
当下一个屏幕出现时,摆脱那些垃圾 # 行 [2] 并创建一个新的提交消息或其他东西,然后执行相同的 escape
enter
操作。 [1]
哇,你的提交更少了。或者你只是破坏了一切。
[1] - 或者任何适用于你的 git 配置的东西。考虑到我的设置,这只是一个有效的序列。
[2] - 你会看到像# this is your n'th commit
这样的东西几次,你的原始提交就在这些消息的正下方。您想删除这些行,并创建一个提交消息以反映您合并为 1 的 n 个提交的意图。
【讨论】:
非常简洁的解决方案 - 谢谢。概述这里使用的s
代表壁球可能会很方便。使用提交,但融合到之前的提交中
如果您只有2
提交并且想要合并相同的2
提交,则需要运行git reset --soft HEAD~
和git commit --amend
。
@Stachu 当我在此之后命令推送时,它会要求拉取和合并。我能做些什么来避免这种情况?
你为什么不想拉和合并?以上是关于如何将两个提交合并为一个提交?的主要内容,如果未能解决你的问题,请参考以下文章