1.获取仓库
git init 将本地文件初始化成仓库(最新版的git, init命令可以用于非空目录)
git init FileName 新建一个目录,将其初始化为Git代码库
git clone *** 拉去远程仓库
git clone *** myStudy 自定义远程仓库的文件名
# 其实不用这么写, clone命令会将远程的所有分支都拉去到本地
git clone -b dev git://github.com/schacon/grit.git //克隆dev分支
2.记录变更
2.1 查看文件状态
git status 查看文件的状态
- Untracked files: 表示文件还没有被跟踪, 需要使用git add命令进行跟踪, 添加到缓存区
- Changes to be committed: 已经添加到缓存区的文件, 需要执行git commit 命令进行提交
- nothing to commit, working tree clean: 表示我们的工作区是干净的, 和仓库是同步的
- Changes not staged for commit: 表示文件已经进行了修改, 但是还没有添加到缓存区
2.2 跟踪新文件
git add hello.js 将未跟踪的文件添加到暂存区
git add kk/ 将未跟踪的目录添加到暂存区, 也可以写成kk
2.3 修改暂存区的文件
注意, 存放在暂存区的文件是可以被修改的, 此时这个文件有两种状态, 一种是已暂存, 另一种就是已修改2.4 简洁显示
``` git status —short git status -s
空 表示是一个干净的工作空间 ?? 表示文件未跟踪 M(右边的M) 表示文件已经修改, 但是还没有添加到缓存区 M (左边的M) 表示文件已经添加到了缓存区
<a name="dxYtr"></a>
### 2.5 忽略文件
**添加一个.gitignore即可**
- **空行会被忽略, # 为注释符号**
- **以/结尾表示目录, 通常也可以省略**
```git
*.txt 忽略txt结尾的文件
!my.txt 仍然跟踪my.txt, 即使上一个文件说了要忽略这个文件
/TODO 只忽略当前目录的TODO文件, 而不忽略子目录的TODO
node_package/ 忽略node_package目录
doc/*.puml 只忽略doc目录下的puml文件, 而不葫芦doc/my/aa.puml
doc/**/*puml 忽略doc目录及其子目录下的puml文件
2.6 查看变化
git diff 查看工作区与暂存区的变化
git diff --staged 查看暂存区与版本库比较(最近一次的提交)
git diff --cached 等同于git diff --staged
# 比较指定版本之间的差异
git diff dd74f40 535f3cf 比较两个版本之间的差异, 注意顺序不能变化, 这里是拿dd7和535比较的,535是我们的基本版本, dd7是被比较的版本
git diff dd74f40:fileName 535f3cf:fileName 比较两个版本之间, 具体某个文件的差异
git diff dd74f40 535f3cf --name-only 只比较两个版本之间, 那些文件做了改动
git diff 608e120 4abe32e --name-only | xargs zip update.zip 比较两个版本之间的差异, 并打包(只能在LINUX下使用)
2.7 提交
注意, 提交到仓库时, 只能将暂存区的变化提交到版本库中, 工作区的变化是不能提交到版本库中
git commit 提交暂存区的内容到版本库
git commit -v 提交信息是显示git diff差异
git commit -m *** 直接提交版本信息
git commit -a 跳过暂存区直接将信息提交到仓库
2.9 移除文件
- untrack的文件使用git rm命令是删除不掉的
- git rm -f 移除某个未跟踪的文件(这个文件已将提交到了暂存区, 当并没有提交到仓库 ```git git rm 将某个文件移除, 注意移除的文件已经自动提交到了暂存区 git rm -f 移除某个未跟踪的文件(这个文件已将提交到了暂存区, 当并没有提交到仓库) git rm —cached * 只移除暂存区, 不移除工作目录
git rm log/*.log 移除log目录下的所有log文件, *表示转义符 git rm *~ 移除所有以~结尾的文件
<a name="kO5sq"></a>
### 2.9 永久删除文件(补充)
- **文件路径**`src/config/automate.config.js`**是相对于.git目录而言的, 不能使用/绝对路径, 因为绝对路径是从git的安装目录开始; 另外一个就是要注意分隔符**
- **不能再cmd控制台中执行, 只能再git自带的bash中执行**
```git
# 第一种写法
git filter-barnch --tree-filter 'rm -f src/app.js' HEAD
# 第二种写法
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch src/config/automate.config.js' --prune-empty --tag-name-filter cat -- --all
2.10 移动文件
- 在linux中, 一切都是文件, 目录只是文件的前缀, 所以移动文件和重命名文件都是使用了mv命令
如果只有一个空目录, git是检查不出来有内容变化的, 除非这个目录中有文件
git mv hello.js doc/hello.js 移动到doc目录下
3. 查看历史
注意git log可用用来查看其它分支的历史激流 ```git git log 查看记录 git log -1 查看最近一次的提交记录 git log -1 -p 查看最近一次提交的记录, 并展示diff
git log —stat 查看简要的统计信息,(添加了多少行, 删除了多少行, 重命名了那些文件)
—pretty属性
git log —pretty=oneline 一行展示, 只有校验值与提交信息 git log —oneline 简写, 但是输出不同 git log —pretty=short 相比于git log 少了提交时间 git log —pretty=full 相比于git log 少了提交时间, 多了commit人信息 git log —pretty=fuller 相比于git log 多了commit人信息
pretty的format属性
git log —pretty=format:”%H %ad” 注意: forma后面的冒号不要使用空格
graph 属性
git log —graph 图形展示提交信息
其他分支记录
git log test 查看test分支上的记录 git log origin/master 查看远程分支的master提交记录
<a name="X6iVm"></a>
### 3.1 log选项
| 选项 | **描述** |
| --- | --- |
| -p | 按补丁格式, 显示提交引入的更改 |
| --stat | 显示每个提交中被更改的文件统计信息 |
| --pretty | 格式化 |
| --graph | ASCII图表, 显示合并记录 |
| --shortstat | 简单展示被更改的信息 |
| --name-only | 只显示被更改的文件列表 |
| --abbrev-commit | 显示部分comment_id |
| --relative-date | 像是相对期日, 如几个小时前, 几周前 |
<a name="AMW9l"></a>
### 3.2 format属性值
| **格式选项** | **描述** |
| --- | --- |
| %H | 提交对象的散列值 |
| %h | 提交对象的简短散列值 |
| %T | 树对象的散列值 |
| %t | 树对象的简短散列值 |
| %P | 父对象的散列值 |
| %p | 父对象的简短散列值 |
| %an | 作者的名字 |
| %ae | 作者的邮箱 |
| %ad | 创作日期 |
| %ar | 相当于当前日期的拆给你做日期 |
| %cn | 提交者的名字 |
| %ce | 提交者的电子邮箱地址 |
| %cd | 提交日期 |
| %cr | 相对于当前日期的拆给你做日期 |
| %s | 提交信息的主题 |
<a name="obdfl"></a>
### 3.3 筛选输出历史
- **如果--grep, --author连用, 不要忘记使用--all-match参数**
```git
# 根据时间查找, 可以是具体的时间2010-05-21, 也可以是相对时间(复数加不加都行) 8.weeks, 8.month
git log --since=8.hours 指定日期之后的数据, 也可用--after参数
git log --until=8.hour 指定期日之前的数据, 也可用--berfore参数
# 搜索提交者与作者, 采用的是模糊查询%gu%
git log --author=gu
git log --committer=gu
# 管道grep
git log --grep=地点回答 管道搜索的是commmit信息
# 指定文件或目录
git log ../doc 注意文件的路径要正确
git log ./k02.js 指定文件
4. 撤销操作
没有提交到版本库中的撤销操作, 如果撤销, 便再也找不回来了
4.1 撤销时序图
4.2 覆盖最新提交
git add -A
git commit --amend 修改最后一次提交
4.3 撤销未跟踪文件
git clean -n 查看所有为跟踪的文件(不删除, 只是查看)
git clean -n -x 查看所有的未跟踪文件(包括gitignorez中忽略的未跟踪文件z)
git clean -fd 清空所有的未跟踪文件, -fd可以分开写成-f(强制) -d(确定执行)
git clean -i 交互是删除文件
4.4 reset回退
git reset --hard HEAD~1 回复到上一个版本(不需要版本号)
git reset --hard 0ffaacc 将HEAD, 索引, 工作目录都回退到0ffaacc版本
git reset --mixed(可省) 0ffaacc 将HEAD, 索引回退到0ffaacc版本, 工作目录不变
git reset --soft 0ffaacc 将HEAD 回退到0ffaacc版本, 索引和工作目录不变
5. 远程仓库
- fetch拉去的分支数据, 会形成一个独特的分支, 别名/分支名如: origin/master
5.1 查看远程仓库
git remote 显示远程仓库的别名
git remote -v 显示仓库地址
5.2 添加远程仓库
git remote add origin [url 添加远程仓库地址, origin是我们给远程仓库起的别名
git remote set-url --add origin [url] 给origin添加多个远程仓库
在本地config中配置origin有多个远程仓库, 第一个url表示了从远程fetch [remote “origin”] url = https://gitee.com/pogusanqian/mykoa.git
fetch = +refs/heads/*:refs/remotes/origin/*
url = [https://github.com/pogusanqian/mykoa.git](https://github.com/pogusanqian/mykoa.git)
5.3 更改远程仓库
git remote rename origin origins 将origin重命名成origins
git remote set-url origin [url] 修改origin远程仓库的地址
5.4 删除远程仓库
git remote rm origins 删除远程仓库origins
5.5 拉取远程数据
# 拉去数据与推送数据
git fetch 拉去所有远程仓库所有分支数据
git fetch --all 拉取远程的所有数据
git fetch origin 拉去origin远程仓库的所有分支数据
git fetch origin master 只拉取master分支上的数据
# 合并拉去的数据
git merge origin/master origin/master 就是通过fetch拉去的远程数据
5.6 拉取并合并数据
# pull合并数据
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin master:test 拉去远程的master分支, 合并到test分支
git pull origin master 拉去远程的master分支, 并合并到当前所在的分支
git pull 拉去所有的远程分支数据, 但是之合并origin/当前分支
5.7 推送本地数据
# push数据
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin test:master 将本地分支test推送到远程的master上(一般不这么写)
git push origin test 将本地分支test推送到对应的远程分支test
git push 简写, 推送对应的本地分支到对应的远程分支
git push --all 将所有分支都推送到远程仓库(只能推送到默认的远程仓库)
7. 标签
tag是git版本库的一个标记, 指向某个commit的指针, 主要用于发布版本的管理; tag对应某次commit, 是一个点, 是不可移动的; branch对应一系列commit, 是很多点连成的一根线, 有一个HEAD 指针, 是可以依靠 HEAD 指针移动的; 所以, 两者的区别决定了使用方式, 改动代码用 branch ,不改动只查看用 tag;
Git中的标签有两种, 分别是轻量标签和注释标签两种; 轻量标签很像一个不变的分支, 它只是一个指向某次提交的指针; 注释标签则会作为完整的对象存储在git数据库中; 注释标签还会存储一些信息: 标记着, 打标签时间, 标记信息等等;
# 添加标签
git tag -a 0.1.9 -m 注释标签 注意: 0.1.9标签的名字, 不能重复
git tag -a 0.1.3 -m 补标签 e823944 给以往的版本补标签
git tag 轻量标签-01 轻量标签没有-m参数
# 查看标签
git tag
git tag -l 0.1.9 不支持模糊查询, -l是--list的简写
git ls-remote --tags ./
# 推送到远程
git push origin 0.1.9 直接将0.1.9的tag对象推送到了远程
git push --tags 将本地所有的tag推送到远程
# 删除标签
git tag -d 0.1.9 删除0.1.9的tag
git push origin -d tag 0.1.9 删除远程分支
git push origin :refs/tags/0.1.9 删除远程分支
# 从远程恢复
git fetch fetch会将远程的所有tag拉取到本地, 不需要合并
# 检出标签(创建了一个新的分支)
git checkout -b kk 0.1.9 新创建的分支名不能省略
git chekcout -b 0.1.9 创建了一个0.1.9的分支, 不是检出了标签