Git - 基本使用
我们从一点一滴开始学习Git.满足我们日常的开发需求
1. 安装
1)Windows下的安装
到Git for Windows上下载git bash 即可在命令行中愉快的使用git了
2)Linux下的安装
源码安装:
http://git-scm.com/ 或github上下载源代码 wget -c https://github.com/git/git/archive/v2.23.0.tar.gz tar zxvf v2.23.0.tar.gz // 可根据 目录下的安装文件进行安装 INSTALL make prefix=/usr all doc info make prefix=/usr/local install git安装完毕。/usr/local/bin
yum安装:
yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel $ yum -y install git-core $ git --version git version 1.7.1
2.基础概念
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库
图中左侧为工作区,右侧为版本库。在版本库中标记为 "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 <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
3. 配置信息
git config 的工具,专门用来配置或读取相应的工作环境变量
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置。若使用git config
时用--system
选项,读写的就是这个文件。~/.gitconfig
文件:用户目录下的配置文件只适用于该用户。若使用git config
时用--global
选项,读写的就是这个文件。- 当前项目的 Git 目录中的配置文件(也就是工作目录中的
.git/config
文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config
里的配置会覆盖/etc/gitconfig
中的同名变量。
1)查看配置信息
git config --list
编辑配置内容
vim ~/.git/gitconfig
查看某个配置
git config user.name
2)配置个人名称和邮箱地址
1 $ git config --global user.name "name"
2 $ git config --global user.email email@email.com
3)设置使用的编辑器
$ git config --global core.editor vim
4)差异分析工具
$ git config --global merge.tool vimdiff
4.常用使用
1)查看git版本
git --version
2)将工作区中的文件添加到暂存区
git add 文件名称/*(提交所有)
3) 将暂存区中的文件退回到未添加的状态
git rm --cached 要退回的文件
4)创建版本库
使用当前目录为GIT仓库,则直接使用 git init 就会在当前目录下产生一个.git目录 该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。
制定目录为Git仓库, 则 git init 目录名称
5)已有版本库的情况
直接将现有的版本库克隆到本地
1 git clone <repo>//仓库
2
3 git clone <repo> <directory> //指定目录
4
5
6 //事例
7 $ git clone git://github.com/xing/test.git test
//可以指定用户名/邮箱+密码
git clone git://用户名:密码@github.com/xing/test.git test
6)显示版本信息(状态)
1 git status //显示代码完整状态信息(相当于git status --long)
2
3 git status -s //显示代码简短状态信息(只显示变化的文件)
??: 新增加的状态但是还没有提交到缓存中
A:已经将工作区的文件提交到了缓存中
AM: 已经提交过缓存文件但是又进行了修改, (这种情况: 修改之后 再次执行git add 即可)
7)查看执行 git status 的结果的详细信息(都是针对已经进行add的文件)
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别
-
- 尚未缓存的改动:git diff
- 查看已缓存的改动: git diff --cached
- 查看已缓存的与未缓存的所有改动:git diff HEAD
- 显示摘要而非整个 diff:git diff --stat
8)将缓存区中的内容提交到版本库(使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中)
git commit 命令 提交到版本库
Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址。
对于已经添加过缓存区的文件,由于后期的修改,需要进行重新add 并提交 所以可以进行简化处理
git commit -am '修改 hello.php 文件' // -a 直接进行提交 -m 注释信息
9) 取消已缓存的内容
git reset HEAD // 使用 git reset HEAD -- 文件名称
git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存。
5. 版本分支
1) 创建分支
git checkout -b 分支名称 创建分支 并切换到该分支之下
or
git brank 分支名称
git checkout 分支名称
git push origin 分支名。# 提交分支到远程仓库
2)删除分支
git branch -d 分支名称
git branch -D 分支名称 # 强制删除
git push origin --delete 分支名。# 删除远程分支
3)查看分支
git branch # 查看当前分支
git branch -a # 查看所有分支
6.忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个名为 .gitignore
的文件,列出要忽略的文件模式。来看一个实际的例子:
$ cat .gitignore *.[oa] *~
第一行告诉 Git 忽略所有以 .o
或 .a
结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。第二行告诉 Git 忽略所有以波浪符(~
)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。此外,你可能还需要忽略 log
,tmp
或者 pid
目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore
文件的习惯,以免将来误提交这类无用的文件。
文件 .gitignore
的格式规范如下:
- 所有空行或者以注释符号
#
开头的行都会被 Git 忽略。 - 可以使用标准的 glob 模式匹配。
- 匹配模式最后跟反斜杠(
/
)说明要忽略的是目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(
!
)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*
)匹配零个或多个任意字符;[abc]
匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?
)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9]
表示匹配所有 0 到 9 的数字)。
我们再看一个 .gitignore
文件的例子:
# 此为注释 – 将被 Git 忽略 # 忽略所有 .a 结尾的文件 *.a # 但 lib.a 除外 !lib.a # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO /TODO # 忽略 build/ 目录下的所有文件 build/ # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt doc/*.txt # 忽略 doc/ 目录下所有扩展名为 txt 的文件 doc/**/*.txt
6. 版本回退
1. 查看历史提交的版本 git log 格式化: git log --pretty=oneline 2.版本回退 根据ID回退到指定的版本 git reset --hard 7222c8f6be2d663982faa98dffe2647966b438b1 3. 推送本地到远程仓库 git push origin HEAD --force 4. 查看命令操作历史 git reflog
5. 查看远程代码库信息
git remote show origin
更多撤销相关操作: https://zhuanlan.zhihu.com/p/468307735