1. Git简介
Git是一个分布式的版本控制系统,与集中式的版本控制系统不同的是,每个人都工作在通过克隆建立的本地版本库中。也就是说每个人都拥有一个完整的版本库,查看提交日志、提交、创建里程碑和分支、合并分支、回退等所有操作都直接在本地完成而不需要网络连接。
- 分布式和集中式版本控制系统的比较
分布式版本控制系统(DVCS)用点对点网络的作法来处理版本控制,而集中式版本控制系统则是用主从式架构的作法。分布式版本控制系统同步各软件存储库的方式是用点对点网络的方式发送Patch。在代码库中没有单一的中央版本,每一个用户都有工作复本以及完整的变更历史。
和集中式版本控制系统相比,分布式版本控制系统的优点如下:
- 用户在没有网络的情形下,也可以访问其电脑中的软件存储库。
- DVCS下的常见工作(例如上传、看修改履历、回退变更)不需要和中央服务器通信即可达成,因此速度很快[5]。DVCS下,只有要和其他人分享变更内容时才需要通信。
- 允许个人作业,用户可以将不希望公开的早期修改(甚至是草稿)上传[来源请求]
- 工作复本的作用类似远程备份,因此不会依赖单一的实体机器,带来单点失效的风险[5]
- 允许不同的开发模型,例如用分支或Commander/Lieutenant模型[来源请求]。
- 在自由及开放源代码软件项目中,若有管理上的冲突或是设计上的不一定,很容易可以从一项目中分叉出新的项目。
和集中式版本控制系统相比,分布式版本控制系统的缺点如下:
- 一开始复制软件存储库会比较慢,因为默认设值会复制所有的分支以及版本历史。
- 缺乏了集中式版本控制系统中有的锁定机能,针对一些无法用版本控制系统合并的二进制文件(例如图形档),或是太复杂的二进制或XML文件(例如office文件、PowerBI档、SQL Server Data Tools BI软件等)[来源请求]
- 每一个用户都需要备份所有的资料、分支及版本历史,因此需要额外的存储空间[6]
- 各软件存储库内容不一定同步。
2. Git安装
-
Linux安装
以Ubuntu系统为例,使用下面的命令可以查看该系统是否安装了Git。
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
如果如上所示,则说明没有安装Git,根据提示使用下面的命令安装Git。
$ sudo apt-get install git
- Windows上安装
在Git官网下载Windows版本的安装软件。根据你的电脑系统选择32位或者是64位。下载完成之后。双击运行,根据引导进行安装。
安装完成之后,你可以在开始菜单中找到“Git”->"Git Bash",打开“Git Bash”之后如果出现一个类似命令行窗口的东西,则说明安装成功。如下图所示:
-
安装后的配置
安装完成之后可以使用下面的命令查看当前Git的版本:
$ git version
git version 1.9.1
有时候你在使用Git的过程中可能会出现warning: LF will be replaced by CRLF
。这是因为Windows中的换行符为 CRLF
, 而在linux下的换行符为LF
。所以有时候你在执行git add .
时,系统会提示:LF
将被转换成 CRLF
。使用下面的命令可以禁用自动转换。
$ git config --global core.autocrlf false
3. 创建github账户
注册github,创建个人账户
4. Git用法
-
创建版本库
创建版本库非常的简单,选择一个合适的地方,使用下面的命令创建版本库。
$ mkdir TestGit # 创建文件夹
$ cd TestGit # 进入文件夹
$ git init # 初始化成Git版本库
Initialized empty Git repository in /home/Repositories/TestGit/.git/
至此一个空的Git仓库就创建好了,在这个目录下你会看到一个.git
目录。这个目录就是Git用来跟踪管理版本库的。所以千万不要修改删除这个文件夹中的文件。因为这是隐藏目录,所以如果你看不见可以使用命令ls -a
来查看。
-
设置签名:
形式:用户名:haha
Email地址:74828haha@haha.com
(区分不同开发人员身份)
辨析:这里设置的签名和登录远程库(代码托管中心)的账号和密码没有任何关系。
命令:
#项目级别/仓库级别:仅在当前本地库范围内有效。
git config user.name haha
git config user.email 74828haha@haha.com
#(信息保存位置:./.git/config 文件)
#系统用户级别:登录当前操作系统的用户范围
git config --global user.name haha
git config --global user.email 74828haha@haha.com
#(信息保存位置:~/.gitconfig 文件)
优先级:
就近原则:项目级别优先于系统用户级别,不允许二者都没有。
-
Git基本命令
当创建好了一个版本库之后,我们就可以在版本库中进行版本控制了。
Git的一些基本命令:
git add # 将工作区的修改提交到暂存区
git commit # 将暂存区的修改提交到当前分支
git status # 查看当前仓库的状态
git diff # 查看修改
git log # 查看提交历史
git reset # 回退到某一个版本
git reflog # 查看历史命令,类似与Linux中的history
-
工作区和暂存区
上面说到了工作区和暂存区的概念,想要用好Git,那么了解Git中的工作区、暂存区之间的关系是很重要的。
说明:
workspace:工作区
staging area:暂存区/缓存区
local repository:版本库或本地仓库
remote repository:远程仓库
工作区:在你的电脑中可以看见的Git仓库的那个目录,如之前我创建的TestGit
目录。
基本操作:
git status (状态查看) (查看工作区、暂存区状态)
git add [file name] (添加 新建/修改)(工作区->暂存区)
git commit -m "commit message" [file name] (提交 新建/修改) (暂存区->本地库)
所以我们在提交的时候一般都是这样:
$ git add . # 将工作区中所有修改提交到暂存区,"."点的含义就是所有修改
$ git commit -m "first commit" # 将暂存区的所有修改提交到本地库,-m参数是命名当前的“提交”
-
查看历史记录
git log
多屏显示控制方式:
空格向下翻页
b向上翻页
q退出
git log --pretty=oneline
git log --oneline
git reflog
Head@{x}(移动到当前版本需要多少步) -
版本前进后退
基于索引值操作
git reset --hard [局部索引值(局部hash值)]
使用^
符号:只能后退
git reset --hard HEAD^
注:一个^
符号表示后退一步,n个表示后退n步
使用~
符号:只能后退
git reset --hard HEAD~n
注:表示后退n步 -
reset命令的三个参数对比
--soft
参数
仅仅在本地库移动HEAD指针
--mixed
参数
在本地库移动HEAD指针
重置暂存区
--hard
参数
在本地库移动HEAD指针
重置暂存区
重置工作区 -
删除文件并找回
前提:删除前,文件存在时的状态提交到了本地库
操作:git reset --hard
[指针位置]
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用HEAD -
比较文件差异
git diff [文件名]
将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] [文件名]
将工作区中的文件和本地库历史记录比较
不带文件名则比较多个文件 -
分支管理
什么是分支?
在版本控制过程中,使用多条线同时推进多个任务。
分支的好处?
同时并行推进多个功能的开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支操作
git branch [分支名]
(创建分支)
git branch -v
(查看分支)
git checkout [分支名]
(切换分支)
合并分支
第一步:切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并分支名]
第二步:执行merge命令
git merge [有新内容分支名]
解决冲突
第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度
第三步:git add [文件名]
第四步:git commit -m "日志信息"
注意:此时commit后不能带文件名 -
代理设置
git config --global https.proxy 127.0.0.1:7890
(添加https代理)
git config --global http.proxy 127.0.0.1:7890
(添加http代理)
git config --global http.proxy
(查询动态http代理)
git config --global https.proxy
(查询动态https代理)
git config --global --unset https.proxy
(取消https代理)
git config --global --unset http.proxy
(取消http代理)
git配置文件在C:\Users\当前用户
里的.gitconfig
文件(隐藏) -
创建远程库地址别名
git remote -v
查看当前远程库地址别名
git remote add [别名] [远程url]
-
推送
git push [别名] [分支名]
-
克隆
git clone [远程url]
完整的把远程库下载到本地
创建origin远程地址别名
初始化本地库 -
拉取
pull=fetch+merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]
解决冲突
要点
如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先拉取。
拉取下来后如果进入冲突状态,则按照"分支冲突解决"操作解决即可。 -
跨团队协作
fork
本地修改,然后推送到远程
Pull Requests
Create Pull Request
……
-
SSH免密登录
进入当前用户的家目录
cd ~
删除.ssh
目录
rm -rvf .ssh
运行命令生成.ssh
密钥目录
ssh-keygen -t rsa -C agdjds@dyc.com(账号邮箱)
进入.ssh
目录查看文件列表
cd .ssh
ls -lF
查看id_rsa.pub
文件内容
cat id_rsa.pub
复制id_rsa.pub
文件内容,登录GitHub,点击用户头像->Settings->SSH and GPG
keys
New SSH Key
输入复制的密钥信息
回到Git bash 创建远程地址别名
git remote add origin_ssh url
推送文件进行测试