Git

前言

本文主要介绍Git的原理以及常用的命令。并分享一下在多人协同开发中常见的如代码冲突、修改被覆盖、暂存修改撤换分支、撤销commit、如何将漏提交的修改合并到上一个commit、分支回退到某个历史版本等等情况时,如何利用Git完美解决这些问题。

Git 是什么

Git是一个开源的分布式版本控制软件,Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
image

Git 对比 SVN

  • CVS/SVN

    集中式版本控制软件,所谓集中式就是只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

    • 因为要向中央服务器拉取/更新/推送代码,所以必须要联网,又会受网络影响
    • 严重依赖服务器端,如果服务器挂了那么版本控制也就无法使用了
  • Git

    基于分布式版本控制工具,它与集中式版本控制的区别在于每一个终端就是一个仓库,这个终端并不仅仅只是一个最新版本而是完整的将代码仓库镜像下来。

    • 直接记录快照,而非差异比较
    • 近乎所有操作都是本地执行
    • Git可以更优雅操作分支与合并,以及更强的撤销修改、恢复历史版本工作等
    • 速度更快,因为可以本地就是一个仓库
    • 误操作不会污染服务器

Git 的原理

Git分为工作区暂存区Git仓库,所有本地修改都是在操作工作区的内容 即文件的修改操作,当使用add 命令时
工作区的变动就会被添加到暂存区,使用commit命令将暂存区的内容提交到Git仓库。每次更新Git并不会记录更新的内容,而是将更新后的文件坐一个快照,并指针指向最新的快照

image

  • 工作区:就是你在电脑里能看到的目录
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的本地版本库,你的所有版本信息都会存在这里


    image
  • 暂存区:英文叫stage, 或index。一般存放在 ".git目录下" * 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)


    image

    image

Git 的开发规范

  • 在data_crm 中发现的一些问题

    • 与环境对应的保护分支可以被开发push代码,例如开发环境对应的develop分支 可以直接在上面push提交。
      • 带来的问题:容易造成在版本上线合并分支时将在develop分支上的commit漏掉。
  • 分支命名问题

    • 功能分支:feature-{功能名称/tapdId}
    • 修复紧急问题分支:hotfix-{功能名称/tapdId}
    • 已上分支都应该基于稳定分支拉取
  • 重复的commit

    image

    • 带来的问题

      1.commit多而杂,在review时显得很乱

      2.比如多个功能在同一分支开发时,其中某个功能需要提前上线,这时就不得不将糅杂在一起的commit一个个的cherry-pick出来,会显得很麻烦。
      • 使用git rebase -i HEAD~x 压缩多个commit,教程:https://blog.csdn.net/MBuger/article/details/86241033
      • 使用 git commit --amend "xx" 将当前的更改合并入上一个commit,并更改新的commit注释
      • 直接使用gitlab自带的压缩功能(好像并不能自由选择要压缩的commit)


        image

        image
      • 合并后的提交历史

        并不非常建议大家频繁是用git rebase 来合并commit,因为使用git rebase压缩comit后,必须要使用push -f 强推到远端,push -f 是一个危险的操作
        image
  • 避免Merge remote-tracking branch xx 这样无效的commit信息

    image

    image

    image

    • 造成原因

    在进行 pull 操作的同时,其实就是 fetch+merge 的一个过程。我们从 remote 分支中拉取新的更新,然后再合并到本地分支中去。
    1. 如果 remote 分支超前于本地分支,并且本地分支没有任何 commit 的,直接从 remote 进行 pull 操作,默认会采用 fast-forward 模式,这种模式下,并不会产生合并节点,也就是说不会产生多余的那条 log 信息
    2. 如果想之前那样,本地先 commit 后再去 pull,那么此时,remote 分支和本地会分支会出现分叉,这个时候使用 pull 操作拉取更新时,就会进行分支合并,产生合并节点和 log 信息。

    • 解决办法

    可以使用 git pull --rebase 使用rebase 就不会产生分支合并操作
    详细介绍

  • 如何避免代码覆盖

建议在提交代码前按顺序执行

1.git stash 或者 git add/git commit

2.git pull --rebase (使用 rebase 策略替代默认的 merge 策略)

3.git apply 如果第一步不是git stash 则跳过

4.有冲突解决冲突

5.git add/git commit/git push

  • 如何解决冲突

1.解决特性分支合并时产生的冲突时时比较容易的,在本地解决完后,在提交到远程。

2.如果是在将特性分支合并到master等受保护的分支时产生冲突,应该首先基于master分支拉去一条fix 冲突的分支,将特性分支先合并到fix 冲突分支,然后解决完冲突后在将fix 冲突分支合进master,此时特性分支和master将不在冲突。

应严厉禁止将develop/master 等不稳定分支合并进自己的特性分支,因为这样会导致特性分支在合并入release时污染release

3.在碰到冲突时,因该用=======下半段覆盖上版段,如果使用idea解决时应该用右边文件内容为最新内容

image

4.直接在Gitlab提交合并请求是更合理的做法。

  • 首先不应该直接向保护分支直接push代码
  • 其次在本地进行分支合并容易忘记更新代码而直接使用merge操作,比如:要将featrue/task-job合并到develop,在你切换到develop分支很可能本地develop远远落后于远程develop,而恰好你又忘记git pull而直接执行了git merge featrue/task-job,此时你将无法推送到远端,并且git会提醒你进行pull,然后你会发现你的本地代码会出现大量冲突等待你解决。

5.tapd关联Gitlab,使需求能和某个分支/某个commit 关联起来,更能直观的感受某个commit是为了修复那个问题,某条分支是为了完成那个功能。

TAPD项目与源码仓库进行关联

Gitlab关联TAPD

image

Gtlab关联Jira
image

Git 常用命令

基本命令

  • git clone <url> 克隆代码仓库到本地

  • git pull 拉取远程分支最新变动到本地

  • git fetch 拉取远程仓库所有分支的变动到本地

  • git push 推送本地变动到远程分支

  • git checkout <xxx.java> 取消工作空间xxx.java文件的所有变动 git checkout . 取消工作空间所有变动文件的改动

  • git checkout <dev> 切换dev分支

  • git branch <dev> 创建本地一个名为dev的分支

  • git checkout -b <dev> 创建一个名为dev的本地分支并切换到该分支

  • git branch 查看所有本地分支 git branch -a 查看所有本地分支+远程分支

  • git fetch -p 清除本地无效远程分支(远程代码仓库该分支已被删除)

  • git branch -d <dev> 删除名为dev的本地分支

  • git push --set-upstream origin <dev> 将本地dev推到远程

  • git push origin --delete <dev> 删除远程dev分支

  • git rebase 详细介绍
    分支与分叉

  • git rebase -i HEAD~<x> 可以做合并commit的操作,x代表若干个commit

  • git rebase <dev> 合并名为dev的分支到当前分支

  • git diff 查看本地改动

  • git log --graph

  • git branch --merged/git branch --no-merged 查看已合并当前的分支/未合并的分支

配置Git别名

Git 如何处理日常开发中的各种异常情况

  • 想修改已经提交到暂存区的commit信息

    git commit --amend -m"新的备注"

  • 将遗漏的修改重新提交

    git commit --amend --no-edit

  • 远程分支被删除,推自己本地分支到远端

    git push --set-upstream origin <分支名>

  • 撤销add到暂存区的文件

    git reset <文件名>/git reset HEAD <文件名>

  • 撤销改动过的文件

    git checkout ./git checkout <文件名>/git clean -df

  • 将本地分支回退到指定版本

    git reset HEAD^ 回退一个版本 修改会保留在工作空间

    git reset --hard <commit SHA> 回退到某个commit版本 丢弃所有修改

    git reset --soft <commit SHA> 回退到某个commit 修改保留在暂存空间

    git reset HEAD^ 回退一个版本

  • 将其他分支上的某个提交合并到另一条分支

    git cherry-pick <commit SHA>

  • 将本地改动暂存起来(还可以恢复)

    暂存git stash 恢复git stash apply/git stash pop

于2020-7-15 周三 深圳

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