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项目中的三个区域关系可用下图来表示。
安装
https://git-scm.com/downloads)
配置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
创建新的版本库或者重新初始化仓库
运行过上述命令后share目录中的.git已经不再是一个目录而是下面这样一个文件了
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
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
显示提交的日志
扩展阅读
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分支同步代码。
所以,团队合作的分支看起来应该就像下图这样:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。