Git知识梳理及基础操作

概念相关

Git概念

  • Git 是目前业界最流行的分布式版本控制系统(Version Control System),本质上来说Git是个软件
    • 分布式
      • 客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复
    • 版本控制
      • 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统

Git概念的理解

这里用大学生写论文这个事做比对,加深理解

  1. 你准备写论文,先立题,然后开始收集资料,最后开始动笔。这个过程就可以看作使用git软件在本地创建仓库(或者是从github/gitlab上拉代码下来),准备完成项目的初始版本
  2. 论文初稿写好了,要仔细检查一遍,然后提交给老师。这个过程可以理解为使用git将写好的项目发送到github/gitlab,准备接下来的测试,需求对接,以及找bug
  3. 然后在接下来的2个月内,老师来来回回的给你提出了10多个甚至更多的问题,你就来来回回的改。这个过程就可以理解为每当你发现了代码有问题,就使用git用你的修改后的代码更新github/gitlab上的代码,每次更新负责检查你的代码的人都看得到,并且还会提过新的问题
  4. 老师说OK了,可以提交论文,算你过了。这个过程就可以理解为你的本地代码经过了无数的更改后,终于稳定了,可以拿给客户用了,更新最终版本到github/gitlab上,部署上线···

GitHub

  • GitHub 本质上是一个代码托管平台,它提供的是基于 Git 的代码托管服务。
  • 对于一个团队来说,即使不使用 GitHub,他们也可以通过自己搭建和管理 Git 服务器来进行代码库的管理

Git三大区域

  • 工作区
    • 就是你写代码的地方,代码在哪个文件夹下
  • 暂存区
    • 暂存区是用来存放你使用git软件跟踪文件具体变化的区域。要注意的是,工作区的代码在没有使用git软件管理前,和版本库没有任何关系
  • 版本库
    • 是指代码托管平台,存储你上传的每次更改结果,当然也可以拉取远程代码到本地

分支

  • 一般每个代码都有master分支,master分支包含了上线版本的完整代码。
  • 在开发测试阶段,有可能master分支代码有问题,那么就可以基于master代码做出代码更改,但是代码更改又不是全部更改,可能指更改几行,或者添加新的文件等等,那么此时就要创建新的分支(粗俗的理解为复制master代码一份,(但是真实情况,是用指针指向实现的,不是复制),指针同时指向新创建的分支以及master,此时还没有做任何更改),然后更改新分支内容的文件,修改好没有问题,就可以提交新分支到代码托管平台,此时远端就可以看得到新的一个分支的产生,再决定是否需要合并到master分支

Git准备

安装Git

# Ubuntu上安装
sudo apt install git-all

# mac会提示你进行安装
git --version 

设置Git的user信息

三个不同的作用域,默认为local

  • git config --local user.name

    • 如果在本地环境中需要管理多个git用户,一般在某个你需要管理的本地git仓库内设置(局部仓库生效)
  • git config --global user.email

    • 一般来讲第一次设置或者是只有一个账户需要管理的话,设置全局用户信息即可,完整命令如下
    • git config --global user.email your_email@domain.com
    • git config --global user.name your_name
  • git config --system

    • 针对系统所有登录的用户都有效,用的不多
  1. 显示git 本机的配置

  • git config --list --local

  • git config --list --global

  • git config --list --system

配置优先级

local > global

  • 如果全局配置已经配置好,那么在当前仓库下可以重新设置本地的user.name和user.email,那么之后的提交(commit)都以本地的user.name 和user.email为准

基本命令

初始化仓库

创建本地版本库

  1. 创建一个准备放完整项目的文件夹(mkdir your_project_name)

  2. cd 到新创建的文件夹 (cd your_project_name)

  3. 在文件夹里面初始化仓库 (git init)

  4. 将本地所有内容(包括不同分支)推送到远程仓库

    git remote add origin https://github.com/user/repo.git
    git push --all
    

克隆远端版本库

  1. 从远程拉取master代码,建立本地库和远端的连接(git clone gitlab/github仓库地址)
    • https方式
    • ssh方式
      • 需要配置密钥
  2. cd your_project_name
    • 可以进行新建分支,更改代码等操作了

管理分支

理解

举例来说,从远端第一次clone代码下来,默认是master分支,那么在本地就会生成远端master的镜像,此时本地分支的名称也是master,一般来讲不推荐在本地的master分支上做协同开发,而是要基于master创建一个新的分支,在此分支上进行相应的开发工作

查看分支

  • git branch -a
    • 查看所有分支
  • git branch -v
    • 查看本地分支
  • git branch -r
    • 查看所有远程分支
  • git branch -vv
    • 查看本地分支和远程分支的关系以及版本情况

创建本地新分支(基于当前所在分支)

以下这几个命令都可以达成目的

  • git checkout -b branch_name
    • 创建分支branch_name,并切换到branch_name分支
  • git switch -c branch_name
    • 创建分支branch_name,并切换到branch_name分支
  • git branch branch_name
    • 创建分支
  • git checkout branch_name
    • 切换分支

拉取最新代码

一般在改动前,都要先更新下最新代码(将远端代码拉下来,避免别人修改过和你的版本有冲突)

  • git pull
    • 一般不指定的情况下,将当前工作区的分支名称的最新版本代码拉取下来
  • git pull origin branch_name
    • 拉取远端指定分支代码,更新本地
  • git checkout -b new_branch origin/new_branch
    • 基于远端分支创建本地分支并切换到本地分支
  • git fetch + git merge
    • 基于远端同一个分支做更改,可能会产生冲突,先fetch看下和本地当前分支有哪些不同,没有问题就将远程修改合并到我当前的本地分支
    • 对于不同人对不同文件在远端内容的修改,git会自动检测合并,不会发生冲突

修改工作区内容并提交

工作区的内容变更需要先提交到暂存区,然后确认无误后可以确认并推送到远端进行版本的更新,如果有问题,也可以撤销修改等

  • git add 你修改的文件/新添加的文件
    • add的作用就是将工作区(你修改的内容)内容的变动提交到暂存区,后面可以提交,也可以撤销,如果是新文件,则是将此文件开始纳入被git跟踪版本的范围
    • -u
      • 参数,如果一次修改了多个文件,不需要带文件名,可以将已经被git管理的文件一次性添加到暂存区
  • git commit -m "你本次提交对于版本内容变更的描述,越详细越好"
    • 将暂存区的变动确认,生成新的版本号信息,本地新版本生成,之后就可以推送到远端了
  • git commit -am "你本次提交对于版本内容变更的描述,越详细越好"
    • 这是上面add + commit命令的合并,这一条命令即可生成一个新的版本号,之后可以推送到远端版本库

推送分支到远端仓库

本地版本生成后(有了commit ID之后),虽然你本地的代码已经更新了,但是远端并不知道,别人也就看不到,这时候可以选择推送到远端进行合并操作,推送过去别人就能看到你的代码更新内容了

  • git push
    • 推送当前分支版本内容到远程分支(远程如果有此分支,则是更新操作,如果没有此分支,则会创建一个新的分支,名称和你本地的当前分支名称一样
    • git branch --set-upstream-to origin/分支名
      • 如果当前分支和云端分支没有关系的情况下(一般来讲第一次,会有提示),那么这样可以建立关系
    • git branch --unset-upstream
      • 删除本地当前分支和远程分支的映射关系

合并其他分支代码到master分支

一般来讲,其他分支的修改都是会最终合并到一个分支上的(这里以master为例)

  • git merge branch_name
    • 将branch_name的分支合并到当前所在分支

删除分支

删除分支要注意的是,不能在当前分支删除当前分支,至少先要切换到别的分支

  • git checkout -d branch_name
    • 在本地修改完了分支内容之后,可对分支进行删除操作
  • git branch -D branch_name
    • 强制删除一个还没有合并的分支
  • git push origin --delete <branch_name>
    • 删除远程分支,按照分支名称删除
  • git push origin --delete tag <tag_name>
    • 删除远程分支(按照标签)

工作区/暂存区撤销

  • git reset HEAD -- filename

    • HEAD表示拉取最新代码下来没有做改动的版本(最新版本)
    • 暂存区内容都不要了,恢复到和HEAD版本一样
  • git reset HEAD

    • 将暂存区所有改动清空,返回当前指向的HEAD版本内容
  • git checkout -- filename

    • 将工作区内容和暂存区内容同步(j举例来说,暂存区已经保存了一次修改(add),然后工作区对相同的代码做更改,但是觉得还没有保存在暂存区的内容好,那么就可能要将工作区的内容恢复到和暂存区一致)

版本回退

想要回退版本,一般都是本地先回退版本到某个分支,然后再推到远程,再合并

  • git reset --hard HEAD^
    • 将当前分支回退一个版本
  • git reset --hard HEAD^^
    • 回退到上上个版本, 版本号可以回退的版本为head-100
  • git reset --hard 版本号
    • 回退到具体某个版本

查看版本号

各种分支的每一次commit都会生成一个版本号

  • git log
    • 只显示当前分支的 版本变化
  • git log --oneline
    • 显示版本号以及每次commit的变动内容(commit -m "变动信息"),列表的形式展示
  • git log -n4
    • 代表着最近4个记录
  • git log -n4 --oneline
    • 最近4次记录,列表的形式展示
  • git log --all
    • 列出本地所有分支的历史版本
  • git log --all --graph
    • 以树形图的方式展示所有版本历史信息
  • git log --pretty=oneline
    • 查看版本信息,比较美观,列表形式展示

其他基础命令

查看每次更改内容及版本差异

  • git diff
    • 还没有add之前,可以通过这个命令看到对哪些文件做了更改
  • git diff 版本号1 版本号2
    • 可以查看两个版本有哪些不同
  • git diff -- filename
    • 只比较工作区和暂存区某个文件的差异
    • 可以比较多个指定文件,空格分开文件名
  • git diff --cached
    • 暂存区和HEAD之间的差异(add命令之后)
  • git status
    • 查看当前工作区内容和暂存区内容情况

删除git管理的文件

  • git rm filename
    • 从git 版本库删除文件

重命名git管理的文件

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