Git自动化合并多个Commit

目录

  • git rebase逻辑
  • git editor的修改
  • 处理git-rebase-todo文件
  • Python实现

当我们有多个commit或者从开源处拿到多个commit时,想合成一个commit,并保留每个commit的message时,大家都知道用"git rebase -i"可以解决,但这种方式需要手动进行操作,假如我们要处理的比较多,就想要自动化来处理,下面介绍下怎么自动化处理。

git rebase逻辑

当我们"git rebase -i"后,git在当前.git/rebase-merge目录下生成git-rebase-todo文件,然后调用git editor来让用户编辑git-rebase-todo文件进行处理,如果实现自动化就需要:

  1. 修改git editor来使用我们提供的;
  2. 脚本来处理进行git-rebase-todo文件的处理。

git editor的修改

git提供config命令来查看配置和修改配置,同样editor也可以这样进行设置。

    git config core.editor #查看当前使用editor
    git config --local --replace-all  core.editor NEW_EDITOR # 修改当前的仓库的editor为NEW_EDITOR

处理git-rebase-todo文件

pick 62e0071 first commit
pick 3bd641a second commit
pick 92c03c7 third commit

# 变基 7073047..92c03c7 到 7073047(3 个提交)
#
# 命令:
# p, pick <提交> = 使用提交
# r, reword <提交> = 使用提交,但修改提交说明
# e, edit <提交> = 使用提交,进入 shell 以便进行提交修补
# s, squash <提交> = 使用提交,但融合到前一个提交
# f, fixup <提交> = 类似于 "squash",但丢弃提交说明日志
# x, exec <命令> = 使用 shell 运行命令(此行剩余部分)
# b, break = 在此处停止(使用 'git rebase --continue' 继续变基)
# d, drop <提交> = 删除提交
# l, label <label> = 为当前 HEAD 打上标记
# t, reset <label> = 重置 HEAD 到该标记
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       创建一个合并提交,并使用原始的合并提交说明(如果没有指定
# .       原始提交,使用注释部分的 oneline 作为提交说明)。使用
# .       -c <提交> 可以编辑提交说明。
#
# 可以对这些行重新排序,将从上至下执行。
#
# 如果您在这里删除一行,对应的提交将会丢失。
#
# 然而,如果您删除全部内容,变基操作将会终止。
#
# 注意空提交已被注释掉

上面是有3个commit,需要将后面2个commit合并到第1个,通过后面的注释可以看到,squash是将commit合并到前一个commit上,所以需要将后2个的pick修改为squash,即修改为下面这样:

pick 62e0071 first commit
squash 3bd641a second commit
squash 92c03c7 third commit

Python实现

使用python实现上述逻辑

#!/usr/bin/env python3
#encoding: UTF-8

import os
import sys

def change_editor(current_file):
    os.system("git config --local --replace-all  core.editor " + current_file) # 将当前脚本设置为editor
    os.system("git rebase -i") # 执行rebase,触发调用该脚本进行rebase
    os.system("git config --local --replace-all core.editor vim") # 执行完后将editor设置回vim

def rebase_commits(todo_file):
    with open(todo_file, "r+") as f:
        contents = f.read() # 读取git-rebase-todo文件内容
        contents = contents.split("\n")
        first_commit = True
        f.truncate()
        f.seek(0)
        for content in contents:
            if content.startswith("pick"):
                if first_commit:
                    first_commit = False
                else:
                    content = content.replace("pick", "squash") # 将除了第一个pick修改为squash
            f.write(content + "\n")

def main(args):
    if len(args) == 2:  # 如果将该脚本作为editor,git会调用该脚本,并以git-rebase-todo文件作为第2个参数
        rebase_commits(args[1])
    else:
        change_editor(os.path.abspath(args[0])) # 设置git editor

if __name__ == "__main__":
    main(sys.argv)

URL: https://liwugang.github.io/2019/04/28/git_commits/

原文地址:https://www.cnblogs.com/liwugang/p/10792446.html

时间: 2024-11-09 06:19:04

Git自动化合并多个Commit的相关文章

巧用 git rebase 合并多个 commit。

一.为什么需要合并多个 commit 呢? 有时候,我们开发一个功能. 修修补补 commit 了很多次,过多的 commit 会显得很复杂. 不够直观,不能比较清晰查看那些 commit 是对应的那个功能. 所以,在这种情况下.我们需要整理一下 commit 的记录,让我们更好的管理提交记录. 二.具体合并多个 commit 的流程. 1.development 分支有四次 commit ,然后我准备合并 "add a.php" 和 "add b.php" 的两次

git 使用 | 合并多个commit

我的需求: 在提交PR的时候,想把多个commit合并成一个commit. 解决: 首先在github中(或本地git log)查找到要合并的所有commit之前的commit的版本号: 例如: 如需合并红色commit及其之后的commit,需要获取的是蓝色的commit. 然后: git reset --soft 4972686f45acebe2d811810021a81822f7e39132 一定要加--soft哦 然后再进行commit: git commit -m "add one f

git cherry-pick合并某个commit

git cherry-pick合并某个commit 1.使用方法及其作用 git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit).例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了. 就是对已经存在的commit 进行 再次提交: 使用方法如下: git cherry-

git分支合并、撤销;git修改已push的commit信息; git 撤销操作;

git分支合并 1.分支代码提交 2.git branch 查询本地分支 3.git checkout 分支名1 切换分支到需要合并的分支上 4.git merge 分支名2  //选择要合并到 分支名1 的分支名2 eg: 如果develop_screen分支合并到develop分支上,这个时候切换到develop分支上, git merge develop_screen 5.合并之后可能会有冲突,可用git status 查看冲突代码 <<<<<<<  ===

Git分支合并选择

用Git进行多人协作开发时,必然会合并代码,解决冲突.然而合并代码也是需要点技巧的,如果对一些关键命令没有理解去使用的话,git的版本演进路线就会变得很乱,从而造成了日后维护的一些麻烦. Git上合并代码有git merge 以及 git rebase 两种方式.下面将深入两者的用法以及对两者的适用场景作个总结. 前置知识点 Master分支:首先,代码库应该有一个.且仅有一个主分支.所有提供给用户使用的正式版本,都在这个主分支上发布.这个分支被称为Master分支: Develop分支:主分支

git代码合并:Merge、Rebase的选择

代码合并:Merge.Rebase的选择 Zhongyi Tong edited this page on Dec 7, 2015 · 3 revisions Pages 19 Home 2.1 快速指南 2.2 创建代码仓库 2.3 保存你的更改 2.4 检查仓库状态 2.5 检出之前的提交 2.6 回滚错误的修改 2.7 重写项目历史 3.2 保持同步 3.3 创建Pull Request 3.4 使用分支 3.5 常见工作流比较 4.1 图解Git命令 5.1 代码合并:Merge.Reb

git 分之合并和冲突解决

Git 分支管理和冲突解决 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称. 当前检出分支的前面会有星号. git branch newname 在当前检出分支上新建分支,名叫newname. git checkout newname 检出分支,即切换到名叫newname的分支. git checkout –b newname master 这个命令将上面两个命令合并:在master分支上创建分支newname分支并检出到该分支. 合并分支间的修改 Merge 合并

git 分支合并 强制合并

常用的提交流程git add *.XXXgit commit -m "备注....." # 提交到本地分支git fetch git merge #"合并远程分支情况,如果有冲突解决冲突,并再commit 一次"git push orgin/master #"最后在进行提交合并" ====================================================================================

Git 分支合并冲突及合并分类

分支合并冲突 ##创建分支datagrand git checkout -b datagrand Switched to a new branch 'datagrand' git branch -a master \* datagrand ##在datagrand分支上创建文件 echo "this is git file!" > read.txt git add read.txt git commit -m "add a new file" git push