git使用

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。知名的git管理平台有github

本地git

简介

git分为工作区、暂存器和版本库。

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。图中”HEAD” 实际是指向 master 分支的一个”游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
  • object:Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。

1566977176119

命令说明

基本操作 git init 创建版本库
git add <文件> 将文件从工作区添加到暂存区
git commit -m“<说明>” 将文件从暂存区添加到版本库
git checkout <文件> 将文件从暂存区添加到工作区
git rm --cached <文件> 将暂存区中的文件删除
git reset head 将文件从版本库添加到暂存区
git checkout head <文件> 将文件从版本库添加到工作区
版本管理 git log 查看版本信息 ——查找commit id
--graph:以图的形式展现信息
git reflog 查看历史操作信息——查找commit id
以防因为版本回滚导致git log中的信息丢失
git reset --hard HEAD^
git reset --hard HEAD^^
git reset --HEAD~100
git reset --hard 1094
# 回退上一个版本
# 回退上两个版本
# 回退上100个版本
# 回退到指定版本,后面的1094a是commit的版本号
标签 git tag -a v0.1 -m "version 0.1 released" 1094adb -a指定标签名,-m指定说明文字
git tag v0.1 commit id 默认标签是打在最新提交的commit id
如果添加commit id就会打在指定的commit id上
git tag -d v0.1 删除标签
git push origin v1.0
git push origin --tags
推送标签到远程
一次性推送全部标签
git tag
git show <标签名>
查看标签
查看标签的说明文字
保存工作区与缓存区 git stash
将工作区与暂存区的内容保存起来
git stash list 查看保存的工作区与暂存区
git stash apply 恢复制定的stash,但是stash内容并不删除。git stash apply stash@{0}
git stash drop 删除制定的stash。git stash drop stash@{0}
git stash pop 恢复并删除最新的工作区与暂存区
分支管理 git branch 查看分支
git branch <分支名> 新建分支,并且新分支有老分支的内容
git checkout <分支名> 切换分支
git branch -d <分支名> 删除分支
git merge <分支名>
git merge --no-ff <分支名>
合并分支到当前分支下
如果有冲突修改冲突,使用git add与git commit 提交
其他 git status 查看状态
git diff
git diff [--options] <commit> <commit> [--] [<path>...]
git diff:比较工作区与暂存区
git diff --cached:比较暂存区与最新本地版本库
git diff --cached <commit-id>:比较暂存区与版本库指定commit-id的差异
git diff HEAD:比较工作区与最新本地版本库
git diff <commit-id>:比较工作区与版本库指定commit-id的差异
git diff <commit-id><commit-id>:比较版本库两个commit-id之间的差异
git diff <分支><分支>:比较两个分支
git rm 删除文件

.gitignore

添加到.gitignore中的文件,不会被添加到暂存区,因此不会被保存到版本库中,进而不会存在版本管理。在不同文件夹下建立.gitignore可以忽略不同的文件。

1
2
3
4
5
6
7
├── .vscode   
├── feture
│ ├── dev.py
│ └── test #测试文件夹
│ │ ├── test_dev.py #本地仓库对应分支所有操作
│ └── .gitignore #写入test/ 可以忽略同级目录下test的文件夹
├── .gitignore #写入.vscode/ 可以忽略同级目录下.vscode的文件夹

远程

1566980274372

命令 说明
git remote 查看当前配置有哪些远程仓库
-v:执行时加上 -v 参数,你还可以看到每个别名的实际链接地址。
git remote add 连接远程版本库
git remote add [shortname] [url]
shortname:远程版本库的别名
url:远程版本库的链接
git remote rm [别名] 删除远程仓库
git push 本地库内容推送到远程库中
git push [alias] [branch]:推送成为 [alias] 远程仓库上的 [branch] 分支
git clone 克隆远程版本库
git pull 拉取远程分支更新到本地仓库,再与本地指定分支合并。
git pull <远程主机名> <远程分支名>:<本地分支名>
git fetch 拉取远程分支更新到本地仓库
git merge origin/master 把远程下载下来的代码合并到本地仓库,远程的和本地的合并

git ls-files查看版本库目录

git指针问题

文件.git/index实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。在这个虚拟工作区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等)。文件的内容并不存储其中,而是保存在Git对象库.git/objects目录中,文件索引建立了文件和对象库中对象实体之间的对应。下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系。

../images/git-stage.png

工作区、版本库、暂存区原理图

在这个图中,可以看到部分Git命令是如何影响工作区和暂存区(stage,亦称index)的。下面就对这些命令进行简要的说明,而要彻底揭开这些命令的面纱要在接下来的几个章节。

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为index的区域是暂存区(stage,亦称index),标记为master的是master分支所代表的目录树。
  • 图中可以看出此时HEAD实际是指向master分支的一个“游标”。所以图示的命令中出现HEAD的地方可以用master来替换。
  • 图中的objects标识的区域为Git的对象库,实际位于.git/objects目录下,会在后面的章节重点介绍。
  • 当对工作区修改(或新增)的文件执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master分支会做相应的更新。即master最新指向的目录树就是提交时原暂存区的目录树。
  • 当执行git reset HEAD命令时,暂存区的目录树会被重写,被master分支指向的目录树所替换,但是工作区不受影响。
  • 当执行git rm –cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行git checkout .或者git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
  • 当执行git checkout HEAD .或者git checkout HEAD 命令时,会用HEAD指向的master分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

../images/git-diff.png