git合并多个提交

[时间:2016-11] [状态:Open]

[关键词:git,git rebase,合并提交,commit]

0. 引言

本文是关于Git提交记录修改的方法,主要是将多个提交记录合并为一个,然后提交。这里使用到git rebase(一般译为衍和),多数情况下推荐在未提交到远程仓库之前修改本地git提交记录格式时使用。

我遇到这个问题主要是因为实际提交中需要在多个分支之间切换,不希望在另一个分支上看到当前分支的多次提交,只希望将多次提交压合成一个提交,然后在另一个分支上直接git cherry-pick即可。

1. 合并多个提交

为了美化commit history不择手段

首先,为了模拟实际git rebase效果,我们先在git上提交两个修改。git log如下:

commit e1a7dfa9dfea8e63ad079dba37c61d8e80ffbe1b
Author: Tocy
Date: Mon Nov 28 14:01:45 2016 +0800 add text in second.txt commit c6e45575484666245bb22d2d5d534bfee91f44c6
Author: Tocy
Date: Mon Nov 28 13:59:43 2016 +0800 create second.txt

假设合并这两个提交,可以按照下面过程

git rebase -i HEAD~2

可以先用man查看下git rebase的命令参数,这样会有如下提示:

pick c6e4557 create second.txt
pick e1a7dfa add text in second.txt # Rebase a71eba2..e1a7dfa onto a71eba2
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

第一列是rebase具体执行的操作,其中操作可以选择,其中含义如下:

  • 选择pick操作,git会应用这个补丁,以同样的提交信息(commit message)保存提交
  • 选择reword操作,git会应用这个补丁,但需要重新编辑提交信息
  • 选择edit操作,git会应用这个补丁,但会因为amending而终止
  • 选择squash操作,git会应用这个补丁,但会与之前的提交合并
  • 选择fixup操作,git会应用这个补丁,但会丢掉提交日志
  • 选择exec操作,git会在shell中运行这个命令

对比之前的两个提交提交,我觉得第一个提交可以保留,第二个合并到第一个就可以了。

将第二个pick改成squash或者s,然后保存退出。如下:

pick c6e4557 create second.txt
s e1a7dfa add text in second.txt

此时git会自动将第二个提交合并到第一个提交,并弹出合并提示信息,如下:

# This is a combination of 2 commits.
# The first commit's message is: create second.txt # This is the 2nd commit message: add text in second.txt # 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交
# 说明将会终止提交。
#
# 日期: Mon Nov 28 13:59:43 2016 +0800
#
# 变基操作正在进行中;至 a71eba2
# 您在执行将分支 'master' 变基到 'a71eba2' 的操作时编辑提交。
#
# 要提交的变更:
# 新文件: second.txt
#

如果需要修改下提交信息,如果不需要直接保存退出即可。

此时我们已经完成了将两个提交合并为一个的处理,可以通过git log查看

commit 251d222ac45f3596943480bd5a7cc695b5d7d6e9
Author: Tocy
Date: Mon Nov 28 13:59:43 2016 +0800 create second.txt add text in second.txt

总结

注意本文仅仅介绍了我遇到的多个提交合并的问题,关于git rebase用法,建议参考Git Community Book 中文版-rebase和参考资料中的介绍。

多数情况下git rebase仅限在本地使用,也就是在提交到远程分支之前。

参考资料

  1. 使用git合并多个提交
  2. git rebase简介(高级篇)
  3. git-rebase用法总结
  4. git-rebase(认真看,分析很到位)

git合并多个提交的更多相关文章

  1. git合并某次提交到某个分支

    有的时候,在develop分支开发,是大家公用的开发分支,但是只想合并自己提交的到master,如何操作呢?那就要用cherry-pick了. 语法 git  cherry-pick commitid ...

  2. git合并历史提交

    背景 以前一直觉得只要pull和push就够了,但合作中总会遇到各种非理想的情况.这时候才发现git其他命令的作用. 现在的情况是,repo是一个远程team维护的,我们需要增加新feature,那么 ...

  3. Git 分支合并:合并某次提交

    有时只想合并其它分支到某次提交,而不是所有提交. 一 切换到当前分支 首先,在做一次可能有冲突的合并前尽可能保证工作目录是干净的. 如果你有正在做的工作,要么提交到一个临时分支要么储藏它. 这使你可以 ...

  4. git把dev部分提交过的内容合并到master

    git 把dev部分提交过的内容合并到master $ git reflog a6de5cc HEAD@{}: checkout: moving from wf_dev to master 303aa ...

  5. Git创建子分支,合并分支并提交到Gitee码云

    Git合并分支后,需要将子分支提交到git仓库,这个时候就需要单独提交子分支,其步骤如下: 先创建子分支,并包含最新当前分支下的修改数据 git checkout -b sonBranch 将新分支内 ...

  6. git创建分支并提交项目

    git 创建分支, 切换分支, 合并分支, 删除分支及提交[commit提交到本地仓库push名利提交到远程服务器], 检出[pull], 冲突修改, 本地仓库同步远程服务器[pul和push命令l] ...

  7. 如何使用sourcetree 或 IDEA 自带的git合并代码?

    如何将本地的wyy分支合并并推送到远端的 develop分支? 规则:最好是本地的分支wyy推送到对应的远端origin/wyy ,不建议直接推送到远端不同的分支!!所以 基本思路如下: 1.本地的w ...

  8. git rebase 合并多次提交.

    一.应用场景 为什么需要合并多个提交呢? 常常一个功能的开发,修修补补 commit 了 n 多次,带来的结果就是提交过多过杂,不够直观,究竟哪些提交是对应这个功能的呢?还有就是,如果我要将这个功能迁 ...

  9. git合并常见冲突

    如果一个文件在服务器上已经做了修改,然后在本地开发中又做了一些修改的时候,再发布这个文件时很容易造成代码冲突,错误如下, error: Your local changes to the follow ...

随机推荐

  1. 求链表的倒数第m个元素

    法一: 首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第m个,转换为正数第n-m+1个,接下去遍历一次就可以得到结果. 不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二 ...

  2. 《Gradle权威指南》--Gradle构建脚本基础

    No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ...

  3. VsCode下代码导航

    Visual Studio Code具有高效的代码编辑器,当与编程语言服务结合使用时,可以为您提供IDE的强大功能和文本编辑器的速度.在本主题中,我们将首先描述VS Code的语言智能功能(建议,参数 ...

  4. python中使用XPath笔记

    XPath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线. XPath介绍: ...

  5. scikit-learn全局图

    https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

  6. MySQL中查询获取每个班级成绩前三名的学生信息

    CREATE TABLE t_testscore( pk_id INT PRIMARY KEY, c_name VARCHAR(50) , c_score INT, c_class INT )DEFA ...

  7. php快速无限遍历递归文件夹目录、子文件,支持绝对路径和相对路径,支持返回生成数组

    支持无限极遍历子文件及文件夹,支持绝对路径和相对路径! 函数说明:array glob ( string $pattern [, int $flags ] )功能:寻找与模式匹配的文件路径,返回包含匹 ...

  8. [BZOJ3451][Tyvj1953]Normal(点分治+FFT)

    https://www.cnblogs.com/GXZlegend/p/8611948.html #include<cmath> #include<cstdio> #inclu ...

  9. BZOJ.1190.[HNOI2007]梦幻岛宝珠(分层背包DP)

    题目链接 把重量表示为\(a\times2^b\)的形式,然后按\(b\)排序. 从高到低枚举每一位,\(f[i]\)表示当前位容量为\(i\)时的最大价值(容量即\(a\times2^{bit}\) ...

  10. BZOJ2264 : Free Goodies

    如果Jan先手,那么可以放入一个对Petra来说价值$inf$的物品,就变成了Petra先手. 对于Petra来说,拿物品的顺序是固定的,按这个顺序排序. 那么如果把Petra的选择看成$($,Jan ...