开发中常用GIT命令详解(结合开发场景)--新手入门

       大家好,如今git在代码管理中已经逐渐占据主流,但据观察大多数人喜欢借助可视化工具来使用git,很少有人会去花太多心思去研究git了解git命令。甚至一些中小项目依然使用单分支开发。本文结合我使用git的一些经验,着重从项目开发的各个阶段来介绍git命令,希望能对初学者有所帮助。

       首先,极力推荐大家使用命令行方式来使用git,对此我总结的好处如下:

  1. 对git的操作更直接,更可靠,不容易出现错误。
  2. 操作感好,在shell自动补全功能和命令别名的帮助下,比图形化插件操作更快。
  3. 更容易加深对git版本控制及分支策略的理解。

终端的选择

       如果是你用的是windows系统,电脑上也安装了git那么在程序列表里一定有git bash,实在找不到就重装一下git (git bash不仅可以用来输入git命令,也是windows中很好用的终端,至少要比cmd好用很多)。

        如果你用的是mac系统那系统自带的终端就可以用,不过我个人推荐 item2+oh my zsh。

Git命令别名配置

      为了提高效率,一般会给常用命令设置别名,以下是我的配置,大家可以按自己喜好配置,添加到你的git配置文件中,windows系统可能在git/config文件夹下(或在用户跟目录下,这个我不太确定),mac在用户根目录.gitconfig文件中。

[alias]
    co = checkout
    c = commit
    a = add --a
    s = status
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --all 
    lgb = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

提醒:下文中这些命令我会用别名代替。

正文

开发前

如果需要通过ssh连接gitlab 需设置ssh key,这里就不做过多讲解

首先开始一个项目的开发我们需要cd到你的workspace然后将远端代码clone到本地,大家应该都比较熟悉吧

命令:git clone 项目url(gitlab上的位置如下图)

开发中常用GIT命令详解(结合开发场景)--新手入门

 clone到本地后本地只有一个master分支

   开发中常用GIT命令详解(结合开发场景)--新手入门

       一般master分支是和正式环境版本保持一致的,所以除非紧急修复线上bug需要以master为基点切分支(即hotfix)外,我们一般不会以master为基点切分支进行开发。

那么我们就要将远端的develep(开发)分支拉取到本地。

命令: git branch develop origin/develop

(命令解析 git branch 分支名 远端分支名  此命令的意思为以远端分支为基点创建本地分,并命名为develop,一般远端分支名和本地分支名保持一致)。

       拉取到develep分支后,出于协同开发考虑我们不能直接在develop上进行开发,因为如果大家都在develop分支上开发不同的功能,那么版本就很难控制了,所以我们要从develop上再切一个feature分支(此分支名自取,一般公司会有规范,避免和其它人分支重名)进行开发(参考附件—分支策略图)。

此时输入 git branch (查看本地分支命令) ,如下图

开发中常用GIT命令详解(结合开发场景)--新手入门

代表你正处在master 分支上

输入 git co develop   (co 为checkout 别名 为切换分支命令) 切换到develop

命令:git branch myFeature  从当前位置创建分支

此时输入 git branch,会看到全部本地分支如下图

开发中常用GIT命令详解(结合开发场景)--新手入门

下面我们就可以切到myFeature分支上进行开发了

命令: git co myFeature

至此,我们就可以打开进行开发了。

——————————————————————————————————————————————————————-

开发中

下面我来分享一下开发过程中可能会用到的一些git命令

git s   即(git status) 这个命令可以看到所有修改但未commit的文件,这个比较直观,其中红色代表未add的文件,绿色代表已经add的文件,如下图

开发中常用GIT命令详解(结合开发场景)--新手入门

git a (git add --a) 将修改的代码全部添加到暂存区(所有红色变绿色)

也可以用 git add 文件名 逐个add,但一般为了节省时间不会这样做

git reset 文件名 作用与 git add相反

注意:commit代码之前必须要先add到暂存区,不然该文件是commit不上去的,一些插件是将两个过程变成连续的所以大家可能没感觉到

git co 文件名 这个命令是将未add的文件恢复到修改前的状态,操作不可逆,所以要谨慎使用

git c 即 (git commit)提交暂存区的代码到git,一般在开发的功能完成一个阶段后进行。此时会需要输入相应的阶段描述,这段描述会显示在分支图形上,方便后续回忆此次提交的内容(进入文本编辑后和vi vim命令操作一样,按i 进入insert 模式,编辑完成后 按ESC  输入:x 保存退出,输入:q! 取消commit )

git lg  打印一下分支图形,确认本次提交

—————————————————————————————————————————————————————————

开发后(下面的内容可能根据团队的分支策略不同而有所出入,大家可以着重理解命令)

开发完成后,下一步就是将代码交给测试人员进行测试

此时应该将develop上的代码同步到你的MyFeature分支,因为在你开发的过程中可能develop的代码已经迭代了几个版本,此时将你的MyFeature代码全部commit后,做如下操作

命令:git co develop 切换到develop分支

命令:git pull git fetch + git merge 其实 pull=fetch+merge,这两种本质上没有什么区别,但后者会更加安全,因为fetch后可以查看一下图形,再考虑要不要merge。此时本地develop已经是最新版本了,接下来

命令:git co myFeature 切换到你的开发分支

命令:git merge --no-ff develop git rebase develop 将develop代码合并到你的开发分支,此处建议使用后者,这会使我们的分支图形看起来更整洁,因为测试结束后,我们需要将myFeature merge到develop,至于merge和rebase的区别可以从字面意思理解,如果还是理解不了就去查一下资料,此处就不做赘述了。

接下来就可以将你的myFeature分支提交到远端供测试人员通过jekins等将分支发布到测试环境进行测试了。

命令:git push origin myFeature 将当前分支提交到远端。

如果测试人员测出了BUG,需在myFeature分支修复后,重复上述操作即可。

—————————————————————————————————————————————————————————

测试通过后

测试通过后如果要发布上线,需将myFeature 合并 到develop

注意:合并到develop的功能一定是测试通过并且需要立即发布的

如果你没有merge到develop的权限,请将分支push到远端后,到gitlab向指定人员提交merge request,具体操作会在下面会讲解

如果你有权限,过程如下:

1.git co develop 切换到develop

2.git pull git fetch + git merge  拉取最新的develop到本地

3.git merge --no-ff myfeature   myFeature合到develop

4.git push origin develop 将合并后的develop提交到远端

从此处到该功能上线,还需将代码从develop 合并到 release(预发布版本,如果没有预发布服务器此步可省略),再从release合并到master,操作与上一步相同(详见附件分支策略图)

一般功能发布上线稳定后,为了避免长时间累积的分支数过多,会将你的myFeature分支删除,命令 git branch –d myFeature 远端分支请到gitLab上删除

—————————————————————————————————————————————————————————

线上发现紧急bug

操作如下

git a+git c +输入功能描述  将你当前开发分支上的代码commit

git co master  切换到master 分支

git pull git fetch+git merge 拉取最新的master代码即线上代码

git branch hotfix 从当前位置创建hotfix分支

git co hotfix 切换到hotfix 分支

修改bug后 git a+git c +bug描述

1.如果你没有master和develop的merge权限

输入命令git push orgin hotfix 将hotfix提交到远端,在gitlab上向指定人员提交merge request合并到master和develop

2. 如果你有master和develop的merge权限

git co master切换到master 分支

git merge --no-ff hotfix 合并hotFix

git push origin master 将合并后的master push到远端

git co develop切换到develop分支

git merge --no-ff hotfix合并hotFix

git push origin develop将合并后的develop push到远端

git co myFeature 切回你的分支继续开发

————————————————————————————————————————————————————————

git图形

开发中常用GIT命令详解(结合开发场景)--新手入门

git log+若干参数,即可打印出如图这样的漂亮git图形,我的别名为 git  lg

当然,类似的图形在很多地方都可以看到,其中不同颜色的线代表不同的分支,每个节点都有唯一的节点号,每次commit 或merge都会产生一个节点

使用 git co 节点号 可以切换到任何一个节点的版本,HEAD标示出你当前所处的节点

—————————————————————————————————————————————————————————

关于冲突

任何一次merge 或rebase都有可能产生冲突,冲突表示git无法自动merge的代码,必须根据实际情况手动merge。规范的操作可以减少很多不必要的冲突,但协同开发产生的冲突是避免不了的,我们只要修复的时候细心一点即可

merge命令后冲突的文件是不会自动加入暂存区的,所以我们输入 git s 有冲突的文件全部为红色,其它变更文件为绿色

冲突的格式如下

==========>

版本A

============

版本B

============>

根据实际场景不同,修复的方式也不同,但都是有规律的,时间久了就会熟练的,我总结了以下三种情况供大家参考

  1. 版本A 版本B是完全不想干的两段代码:

此时操作最简单,只需把冲突标识去掉即可

  1. 版本A上方代码或版本B下方代码为AB两段代码共用,并且AB两段代码都需要保留:

此时冲突比较复杂,修复时一定要细心,将公共代码复制一份将AB两段分别补全后,去除冲突标识

  1. 版本A 版本B一个是旧版本,一个是新版本,AB只需保留最新版本:

 此时请再三确认后,保留最新的版本即可

将冲突修复完后,操作如下

git a

git c 此时git会有默认的描述: "merge A to B" 一般不用修改,直接保存即可

————————————————————————————————————————————————————————

其它补充(此部分内容针对特殊场景,了解即可)

  1. 分支回滚

一些意外情况下,我们会需要把已经push到远端的代码进行回滚,操作如下

git co 需要回滚的分支

git pull 或 git fetch+git merge 拉区最新代码

git branch 备份分支名 因为回滚是不可逆的,防止意外我们先切一个分支备份

git reset --hard 回滚位置的节点号   回滚本地分支

以上命令如果省略 --hard 参数,作用相同,但会保留回滚前的版本,该部分修改全布为未add状态

git push –f origin 分支名  覆盖远端分支(如果gitLab上该分支为protected状态,会报错)

注意:执行最后两条命令前请再三确认备份,因为此过程不可逆

2.开发过程中会出现这样的情况,刚刚commit甚至push完代码,突然发现有个地方需要微调,但是重新commit又要生成新的节点和描述。此时我们可以用如下命令

git a

git c --amend  此命令是将本次commit合并到上次commit

如果此时已经将上次commit push 到远端了

执行 git push orgin branchName 会报错

此时应该用 git push orgin branchName –force (如果gitLab上该分支为protected状态,会报错)

  1. .gitignore配置

在每个git项目的根目录都可以添加.gitignore文件,用来忽略某些文件的更新状态,文件中以行为单位进行配置,通配符用*号表示,参考下图

开发中常用GIT命令详解(结合开发场景)--新手入门

  1. git diff 文件名

此命令用来比较未add到暂存区的文件更新前和更新后的版本,主要用于查看自己对文件做了哪些修改,参考下图,-代表删除的内容,+代表增加的内容

开发中常用GIT命令详解(结合开发场景)--新手入门