1

Git 入门指南-基础

本章要点

-[ ] Git中关于文件的几个相关概念

    • [ ] 文件的四种状态

      • [ ] 已提交
      • [ ] 已修改
      • [ ] 已暂存
      • [ ] 未跟踪
    • [ ] 文件的三个区域

      • [ ] 工作目录
      • [ ] 暂存区
      • [ ] 本地仓库
    • [ ] 安装Git
    • [ ] 配置Git
    • [ ] 使用Git
    • [ ] Git使用的几个基础场景
    • [ ] Git的协作分支实践

    文件相关概念

    文件的四种状态

    对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。还有一种不在Git中的状态,未跟踪(untracked)。

    • 已修改

      已修改表示修改了某个文件,但还没有提交保存;

    • 已暂存

      已暂存表示把已修改的文件放在下次提交时要保存的清单中

    • 已提交

      已提交表示该文件已经被安全地保存在本地数据库中了

    • 未跟踪

      文件在Git工作区中,但是未被添加到Git版本中。

    文件流转的三个工作区域

    工作目录

    git版本控制的项目中除了本地仓库目录以外的,你能操作的其他目录。

    暂存区域

    暂存区是Git仓库中的一个概念位置

    本地仓库

    每个项目都有一个 Git 目录;如果 git clone 出来的话,就是其中 .git 的目录;如果 git clone --bare 的话,新建的目录本身就是 Git 目录。

    远程仓库

    一个远程仓库通常只是一个裸仓库(bare repository)— 即一个没有当前工作目录的仓库。 因为该仓库仅仅作为合作媒介,不需要从磁碟检查快照;存放的只有 Git 的资料。 简单的说,裸仓库就是你工程目录内的 .git 子目录内容,不包含其他资料,远程仓库是一个独立的仓库。

    一个本地git项目中的三个区域关系可用下图来表示。

    clipboard.png

    安装

    https://git-scm.com/downloads)

    clipboard.png

    配置GIT

    GIT的配置信息存放于三个位置

    • `/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
    • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
    • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

    在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings\$USER。此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

    git config

    使用git config命令来配置或查看一些配置,包括全局配置和项目配置。

    常用命令

    全局配置用户信息

    git congit --global user.name “username”

    git config --global user.email “email@email.com”

    git help

    显示git的帮助信息;学会使用这个命令,基本上git就会了一半,全掌握的话还需要理解git的所有术语概念。

    git命令都可以使用git help [COMMAND]的方式显示对应 COMMAND的用法信息

    常用命令

    git help help 显示git帮助信息主页

    git help branch 显示init命令的帮助信息

    使用GIT

    以下通过常用的git命令来简单的说明下这些命令。

    【添加用的】

    git init

    git init 创建新的版本库或者重新初始化仓库

    clipboard.png

    clipboard.png

    clipboard.png

    clipboard.png

    运行过上述命令后share目录中的.git已经不再是一个目录而是下面这样一个文件了

    clipboard.png

    git add

    git add 添加内容到暂存区

    常用命令

    git add [<pathspec>]

    git add -n [<pathspec>] 查看add的内容,不会将文件添加进暂存区

    扩展阅读

    一些简单的匹配

    Glob 含义
    . 当前目录
    ./src/*.js 当前目录中的src子目录下的js扩展名文件
    ./src/**/*.js 当前目录中的src子目录下的,以及嵌套目录中的js扩展名文件
    !src 不匹配src文件也不匹配src目录

    <pathspec> 支持Glob匹配。

    匹配模式有下面几种:

    Glob(匹配模式)) 、正则表达式Wildcard character(通配符)

    通用的三个匹配符, *、?、[...]

    通配符 描述 模式举例 匹配项 不匹配项
    * 匹配任意数量的字符 Law* Law, Laws or Lawyer GrokLaw, La or aw
    *Law* Law, GrokLaw or Lawyer. La or aw
    ? 匹配任意单个字符 ?at Cat, cat, Bat or bat at
    [abc] 匹配集合中的一个字符 [CB]at Cat or Bat cat or bat
    [a-z] 匹配区间内的一个字符 a[0-9] a0, a1 ... a9 ab, a or a10

    git commit

    给仓库中写入改变,或者说进行一次提交,给仓库中写入一条历史记录(历史中记录了改变的内容)。

    常用命令

    git commit -m “message”

    注意:commit命令默认需要添加提交日志,如果没有该命令使用-m参数, 会进入我们通过core.editor指定的编辑器中, 默认vim编辑器,这个编辑器可能大家不太熟悉,所以进入这个界面可能会有点不知所措,请参考下面文档,想使用Git?你不得不了解的vim编辑器

    git clone

    克隆一个版本库到一个新的目录。

    常用命令

    git clone <repository> [path-to-dir] 克隆仓库到指定位置

    git clone -b <branchname> <repository> 克隆仓库指定分支

    git clone --recurse <repository> 克隆仓库及关联子项

    注意: 这个仓库可以是本地的一个项目

    扩展阅读

    <repository> 支持[GIT URLS](),有以下几种格式

    ​ 远程

    • ssh://[user@]host.xz[:port]/path/to/repo.git/
    • git://host.xz[:port]/path/to/repo.git/
    • http[s]://host.xz[:port]/path/to/repo.git/
    • ftp[s]://host.xz[:port]/path/to/repo.git/

      本地

    • /path/to/repo.git/
    • file:///path/to/repo.git/

    【反悔用的】

    git reset

    重置当前HEAD到指定状态

    常用命令

    git reset --hard HEAD 重置当前工作目录中未提交已暂存和已修改文件的内容

    注意上述命令不会处理 untracked 状态的文件

    扩展阅读

    HEAD
    • HEAD 指向一个提交历史, 指向离当前index最近的一次提交,通过很多命令可以改变HEAD的指向。

    比如:

    git checkout exist-branch-name 切换分支,HEAD就会指向切换后分支的最后一次提交

    git reset --hard <commit-hash> 重置当前工作目录到commit-hash的状态,HEAD就会指向该提交

    git rm

    删除存在于仓库中的文件或者删除存在于暂存区和工作目录中的文件

    要删除仅仅在工作目录中的文件需要使用 rm 命令

    常用命令

    git rm file 删除已经暂存的工作目录和暂存区中的文件

    git rm --cached file 删除暂存区文件

    git mv

    移动或重命名一个文件,一个目录,或一个符号链接。

    【查阅用的】

    git status

    git status 查看版本库状态

    常用命令

    git status 查看当前状态

    git status -s -b 简短输出日志信息

    image-20181010161819094.png

    clipboard.png
    clipboard.png

    git diff

    显示提交和提交之间的改动,提交和工作目录的改动等

    常用命令

    比较工作区与暂存区

    git diff 不加参数即默认比较工作区与暂存区

    比较暂存区与最新本地版本库(本地库中最近一次commit的内容

    git diff --cached [<path>...]

    比较工作区与最新本地版本库

    git diff HEAD [<path>...] 如果HEAD指向的是master分支,那么HEAD还可以换成master

    比较工作区与指定commit-id的差异

    git diff commit-id [<path>...]

    比较暂存区与指定commit-id的差异

    git diff --cached [<commit-id>][...]

    比较两个commit-id之间的差异

    git diff [<commit-id>][<commit-id>]

    使用git diff打补丁

    git diff > patch

    注意:patch的命名是随意的,不加其他参数时作用是当我们希望将我们本仓库工作区的修改输出到patch文件中,适合修改的文件比较多,我们可以在一个单独的文件中查看修改的内容

    git log

    显示提交的日志

    扩展阅读

    格式化log, 官网

    git config --global alias.lg "log --graph --all --pretty=format:'%C(yellow)%h%C(cyan)%d%Creset %s %C(white)- %an, %ar%Creset'"

    git lg 美化版输出

    git branch

    列出,创建和删除分支

    常用命令

    git branch <branchname> 创建一个新的分支

    git branch --list git branch 列出本地分支

    git branch -a 列出全部分支包括远程分支

    git branch -d <branchname> 删除分支

    git checkout

    切换分支或者恢复工作目录文件

    操作文件常用命令

    git checkout filename 放弃单个文件的修改

    git checkout . 放弃当前目录下的修改

    操作分支常用命令

    git checkout master 将分支切换到master

    git checkout -b master 如果分支存在则只切换分支,若不存在则创建并切换到master分支

    git merge

    合并一个或者多个分支到你已经检出的分支中。 然后它将当前分支指针移动到合并结果上.

    git merge <not-current-branch> 将非当前分支独有的内容合并到当前分支并生成一个新的合并提交,并HEAD指向当前分支的这个合并提交位置。

    git push

    将本地分支的更新,推送到远程主机

    git push origin dev 将dev分支推送到origin主机的dev分支

    git push -u origin dev 同上,附加主机分支跟踪功能,下次推送,可以使用git push命令默认会推送到origin主机的dev分支

    git push origin :dev

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

    git pull

    从另一仓库拉去代码并合并到本地分支中

    常用命令

    git pull <远程主机名> <远程分支名>:<本地分支名> 从远程主机的远程分支拉去代码并合并到本地分支中

    如果之前设置过跟踪分支,可以直接使用 git pull

    Git 使用的几个场景

    场景需要代码演练,请参考

    • [ ] 添加提交

      • [ ] 获取一个仓库
      • [ ] 新建一个文件或者修改仓库的内容
      • [ ] 添加文件进index
      • [ ] commit文件到仓库
    • [ ] 撤销

      • [ ] 从暂存区撤销
      • [ ] 从版本库回退
    • [ ] 代码合并,

      • [ ] 合并不同分支代码
      • [ ] 同分支本地提交和远程代码合并
    • [ ] 解决冲突

    Git协作分支实践

    在实际开发中,我们应该按照几个基本原则进行分支管理:

    • master 稳定性应该最高,用来发布新版,不在master分支开发;
    • dev 稳定次于master,用来合并功能,也不建议在该分支开发;
    • 个人分支 协作者自己个人分支,所有自己写的功能都在这个分支,经常需要和dev分支同步代码。

    所以,团队合作的分支看起来应该就像下图这样:

    clipboard.png


    言月
    1.8k 声望490 粉丝

    从有技术广度到技术深度的转变,这样才能被自己迷恋