Git的安装与使用
Git的安装与使用
Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
官方教程 : https://git-scm.com/book/zh/v2
- 下载 - 官网下载 :Git https://git-scm.com/downloads (速度较慢)
- 淘宝下载 :Git for Windows https://npm.taobao.org/mirrors/git-for-windows/ (国内、速度快)
 
- 验证是否安装成功 - 1 - git --version - 显示版本号代表安装成功 - 或 - 资源管理器内单击鼠标右键选择 - Git Bash Here
Git 基本工作流程
主要涉及到四个关键点:
- 工作区:本地电脑存放项目文件的地方,比如learnGitProject文件夹;
- 暂存区(Index/Stage):在使用git管理项目文件的时候,其本地的项目文件会多出一个.git的文件夹,将这个.git文件夹称之为版本库。其中.git文件夹中包含了两个部分,一个是暂存区(Index或者Stage),顾名思义就是暂时存放文件的地方,通常使用add命令将工作区的文件添加到暂存区里;
- 本地仓库:.git文件夹里还包括git自动创建的master分支,并且将HEAD指针指向master分支。使用commit命令可以将暂存区中的文件添加到本地仓库中;
- 远程仓库:不是在本地仓库中,项目代码在远程git服务器上,比如项目放在github上,就是一个远程仓库,通常使用clone命令将远程仓库拷贝到本地仓库中,开发后推送到远程仓库中即可;- 工作目录 - 暂存区 - git 仓库 - 远程仓库 - 被Git管理的项目 - 临时存放被修改的文件 - 目录用于存放提交记录 - 远程代码仓库 - git init- git add- git commit- git push
Git命令
配置用户信息
第一次使用git需要配置用户信息
- 配置用户名: - 1 - git config --global user.name "你的用户名" 
- 配置用户邮箱: - 1 - git config --global user.email "你的邮箱" 
- 查询配置信息: - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11- 列出当前配置: 
 git config --list;
 列出repository配置:
 git config --local --list;
 列出全局配置:
 git config --global --list;
 列出系统配置:
 git config --system --list;
基本命令
git clone
克隆仓库:使用 git clone 从 远程仓库 中拷贝项目
| 1 | git clone [仓库地址] [本地目录] | 
git init
初始化仓库:在执行 git init 命令后,会在当前目录下生成一个 .git 目录(需要显示隐藏目录)
| 1 | git init [目录名] | 
git status
查询当前工作区所有文件的状态
| 1 | git status | 
git diff
显示工作区,暂存区,版本区之间的差别
| 1 | git diff : 尚未缓存的改动 | 
git add
提交文件到暂存区
| 1 | git add [文件名/文件列表] | 
git commit
将暂存区里的改动提交到本地的版本库
| 1 | git commit -m [提交信息] | 
- 将暂存区中的文件提交到本地仓库中,即打上新版本:git commit -m “提交信息”;
- 将所有已经使用git管理过的文件暂存后一并提交,跳过add到暂存区的过程:git commit -a -m “提交信息”;
- 提交文件时,发现漏掉几个文件,或者注释写错了,可以撤销上一次提交:git commit –amend;
git log
查看提交记录
| 1 | git log | 
git checkout
切换分支或恢复工作树文件
| 1 | git checkout [分支名] 切换到指定分区 | 
git reset
版本回退
| 1 | git reset --hard [提交编号] | 
git pull
拉取远程仓库代码
| 1 | git pull git@github.com:用户名/仓库名.git | 
git push
提交本地仓库到远程仓库
| 1 | git push | 
git mv
用于移动或重命名一个文件、目录、软连接。
| 1 | git mv [文件名] [新文件名] | 
分支管理
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。
git branch
查看分支
| 1 | git branch | 
git branch 分支名称
创建分支
| 1 | git branch 分支名称 | 
git checkout
切换指定分支
| 1 | git checkout 分支名称 | 
git merge
将当前分支与指定分支进行合并
| 1 | git merge 分支名 | 
git branch -d
删除分支(分支合并后才允许被删除)
| 1 | git branch -d 分支名称 | 
总结
- 创建分支:git branch,如git branch testing;
- 从当前所处的分支切换到其他分支:git checkout,如git checkout testing;
- 新建并切换到新建分支上:git checkout -b;
- 删除分支:git branch -d;
- 将当前分支与指定分支进行合并:git merge;
- 显示本地仓库的所有分支:git branch;
- 查看各个分支最后一个提交对象的信息:git branch -v;
- 查看哪些分支已经合并到当前分支:git branch --merged;
- 查看当前哪些分支还没有合并到当前分支:git branch --no-merged;
- 把远程分支合并到当前分支:git merge /,如git merge origin/serverfix;如果是单线的历史分支不存在任何需要解决的分歧,只是简单的将HEAD指针前移,所以这种合并过程可以称为快进(Fast forward),而如果是历史分支是分叉的,会以当前分叉的两个分支作为两个祖先,创建新的提交对象;如果在合并分支时,遇到合并冲突需要人工解决后,再才能提交;
- 在远程分支的基础上创建新的本地分支:git checkout -b /,如git checkout -b serverfix origin/serverfix;
- 从远程分支checkout出来的本地分支,称之为跟踪分支。在跟踪分支上向远程分支上推送内容:git push。该命令会自动判断应该向远程仓库中的哪个分支推送数据;在跟踪分支上合并远程分支:git pull;
- 将一个分支里提交的改变移到基底分支上重放一遍:git rebase,如git rebase master server,将特性分支server提交的改变在基底分支master上重演一遍;使用rebase操作最大的好处是像在单个分支上操作的,提交的修改历史也是一根线;如果想把基于一个特性分支上的另一个特性分支变基到其他分支上,可以使用--onto操作:git rebase --onto,如git rebase --onto master server client;使用rebase操作应该遵循的原则是:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行rebase操作;
Git标签
Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。
git tag
列出现在所有的标签
| 1 | git tag | 
其他
- 使用特定的搜索模式列出符合条件的标签,例如只对1.4.2系列的版本感兴趣:git tag -l "v1.4.2.*";
- 创建一个含附注类型的标签,需要加-a参数,如git tag -a v1.4 -m "my version 1.4";
- 使用git show命令查看相应标签的版本信息,并连同显示打标签时的提交对象:git show v1.4;
- 如果有自己的私钥,可以使用GPG来签署标签,只需要在命令中使用-s参数:git tag -s v1.5 -m "my signed 1.5 tag";
- 验证已签署的标签:git tag -v ,如git tag -v v1.5;
- 创建一个轻量级标签的话,就直接使用git tag命令即可,连-a,-s以及-m选项都不需要,直接给出标签名字即可,如git tag v1.5;
- 将标签推送到远程仓库中:git push origin ,如git push origin v1.5;
- 将本地所有的标签全部推送到远程仓库中:git push origin --tags;
Github远程仓库的使用
基于HTTPS协议
- 通过 - git clone https://github.com/Github用户名/仓库名.git
- 修改 - .git下的- config的内容- 1 
 2
 3
 4
 5
 6
 7- [remote "origin"] 
 url = https://github.com/Github用户名/仓库名.git
 修改为
 [remote "origin"]
 url = https://用户名:密码@github.com/Github用户名/仓库名.git
- git remote add origin https://github.com/Github用户名/仓库名.git要上传的远程仓库
- git push将本地仓库提交到远程仓库
基于SSH协议
- 生成公私钥 - 1 - ssh-keygen -t rsa -C "example@example.com" - 然后找到生成的秘钥:位置在 C:/Users/你电脑的用户名/.ssh 
 用记事本打开- id_rsa.pub复制里面的内容- 进入 https://github.com/settings/keys 点击 - New SSH Key把之前复制的内容粘贴到这里就可以了。
- git remote add origin git@github.com:用户名/仓库名.git要上传的远程仓库
- git push将本地仓库提交到远程仓库
解决冲突
多人开发同一个项目时,如果两个人修改了同一个文件同一个地方
解决方法:
- 手动解决冲突
- 写代码之前要先git pull 拉去最新代码
忽略文件
在git根目录下创建.gitignore
| 1 | # 此为注释 – 将被 Git 忽略 | 
同时提交多个仓库
第一种方式
- 在本地项目文件夹执行 - git init之后- 先添加第一个仓库 - 1 - git remote add origin https://gitee.com/zykj/test.git - 再添加第二个仓库 - 1 - git remote set-url --add origin https://github.com/zykj/test.git - 如果还有其他,则可以像添加第二个一样继续添加其他仓库。 
- 然后使用下面命令提交: - 1 - git push origin --all - 打开 - .git/config,可以看到这样的配置:- 1 
 2
 3
 4- [remote "origin"] 
 url = https://gitee.com/zykj/test.git
 fetch = +refs/heads/*:refs/remotes/origin/*
 url = https://github.com/zykj/test.git- 刚才的命令其实就是添加了这些配置。如果不想用命令行,可以直接编辑该文件,添加对应的url即可。 
第二种方式
- 在本地项目文件夹执行 - git init之后- 先添加第一个仓库 - 1 - git remote add gitee https://gitee.com/zykj/test.git - 再添加第二个仓库 - 1 - git remote add github https://github.com/zykj/test.git - 如果还有其他,则可以像添加第二个一样继续添加其他仓库。 - 在这里为了方便区分,我把github仓库地址代号(上面代码add后面的单词)命名为 - github,码云仓库地址代号命名为- gitee
- 在 - git bash中输入- git remote -v可以查看本地仓库现在连接了那个远程仓库。
- 使用 - git push仓库代号 分支提交代码到远程仓库- 刚才我链接的两个远程仓库,推得时候就要这样写了: - 1 
 2- git push github master 
 git push gitee master- 打开 - .git/config,此时配置文件如下所示- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- [remote "github"] 
 url = git@github.com:zykj/test.git
 fetch = +refs/heads/*:refs/remotes/github/*
 [remote "gitee"]
 url = git@gitee.com:zykj/test.git
 fetch = +refs/heads/*:refs/remotes/gitee/*
 [branch "master"]
 remote = gitee
 remote = github
 merge = refs/heads/master- 和第一种方法一样,如果不想用命令行,可以直接编辑该文件,添加对应的 - remote及- url即可。
参考链接:





