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用户名/仓库名.gitgit 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
2git 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
即可。
参考链接: