Git基本指令和常用操作

概述

自从工作以来,一直在使用Git来做项目的版本管理,随着使用时间越来越长,理解也越来越深刻,所以想根据自己的工作经验写一篇Git相关的文章,介绍Git的指令、常用且快捷的操作和相关的一些概念知识。网上也有很多Git的详细教程,这篇文章准备不深入讲解指令原理,只注重实践和应用,以便提高工作效率。

Git基本指令

从0开始使用Git,准备工作就是安装Git,创建远程仓库,生成SSH公私钥,配置到远程仓库上(或者配置用户名密码)

  • 初始化本地仓库
git init
  • 添加远程仓库
git remote add origin git@github.com:AE86jag/Article.git
  • 当前分支(master)关联远程master分支
git branch --set-upstream-to origin/master
  • 添加所有修改文件到暂存区
git add .
  • 提交到版本库
git commit -m "init project"
  • 拉取远程最新代码
git pull -r
#如果有冲突,解决冲突
git add .
git rebase --continue
  • 推送到远程仓库
git push
  • 保存/恢复当前修改
git stash
git stash pop
  • 分支合并
#把V2.1.0分支代码合并到当前分支
git merge V2.1.0
#如果有冲突解决完冲突
git add .
git merge --continue
git push

Git常规操作

在控制台每输入一个指令,无论正常还是错误,git都会提示下一步或者正确的指令是什么,基本上根据提示都可以顺利操作下去。下面介绍一些常用的操作:

  • 未添加到暂存区的代码(没有执行<kbd>git add</kbd>),移到另一个分支
#假设当前分支是master,在当前分支进行保存现场
git stash
#切换到要修改的分支 V2.1.0
git checkout V2.1.0
#恢复现场
git stash pop
#如果切换回master执行git stash pop,也是会出现之前修改的代码的

适用场景:

本来应该在其他分支修改的内容,没有切换分支,直接在master上修改了,但是没有添加到暂存区,这部分修改又是不上线的,不能提交的;

  • 已经commit的代码移到另一个分支
#这个提交在原分支还是存在的
git cherry-pick 587f23ff2e20ab4c97c12aa24f5d67a5257c2c5d

适用场景:

在某些分支策略下,在分支A修复的BUG,需要同步在master分支上修复,分支A的有一部分代码是不上线的,不能用<kbd>git merge</kbd> ,这时候就可以使用该指令将部分commit复制到其他分支

  • 撤销未push的commit
#撤销上一个commit,也就是最新的commit,执行完修改是在工作区,未add的状态
git reset HEAD^
#同上,但是修改的部分也被撤销了
git reset --hard HEAD^

适用场景:

有些仓库的commit的message是有一定规则的,不符合规则不让提交,如果提交的message写错了,那么可以撤销修改,但是保留代码,重新执行<kbd>git add</kbd> <kbd>git commit</kbd> 重新提交

  • 撤销已push的commit
git revert commitId
git push

已经push的不能用 git reset HEAD^,因为这样本地已经撤销,等push的时候,会提示落后远程一个提交,只能git pull 一下,这样之前撤销的commit又回来了,可以加-f强制提交,但是有些远程仓库是禁止强制提交的

  • 撤销未add的修改
git checkout <file>
git restore <file>

适用场景:

书写了逻辑错误的代码,需要重头开始写,直接<kbd>git checkout .</kbd>清除所有未add的无用代码

  • 撤销已add但未commit的修改
#以下三个指令都可以
git reset --mixed
git restore --staged <file>
git reset HEAD <file>
  • 基于某个Tag修改代码
git branch <分支名> <标签名称>

适用场景:

提交上线投产申请时,是打一个Tag,后续使用这个Tag进行上线,部署,打完Tag后可以继续在该分支提交代码。假如某次上线后发现一个严重Bug,需要紧急修复,为了不引入新的代码产生风险,那么需要在上次上线的Tag基础上拉一个分支进行Bug修复,测试覆盖完后重新打一个Tag进行紧急上线。

Git其他操作

  • 分支策略

只要不混乱,适合团队就可以。比如我所在的团队就是主分支提交,主分支发布。多项目并行,上线时间不确定,则拉分支开发,根据实际情况进行分支合并。

  • Pull Request

除了修改开源项目时,自己项目开发时,也可以采用PR的方式,每个人提交的代码都由技术经理进行审核,审核通过以后合并到项目中,这样可以代替代码检视,比较适合逻辑相对不复杂的项目。我所在的项目,前端就是采用PR的方式。后端因为逻辑比较复杂,还是直接提交,定期代码检视。

  • Git的自动化

Git自动化可以使用Shell脚本,如果想在Java代码中使用Git,有一个类库叫JGit,可以引入依赖在Java代码中使用,其中的API和Git指令都是一一对应的。应用场景有很多,比如使用Jenkins自动化部署的时候,编写一个Shell脚本,使用Git指令从远程仓库拉取代码后进行构建部署,不用手动打包,上传、部署。JGit也有很多地方用到,比如自定义Gradle插件,修改了文件,使用JGit提交到当前项目中,

  • Git的钩子

Git的钩子可以分本地的钩子和远程的钩子。

本地的钩子被存在Git目录下的hooks子目录中,有很多类型,比如提交之前,提交之后等等,可以在提交之前做一些限制,比如限制代码风格、限制commit的message格式,等等,只要你想在做的校验,自己编写脚本放在hooks目录下即可。

远程的钩子,在代码托管网站上可以设置,也有很多类型,比如Push、打Tag、Pull Request等,需要选择类型,然后输入一个URL,等事件触发以后,Git会向这个URL发送一个POST请求。比如可以设置一个Push钩子,URL写一个Jenkins的任务构建的API(http://用户名:密码@IP:端口/job/项目名/build)。这样,每次提交代码的时候就会触发构建,构建任务有自动化脚本,进行部署。

  • Git子模块

Git可以将一个仓库作为另一个仓库的子目录,可以多个仓库共享某个公共的仓库,但是又保持独立的提交。比如微服务架构下,每个服务都有接口测试的Json文件,跨服务调用时,也是使用Json文件进行Mock服务间请求,这样,每个服务都依赖这些Json文件,所以把这些Json文件作为一个仓库,并作为其他微服务的子模块,就实现了复用,而且独立提交。

执行指令 <kbd>git submodule add 仓库地址</kbd> 当前项目就会多一个.gitmodules文件,和子模块的目录

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容