likes
comments
collection
share

开发了半个月,才发现自己合并错了分支

作者站长头像
站长
· 阅读数 17

前言

大家好,我是 simple ,我的理想是利用科技手段来解决生活中遇到的各种问题

前因后果

今天跟大家分享我一个朋友的开发事故。

测试:你代码推了吗?怎么没有看到分支有内容更新? 朋友:怎么可能,我看看,推了啊。 测试:还是没有…… 朋友:我来看看……(片刻)不是这个分支啊……等等……怎么这功能有两个测试分支啊……

经过一番闹腾才发现,原来是有同事自己创建了一个分支用来自己测试数据、记录样式之类的,并不是给测试用的分支。但因为两者取名非常接近,所以闹出了这个乌龙。但朋友已经绝望了,这个分支上面的内容肯定不能直接合并给测试用,因为上面的很多内容都是无关正式环境的。

为了让记录更加详细,我自己特意创建了一个分支来模仿当时的情况。

开发了半个月,才发现自己合并错了分支

假设我们应该将feat/my分支的内容都提交到release分支,但由于上述原因,每次都合并到test分支去了,并且将test分支的内容也合并回了feat/my分支中。

分析

所以我们现在有两个选择:

  1. 新建立一条干净的分支,然后依次还原feat/my除合并外的所有记录。
  2. 取消test分支每次合并到feat/my分支的操作。

我们选择方式1。

可以使用git cherry-pick hash值来依次还原所有记录,该命令指定某个commit复制到当前个分支。 测试一下:

git cherry-pick 5713ae793fddb8e51e3

开发了半个月,才发现自己合并错了分支

效果已经显而易见,在feat/my分支创建的文本已经被release分支复制过去了,那我只需要依次执行该命令即可。

开发了半个月,才发现自己合并错了分支

我们是程序员,是希望尽可能用科技来解决困难的人。这种机械重复的运动怎么能让我们自己亲手做呢?于是我决定创建一个脚本,试试效果。

自动化构建

思路

  1. 首先我们先要获取所有的commit hash
  2. 将所有的commit hash一一复制到release分支

问题

  1. 由上图可知,从git log中获取到的参数包含了大量无用的参数,比如提交日期,作者,邮箱,提交日期等……
  2. git log中不仅有当前分支的commit hash,还包含了其他分支开发时的commit hash,比如我刚刚只在feat/my分支提交了4次,但是打印的时候明显把合并代码、其他分支的commit都打印了。

问题解决

问题1. 想要只获取commit hash,我们就需要对其进行精简。

git log --pretty=format:%H

开发了半个月,才发现自己合并错了分支

format:<string>"格式允许你指定你想显示的信息。它的工作原理有点像printf格式,值得注意的是,你得到的换行是'%n’而不是'\n'。

占位符扩展:%H commit hash; %h 简称提交哈希; %T tree hash; %t 简称树形哈希; %P 父类哈希值; %p 缩写的父母哈希值

问题2. 想要只打印当前分支的log,这可得好好看看官网文档了。

^: 在寻找要排除的提交(用'^')时,在看到合并提交时只跟随第一个父提交。 考虑到任意的合并都可以成为有效的主题分支变化,这可以用来查找主题分支中从它与远程分支的分歧点开始的变化集合。

--no-merges 不打印有一个以上父级的提交。

--author=author_name 将提交文件的输出限制在作者/提交人标题行符合指定模式(正则表达式)的文件。

git log --pretty=format:%H ^feat/other feat/my --no-merges

开发了半个月,才发现自己合并错了分支

了解bash

新建脚本git.sh

#!/bin/bash
log=`git log`
echo $log

开发了半个月,才发现自己合并错了分支

大功告成

我相信即使是一个初级前端,也能看懂下面的语法,我就不一一解释了。

#!/bin/bash
commits=$(git log --pretty=format:%H ^feat/other feat/my --no-merges --author=刘先森 --reverse)

# 遍历所有commit并输出
for commit in $commits
do
    git cherry-pick $commit
done

开发了半个月,才发现自己合并错了分支