文章目录
- 一、简介
- 二、工作模式
- 1 集中式(CVS、SVN)
- 2 分布式Git
- 三、Git
- 1 工作模式
- 2 git工作流程
- 3 工作区和版本库
- 4 注意事项
- 5 基本操作
- 5.1 创建本地版本库
- 5.2 初始化本地版本库
- 5.3 .git目录的作用
- 5.4 创建用户
- 5.5 其他操作
- 6 git分支
- 7 常见警告
- 8 免密登录
- 9 远程库使用
- 10 标签
一、简介
二、工作模式
1 集中式(CVS、SVN)
- 为了让
不同系统
上的开发者能够协同工作。有一个单一的集中管理
的服务器,保存所有的修订版本
。而协同工作
的人们都得通过客户端连接到这台服务器,获取最新的文件或者提交更新;
存在的问题:
- 服务器出现问题,客户机无法更新到最新版本;
- 需要网络环境,单机无法实现版本控制;
- 客户机无法直接进行联系;
2 分布式Git
- 每台客户机都有
独立
的版本控制功能, 多台客户机相连即可文件共享
及版本管理
;
优点:
- 无需网络环境也可进行
版本控制
,在网络下可实现协同工作
;
三、Git
1 工作模式
- 集中式工作模式:便于客户机协同工作,设置一个
中央版本库服务器
,让索引客户机都从该主机更新版本,提交最新版本; - 开源社区工作模式:对于不同的客户机对中央版本库具有不同的
操作权限
,有利于维护开源软件的安全性;
2 git工作流程
- 初始化:初始化一个本地版本库,每个版本库仅需要
执行一次
即可; - 克隆:将中央版本库内容克隆到本地版本库,每个客户机仅需要
执行一次
; - 添加:添加指定文件到版本控制管理(只是添加到
暂存区
); - 提交:将修改操作操作到本地版本库(将暂存区的内容提交到
本地版本库
); - 推送:将本地版本库中的修改内容推送到
中央版本库
,客户机需要在一阶段性工作完成之后或在某些时间点将修改过的内容备份到中央版本库,方便他人更新; - 拉取:将中央版本库中变化的内容拉取本地版本库,客户机需要不时的更新才可获取最新内容;
3 工作区和版本库
git存在工作区
和版本库
,版本库有暂存区
和分支区
;
工作区:存放用户可编辑的文件本身;
暂存区:存放文件的快照;
分支区:可包含很多分支,每个分支记录当前工作区中文件的状态快照;
4 注意事项
- 版本控制只能控制
文本文件
,对二进制文件
无法控制; - 编码建议使用
UTF-8
;
5 基本操作
5.1 创建本地版本库
- 一个本地版本库对应一个项目,即一个目录,里面所有文件都被git管理;
5.2 初始化本地版本库
- 进入本地版本库目录;
git init
;
5.3 .git目录的作用
- 包含当前版本库正常工作需要的所有内容:
暂存区文件
、版本记录文件
、配置文件
等;
5.4 创建用户
- 每台客户机对版本库的所有提交操作都需要注明操作者的身份,所有需要创建用户:用户名和email;
三种不同创建方式,产生三种不同作用域的用户,信息会写到三个不同配置文件中:
- 系统用户:当前主机系统所有用户均可使用的git用户;
- 全局用户:当前主机系统的当前登录用户可以使用git用户;
- 本地库用户:只能对当前的本地版本库进行提交的git用户;
- 在多种用户下,会默认以小范围用户操作git;
系统用户
- 可在任意目录下运行创建命令;
git config --system user.name "xxx"
;git config --system user.email "xxx.com"
;- 查看
git config --system --list
;
全局用户
- 该命令可在任意目录下运行;
git config --global user.name "xxx"
;git config --global user.email "xxx.com"
;
本地库用户
- 只能在当前本地库目录下运行;
git config user.name "xxx"
;git config user.email "xxx.com"
;
5.5 其他操作
查看状态:git status
;
添加文件到暂存区:
- 添加指定文件:
git add file
; - 添加多个文件:
git add file1 file2...
;【可使用通配符】
提交:从暂存区永久写入本地仓库:git commit -m "msg"
;
忽略文件:只需要在工作区创建一个.gitignore
,将要忽略的文件名写入,并将.gitignore
提交到本地版本库即可;
查看区别:
- 比较工作区与暂存区:
git diff file
; - 比较暂存区与本地版本库:
git diff --cached file
;
翻页与退出:git log
信息太多;
- 回车:下一行;
- 空格:下一页;
- q:退出git log;
查看历史版本信息:id是通过IP、版本库、提交者、提交时间计算的值、作者信息、时间、空行、提交的信息
- 查看历史版本:
git log
; - 查看简单的日志:
git log --pretty=online
; - 简介id方式显示:
git log --pretty=online -abbrev-commit
; - 只能查看历史版本到当前HEAD的信息;
查看可引用历史版本:避免版本回退出现问题;
- 能查看所有历史版本信息:
git reflog
;
HEAD指针:git会默认创建主分支,而HEAD指向当前刚刚提交的版本时间节点;
^
:表示当前版本的前一个版本,以数量计算;HEAD^
~num
:表示当前版本之前的第几个版本;
撤销修改:
- 工作区修改,未添加到暂存区:
git checkout -- file
- 修改已添加到暂存区,为提交到本地版本库:
git reset HEAD file
- 提交到了本地版本库,无法撤销,但可回退版本:
git reset
;git reset --soft HEAD^
:回退到当前版本的前一个版本,但仅修改分支中的HEAD指针的位置,不会改变工作区与暂存区中的文件的版本,状态变为未提交的状态;git reset --mixed id
:回退到指定版本,修改了分支中HEAD指针的位置并将暂存区中数据也回退到指定版本,但工作区不变;git reset --hard id
:回退到指定版本,修改分支中HEAD指针的位置并回退了工作区、暂存区、本地库;
删除文件:需要明确文件的状态;
- 若为被管理:可直接删除;
- 仅删除暂存区中指定文件:
git rm --cached
; - 完全删除:
git rm
,三个区都删除;
查看暂存区列表:git ls-files
;
查看本地库文件列表:git ls-files --with-tree=HEAD
;即主分支上当前HEAD指针所指向的时间点的文件列表,HEAD^即上一版本;
恢复被删除文件:
git reset HEAD 文件名
恢复在暂存区中的文件;
6 git分支
- git主干:上每一个节点就是一个版本,即一次commit提交,且可以有多个指针(分支);
- git分支:一个指针的移动轨迹即为一个分支,分支可任意切换,切换后均可进行各自的提交;;
- HEAD:当前分支当前最新版本,分支的切换即修改HEAD指针;
分支合并
- 将dev分支的工作合并到主分支上;即将master指针指向dev指针指向的节点,再将HEAD指针指向master指针指向的节点即可,即修改两个指针的指向;
合并后的删除
- 合并后dev分支的文件版本低于master分支上该文件的版本,合并后的dev即无用,故一般将其删除;
创建并切换分支:git checkout -b 分支名称
;
- 创建分支:
git branch 分支名
; - 切换分支:
git checkout 分支名
;
查看系统的分支:git branch
;
删除分支:git branch -d 分支名
,需要切换到其他分支才能删除;
合并分支:git merge 分支名
;
- 若将B合并到A,需要将当前分支切换到A上,在合并
git merge B
;
分支合并冲突
- git:当不同分支对同一个文件进修改后进行合并就会产生冲突;
- svn:只有不同分支修改的是同一文件同一行同一列才会冲突;
- 当失败是,会给出失败的状态,可通过查看文件查看冲突内容分割线(
====
),合并的内容(<<<<<<<<< >>>>>>>>
); - 手动修改内容,在提交即可;
- 【注意】:master中为合并后的版本,而dev为合并前的版本,一般会将其删除;
查看合并记录
git log --graph
可看出合并冲突;
7 常见警告
LF被CRLF替换警告:LF是Linux下换行符,CRLF是window下换行符;
8 免密登录
简介
- Git主机的通信采用SSH协议;该协议包含公钥和私钥;
- 公钥私钥是一对,使用公钥加密,只能使用私钥进行解密;
生成步骤
- Master生成密钥,保存在本地;
- 在将Master公钥及用户名密码发生给Slave,并将公钥用户信息保存到本地即可;
验证
- Master向Slave发生连接请求,包含Master用户信息;
- Slave从本地文件中查找是否存在连接中包含的用户信息,若不存在,则拒绝,则存在,则访问;
- Master将加密后的附页字符串使用私钥进行解密;
- Master将解密后的字符串发生给Slave;
- Slave将接收到的字符串与本地为加密的字符串进行比较,相同则可访问;
》》》》》》》》免密登录参考连链接《《《《《《《《
9 远程库使用
创建
git remote add origin git@github.com/xxxx # 为指定一个远程版本库命名一个本地名称(origin)
git push -u origin master # 推送master分支
# -u 指定默认的远程库
git push # 将本地版本库中当前分支推送到默认远程库
git push origin # 将本地版本库中当前分支推送到origin远程版本库
git push origin master # 将本地版本库中master分支推送到origin远程库
克隆到本地库
- 创建本地库存储目录:不需要创建项目目录;
- 复制远程库地址:
- 运行克隆命令:
pull到本地库
git pull origin master # 将远程库origin的master分支拉取到本地库与本库的master分支合并;
git pull origin master:dev # 将远程库origin的master分支拉取到本地并与本地dev的分支合并;
git pull # 从默认远程库拉取与本地库当前分支合并;
查看本地的远程库信息
git remote
:列举当前本地版本库可操作的远程版本库名称;-v
删除本地的远程库信息
git remove rm 远程库名称
10 标签
标签是与commit id绑定的名称,一旦绑定就不能修改;
定义
- 轻量标签:
git tag 标签名 commit-id
,若给历史版本指定标签,则要加ID; - 附注标签:
git tag -a 标签名 -m "附注说明" commit-id
查看
- 查看当前系统下的所有标签:
git tag
- 查看指定标签的详情:
git show 标签名称
修改
- 若需要修改代码则需要重新创建一个分支,修改后再合并到master分支;在将该分支删除,合并到mster分支后,仍需要删除原标签,在与新的commit-id绑定;
- 一旦标签定义完成后就不会与删除再绑定了,而是会再定义一个新的标签与新的commit-id绑定;
推送
git push origin 标签名 # 推送单个标签
git push origin-tags # 推送所有为推送的标签到远程库
删除
- 删除本地标签:
git tag -d 标签名
; - 删除远程标签:
git push origin :refs/tags/标签名
;