当前位置:   article > 正文

[Git & GitHub] 如何合并多个 commit_合并commit

合并commit

目录

一、前言

二、多个 commit 的现象

三、将多个 commit 进行合并的方法

四、文末总结


一、前言

众所周知,Git是一款分布式版本控制工具。由于其分布式特性,理论上我们可以在没有网络连接的情况下进行版本管理。然而,实际上这并非完全可行,因为我们仍然需要在线查阅Git的各种命令和文档。

为什么我要写这篇文章呢?原因在于许多同学经常向我咨询如何减少Pull Request中的提交记录、如何合并提交以及如何应对过多的提交记录。每次都重复相同的解释,这显然不符合程序员的风格。

二、多个 commit 的现象

那么,就先让我们来看这么一个情况,我们执行以下命令获得四个 Commit:

  1. mkdir test
  2. cd test
  3. git init
  4. echo "0" >> a
  5. git add a
  6. git commit -m "Commit-0"
  7. echo "1" >> a
  8. git add a
  9. git commit -m "Commit-1"
  10. echo "2" >> a
  11. git add a
  12. git commit -m "Commit-2"
  13. echo "3" >> a
  14. git add a
  15. git commit -m "Commit-3"

我们可以看到 Git 的里面的记录是这样的:

  1. * b1b8189 - (HEAD -> master) Commit-3
  2. * 5756e15 - Commit-2
  3. * e7ba81d - Commit-1
  4. * 5d39ff2 - Commit-0

从上面的记录可以看到,在 git 中的记录,commit是有多条的,那么如何进行合并呢,接下来进行讲解。

三、将多个 commit 进行合并的方法

那么问题来了,如何把 e7ba81d(Commit-1)5756e15(Commit-2)b1b8189(Commit-3) 合并到一起,并且只保留 e7ba81d(Commit-1) 的 git message Commit-1 呢?

这个时候我们就要祭出我们这篇文章的主角—— git rebase -i 了!
这里我不想直接搬出写文档的那套,把所有的选项都介绍完,我们就把这次要用到的讲一下。

-i 实际上就是 --interactive 的简写

在使用 git rebase -i 时,我们要在后面再添加一个参数,这个参数应该是 最新的一个想保留的 commit。这句话读起来有点坳口,所以这个情况下通常需要举个例子。就我们前面提到的那个例子中,这个「最新的一个想保留的 commit」就是 5d39ff2(Commit-0),于是我们的命令看起来就长这样:

git rebase -i 5d39ff2

当然,我们也可以通过 HEAD~3 来指定该 Commit:

git rebase -i HEAD~3
  • git rebase:这是 Git 中用于重新应用提交历史的命令。

  • -i:这个选项表示以交互模式运行 rebase,允许你编辑提交历史。

  • HEAD~3:这是一个引用,表示当前分支的前三个提交(从最新的提交开始向前数)。你可以根据需要更改数字,以指定要重新应用的提交数量。

按下回车后,我们会进入到这么一个界面:

  1. pick e7ba81d Commit-1
  2. pick 5756e15 Commit-2
  3. pick b1b8189 Commit-3
  4. # Rebase 5d39ff2..b1b8189 onto 5d39ff2 (3 command(s))
  5. #
  6. # Commands:
  7. # p, pick = use commit
  8. # r, reword = use commit, but edit the commit message
  9. # e, edit = use commit, but stop for amending
  10. # s, squash = use commit, but meld into previous commit
  11. # f, fixup = like "squash", but discard this commit's log message
  12. # x, exec = run command (the rest of the line) using shell
  13. #
  14. # These lines can be re-ordered; they are executed from top to bottom.
  15. #
  16. # If you remove a line here THAT COMMIT WILL BE LOST.
  17. #
  18. # However, if you remove everything, the rebase will be aborted.
  19. #
  20. # Note that empty commits are commented out

前面三行是我们需要操作的三个 Commit,每行最前面的是对该 Commit 操作的 Command。关于每个 Command 具体做什么,下面的注释写得非常清楚。为了完成我们的需求,我们可以关注到这两个命令:

  1. s, squash = use commit, but meld into previous commit
  2. f, fixup = like "squash", but discard this commit's log message

为了让大家看得更明白,翻译解释为:

  • squash:使用该 Commit,但会被合并到前一个 Commit 当中
  • fixup:就像 squash 那样,但会抛弃这个 Commit 的 Commit message

看样子两个命令都可以完成我们的需求,那么让我们先试一下 squash!由于我们是想把三个 Commit 都合并在一起,并且使 Commit Message 写成 Commit-1,所以我们需要把 5756e15(Commit-2) 和 b1b8189(Commit-3) 前面的 pick 都改为 squash,于是它看起来像这样:

  1. pick e7ba81d Commit-1
  2. squash 5756e15 Commit-2
  3. squash b1b8189 Commit-3

当然,也可以缩写为:

  1. pick e7ba81d Commit-1
  2. s 5756e15 Commit-2
  3. s b1b8189 Commit-3

完成后,使用 :wq 保存并退出。这个时候,我们进入到了下一个界面:

  1. # This is a combination of 3 commits.
  2. # The first commit's message is:
  3. Commit-1
  4. # This is the 2nd commit message:
  5. Commit-2
  6. # This is the 3rd commit message:
  7. Commit-3
  8. # Please enter the commit message for your changes. Lines starting
  9. # with '#' will be ignored, and an empty message aborts the commit.
  10. #
  11. # Date: Tue Jan 5 23:27:22 2016 +0800
  12. #
  13. # rebase in progress; onto 5d39ff2
  14. # You are currently editing a commit while rebasing branch 'master' on '5d39ff2'.
  15. #
  16. # Changes to be committed:
  17. # modified: a

通过下面的注释,我们可以知道,这里其实就是一个编写 Commit Message 的界面,带 # 的行会被忽略掉,其余的行就会作为我们的新 Commit Message。为了完成我们的需求,我们修改成这样:

  1. Commit-1
  2. # Please enter the commit message for your changes. Lines starting
  3. # with '#' will be ignored, and an empty message aborts the commit.
  4. #
  5. # Date: Tue Jan 5 23:27:22 2016 +0800
  6. #
  7. # rebase in progress; onto 5d39ff2
  8. # You are currently editing a commit while rebasing branch 'master' on '5d39ff2'.
  9. #
  10. # Changes to be committed:
  11. # modified: a

使用 :wq 后,再看一下我们的 log:

  1. * 2d7b687 - (HEAD -> master) Commit-1
  2. * 5d39ff2 - Commit-0

可以看到我们的 log 已经合并成功了!

四、文末总结

本文旨在探讨多个 commit 的现象及如何将它们进行合并,以优化项目的提交历史。在前言中,我们提到了这个问题的重要性,以及为什么需要解决多个 commit 带来的混乱。接着,我们详细讨论了多个 commit 的各种情形和原因。

在第三部分,我们提供了多种方法来合并多个 commit,包括使用交互式变基 (git rebase -i)、合并提交 (git merge --squash) 和重写提交 (git commit --amend) 等。这些方法各有优点,可以根据项目需求和个人偏好来选择。

通过本文的学习,您将能够更好地管理项目的提交历史,使其更清晰、有序,便于团队协作和维护。合并多个 commit 并保持干净的提交历史是一个高效的开发实践,有助于提高代码质量和项目可维护性。希望您能从本文中获得有用的知识,将其应用到您的日常工作中。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/68053
推荐阅读
相关标签
  

闽ICP备14008679号