如何将两个提交合并为一个提交?

问题描述 投票:0回答:5

我有一个分支“firstproject”,有 2 次提交。我想摆脱这些提交并使它们显示为单个提交。

命令

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 merge branch git-svn rebase
5个回答
220
投票

您想要

git rebase -i
执行交互式变基

如果您当前正在进行“提交 1”,并且要合并的提交“提交 2”是上一个提交,则可以运行

git rebase -i HEAD~2
,这将生成一个编辑器,其中列出了所有提交rebase会遍历。您应该看到两行以“pick”开头的行。要继续挤压,请将第二行的第一个单词从“pick”更改为“squash”。然后保存文件并退出。 Git 会将您的第一次提交压缩为倒数第二次提交。

请注意,此过程会重写您的分支的历史记录。如果您要将代码推送到某个地方,则必须

git push -f
,并且任何共享您的代码的人都必须跳过一些障碍才能拉取您的更改。

请注意,如果有问题的两个提交不是分支上的最后两个提交,则过程将略有不同。


108
投票
适合像我这样健忘的人的懒惰简单版本:

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 次提交的意图。


31
投票
    检查您的分支并计算所有提交的数量。
  1. 打开 git bash 并写入:
  2. git rebase -i HEAD~<quantity of your commits>
    (即
    git rebase -i HEAD~5
  3. 在打开的
  4. txt
     文件中,将所有提交的 
    pick
     关键字更改为 
    squash
    ,除了第一次提交(位于顶部)。对于第一个,将其更改为 
    reword
    (这意味着您将在下一步中为此提交提供新评论),然后单击“保存”!如果在 vim 中,请按 
    esc
    ,然后输入 
    wq!
     保存,然后按 Enter。
  5. 提供评论。
  6. 打开 Git 并选择“获取全部”以查看新更改。
完成


16
投票
这就是我所做的。 (对我来说)这比进行交互式变基更容易:

git reset HEAD~2. // go back 2 commits. git commit -am “My squashed single commit” git push --force
    

0
投票
前面提到了交互式变基和合并重置。 另一种方法对我来说更安全,因为不使用所有以前的东西(交互式和重置)并且不与现有数据交互。它使用

git merge --squash

,就像主题启动者建议的那样。它创建一个新分支并与 squash 合并到其中:

git branch <result_branch_name> <point from where you want to merge commits> git checkout <result_branch_name> git merge --squash <branch_with_all_your_commits>
因此,您将收到创建结果分支的点与最终提交之间所有提交的分阶段更改。提交消息将包含来自所有压缩提交的所有消息。然后只需输入 

git commit

,修改提交消息,您将获得包含所有必要更改的唯一提交。当你准备好说再见时,可以使用 gitbranch -D 
删除原始分支 =)

© www.soinside.com 2019 - 2024. All rights reserved.