【问题标题】: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 您绝对可以以任何您想要的方式更改提交。它们几乎在任何时候都是完全可编辑的。如果您与他人共享代码,这样做会改写您的历史,您将有效地使用与其他人不同的分支。
  • 这不应该被欺骗。事实上,另一个应该被关闭的太宽泛了。另一个被标记为受骗的问题是不必要的复杂,因为它涉及放弃先前的变基。

标签: git merge branch git-svn rebase


【解决方案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 个关于“以错误的方式挤压”的评论)-stackoverflow.com/a/2568581/43453
  • @PandaWood 你误读了答案。第一种方法很简单错误,而不是不同。您可以向后压缩,考虑将较旧的提交压缩到较新的提交是没有意义的,但如果您可以,这将是相同的操作。
  • 我理解为“更改第二行的第一个单词” - 第二行是什么?
【解决方案2】:
  1. 检查您的分支并计算所有提交的数量。
  2. 打开 git bash 并写入:git rebase -i HEAD~<quantity of your commits>(即git rebase -i HEAD~5
  3. 在打开的txt 文件中,将所有提交的pick 关键字更改为squash,但第一次提交(位于顶部)除外。对于最上面的一个,将其更改为reword(这意味着您将在下一步中为此提交提供新评论),然后单击保存!如果在 vim 中,请按 esc,然后输入 wq! 保存并按 Enter。
  4. 提供评论。
  5. 打开 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 当我在此之后命令推送时,它会要求拉取和合并。我能做些什么来避免这种情况?
    • 你为什么不想拉和合并?
    猜你喜欢
    • 2023-01-12
    • 2017-05-07
    • 2013-10-11
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多