1.获取仓库

  1. git init 将本地文件初始化成仓库(最新版的git, init命令可以用于非空目录)
  2. git init FileName 新建一个目录,将其初始化为Git代码库
  3. git clone *** 拉去远程仓库
  4. git clone *** myStudy 自定义远程仓库的文件名
  5. # 其实不用这么写, clone命令会将远程的所有分支都拉去到本地
  6. git clone -b dev git://github.com/schacon/grit.git //克隆dev分支

2.记录变更

02-Git基础 - 图2

2.1 查看文件状态

  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 跟踪新文件

    1. git add hello.js 将未跟踪的文件添加到暂存区
    2. git add kk/ 将未跟踪的目录添加到暂存区, 也可以写成kk

    2.3 修改暂存区的文件

    注意, 存放在暂存区的文件是可以被修改的, 此时这个文件有两种状态, 一种是已暂存, 另一种就是已修改

    2.4 简洁显示

    ``` git status —short git status -s

空 表示是一个干净的工作空间 ?? 表示文件未跟踪 M(右边的M) 表示文件已经修改, 但是还没有添加到缓存区 M (左边的M) 表示文件已经添加到了缓存区

  1. <a name="dxYtr"></a>
  2. ### 2.5 忽略文件
  3. **添加一个.gitignore即可**
  4. - **空行会被忽略, # 为注释符号**
  5. - **以/结尾表示目录, 通常也可以省略**
  6. ```git
  7. *.txt 忽略txt结尾的文件
  8. !my.txt 仍然跟踪my.txt, 即使上一个文件说了要忽略这个文件
  9. /TODO 只忽略当前目录的TODO文件, 而不忽略子目录的TODO
  10. node_package/ 忽略node_package目录
  11. doc/*.puml 只忽略doc目录下的puml文件, 而不葫芦doc/my/aa.puml
  12. doc/**/*puml 忽略doc目录及其子目录下的puml文件

2.6 查看变化

  1. git diff 查看工作区与暂存区的变化
  2. git diff --staged 查看暂存区与版本库比较(最近一次的提交)
  3. git diff --cached 等同于git diff --staged
  4. # 比较指定版本之间的差异
  5. git diff dd74f40 535f3cf 比较两个版本之间的差异, 注意顺序不能变化, 这里是拿dd7535比较的,535是我们的基本版本, dd7是被比较的版本
  6. git diff dd74f40:fileName 535f3cf:fileName 比较两个版本之间, 具体某个文件的差异
  7. git diff dd74f40 535f3cf --name-only 只比较两个版本之间, 那些文件做了改动
  8. git diff 608e120 4abe32e --name-only | xargs zip update.zip 比较两个版本之间的差异, 并打包(只能在LINUX下使用)

2.7 提交

注意, 提交到仓库时, 只能将暂存区的变化提交到版本库中, 工作区的变化是不能提交到版本库中

  1. git commit 提交暂存区的内容到版本库
  2. git commit -v 提交信息是显示git diff差异
  3. git commit -m *** 直接提交版本信息
  4. 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 *~ 移除所有以~结尾的文件

  1. <a name="kO5sq"></a>
  2. ### 2.9 永久删除文件(补充)
  3. - **文件路径**`src/config/automate.config.js`**是相对于.git目录而言的, 不能使用/绝对路径, 因为绝对路径是从git的安装目录开始; 另外一个就是要注意分隔符**
  4. - **不能再cmd控制台中执行, 只能再git自带的bash中执行**
  5. ```git
  6. # 第一种写法
  7. git filter-barnch --tree-filter 'rm -f src/app.js' HEAD
  8. # 第二种写法
  9. 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是检查不出来有内容变化的, 除非这个目录中有文件

    1. 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提交记录

  1. <a name="X6iVm"></a>
  2. ### 3.1 log选项
  3. | 选项 | **描述** |
  4. | --- | --- |
  5. | -p | 按补丁格式, 显示提交引入的更改 |
  6. | --stat | 显示每个提交中被更改的文件统计信息 |
  7. | --pretty | 格式化 |
  8. | --graph | ASCII图表, 显示合并记录 |
  9. | --shortstat | 简单展示被更改的信息 |
  10. | --name-only | 只显示被更改的文件列表 |
  11. | --abbrev-commit | 显示部分comment_id |
  12. | --relative-date | 像是相对期日, 如几个小时前, 几周前 |
  13. <a name="AMW9l"></a>
  14. ### 3.2 format属性值
  15. | **格式选项** | **描述** |
  16. | --- | --- |
  17. | %H | 提交对象的散列值 |
  18. | %h | 提交对象的简短散列值 |
  19. | %T | 树对象的散列值 |
  20. | %t | 树对象的简短散列值 |
  21. | %P | 父对象的散列值 |
  22. | %p | 父对象的简短散列值 |
  23. | %an | 作者的名字 |
  24. | %ae | 作者的邮箱 |
  25. | %ad | 创作日期 |
  26. | %ar | 相当于当前日期的拆给你做日期 |
  27. | %cn | 提交者的名字 |
  28. | %ce | 提交者的电子邮箱地址 |
  29. | %cd | 提交日期 |
  30. | %cr | 相对于当前日期的拆给你做日期 |
  31. | %s | 提交信息的主题 |
  32. <a name="obdfl"></a>
  33. ### 3.3 筛选输出历史
  34. - **如果--grep, --author连用, 不要忘记使用--all-match参数**
  35. ```git
  36. # 根据时间查找, 可以是具体的时间2010-05-21, 也可以是相对时间(复数加不加都行) 8.weeks, 8.month
  37. git log --since=8.hours 指定日期之后的数据, 也可用--after参数
  38. git log --until=8.hour 指定期日之前的数据, 也可用--berfore参数
  39. # 搜索提交者与作者, 采用的是模糊查询%gu%
  40. git log --author=gu
  41. git log --committer=gu
  42. # 管道grep
  43. git log --grep=地点回答 管道搜索的是commmit信息
  44. # 指定文件或目录
  45. git log ../doc 注意文件的路径要正确
  46. git log ./k02.js 指定文件

4. 撤销操作

没有提交到版本库中的撤销操作, 如果撤销, 便再也找不回来了

4.1 撤销时序图

02-Git基础 - 图3

4.2 覆盖最新提交

  1. git add -A
  2. git commit --amend 修改最后一次提交

绘图1.png

4.3 撤销未跟踪文件

  1. git clean -n 查看所有为跟踪的文件(不删除, 只是查看)
  2. git clean -n -x 查看所有的未跟踪文件(包括gitignorez中忽略的未跟踪文件z)
  3. git clean -fd 清空所有的未跟踪文件, -fd可以分开写成-f(强制) -d(确定执行)
  4. git clean -i 交互是删除文件

4.4 reset回退

  1. git reset --hard HEAD~1 回复到上一个版本(不需要版本号)
  2. git reset --hard 0ffaacc HEAD, 索引, 工作目录都回退到0ffaacc版本
  3. git reset --mixed(可省) 0ffaacc HEAD, 索引回退到0ffaacc版本, 工作目录不变
  4. git reset --soft 0ffaacc HEAD 回退到0ffaacc版本, 索引和工作目录不变

5. 远程仓库

  • fetch拉去的分支数据, 会形成一个独特的分支, 别名/分支名如: origin/master

    5.1 查看远程仓库

    1. git remote 显示远程仓库的别名
    2. git remote -v 显示仓库地址

    5.2 添加远程仓库

    1. git remote add origin [url 添加远程仓库地址, origin是我们给远程仓库起的别名
    2. git remote set-url --add origin [url] origin添加多个远程仓库

    在本地config中配置origin有多个远程仓库, 第一个url表示了从远程fetch [remote “origin”] url = https://gitee.com/pogusanqian/mykoa.git

    1. fetch = +refs/heads/*:refs/remotes/origin/*
    2. url = [https://github.com/pogusanqian/mykoa.git](https://github.com/pogusanqian/mykoa.git)

image.png

5.3 更改远程仓库

  1. git remote rename origin origins origin重命名成origins
  2. git remote set-url origin [url] 修改origin远程仓库的地址

5.4 删除远程仓库

  1. git remote rm origins 删除远程仓库origins

5.5 拉取远程数据

  1. # 拉去数据与推送数据
  2. git fetch 拉去所有远程仓库所有分支数据
  3. git fetch --all 拉取远程的所有数据
  4. git fetch origin 拉去origin远程仓库的所有分支数据
  5. git fetch origin master 只拉取master分支上的数据
  6. # 合并拉去的数据
  7. git merge origin/master origin/master 就是通过fetch拉去的远程数据

5.6 拉取并合并数据

  1. # pull合并数据
  2. git pull <远程主机名> <远程分支名>:<本地分支名>
  3. git pull origin master:test 拉去远程的master分支, 合并到test分支
  4. git pull origin master 拉去远程的master分支, 并合并到当前所在的分支
  5. git pull 拉去所有的远程分支数据, 但是之合并origin/当前分支

5.7 推送本地数据

  1. # push数据
  2. git push <远程主机名> <本地分支名>:<远程分支名>
  3. git push origin test:master 将本地分支test推送到远程的master上(一般不这么写)
  4. git push origin test 将本地分支test推送到对应的远程分支test
  5. git push 简写, 推送对应的本地分支到对应的远程分支
  6. git push --all 将所有分支都推送到远程仓库(只能推送到默认的远程仓库)

7. 标签

tag是git版本库的一个标记, 指向某个commit的指针, 主要用于发布版本的管理; tag对应某次commit, 是一个点, 是不可移动的; branch对应一系列commit, 是很多点连成的一根线, 有一个HEAD 指针, 是可以依靠 HEAD 指针移动的; 所以, 两者的区别决定了使用方式, 改动代码用 branch ,不改动只查看用 tag;
Git中的标签有两种, 分别是轻量标签注释标签两种; 轻量标签很像一个不变的分支, 它只是一个指向某次提交的指针; 注释标签则会作为完整的对象存储在git数据库中; 注释标签还会存储一些信息: 标记着, 打标签时间, 标记信息等等;

  1. # 添加标签
  2. git tag -a 0.1.9 -m 注释标签 注意: 0.1.9标签的名字, 不能重复
  3. git tag -a 0.1.3 -m 补标签 e823944 给以往的版本补标签
  4. git tag 轻量标签-01 轻量标签没有-m参数
  5. # 查看标签
  6. git tag
  7. git tag -l 0.1.9 不支持模糊查询, -l是--list的简写
  8. git ls-remote --tags ./
  9. # 推送到远程
  10. git push origin 0.1.9 直接将0.1.9tag对象推送到了远程
  11. git push --tags 将本地所有的tag推送到远程
  12. # 删除标签
  13. git tag -d 0.1.9 删除0.1.9tag
  14. git push origin -d tag 0.1.9 删除远程分支
  15. git push origin :refs/tags/0.1.9 删除远程分支
  16. # 从远程恢复
  17. git fetch fetch会将远程的所有tag拉取到本地, 不需要合并
  18. # 检出标签(创建了一个新的分支)
  19. git checkout -b kk 0.1.9 新创建的分支名不能省略
  20. git chekcout -b 0.1.9 创建了一个0.1.9的分支, 不是检出了标签