Git版本控制工具
第一章 版本控制工具简介
1.版本控制工具的发展历史经过: 原始人工维护状态,本地RCS,集中式如VCS、SVN和分布式如Git;
2.版本控制工具提供了协作开发的能力,借助它们我们可以回到任何时间的代码状态;
3.集中式版本控制工具,几乎所有的动作都需要服务器参与,并且数据安全性与服务器关系很大;
4.Git 是分布式版本控制工具,除了与服务器之前进行按需同步之外,所有的提交操作都不需要服务器。
第二章Git安装与配置
Git基本配置
- 配置个人身份:
首次的Git设定
git config --global user.name "Zhang San"
git config --global user.email zhangsan123@huawei.com
该配置信息会在Git仓库中提交的修改信息中体现,但和Git服务器认证使用的密码或者公钥密码无关(责任追踪、应用之间的用户关联、贡献度统计)
- 文本换行符配置:
假如你正在Windows上写程序,又或者你正在和其他人合作,他们在Windows上编程,而你却在其他系统上,在这些情况下,你可能会遇到行尾 结束符问题。 这是因为Windows使用回车和换行两个字符来结束一行,而Mac和Linux只使用换行一个字符。 虽然这是小问题,但它会极大地扰乱跨平台协作。
Git可以在你提交时自动地把行结束符CRLF转换成LF,而在签出代码时把LF转换成CRLF。用core.autocrlf来打开此项功能,如果是在Windows系统上,把它设置成true,这样当签出代码时,LF会被转换成CRLF:
git config --global core.autocrlf true
Linux或Mac系统使用LF作为行结束符,因此你不想Git在签出文件时进行自动的转换,当一个以CRLF为行结束符的文件不小心被引入时你肯定想进行修正,把core.autocrlf设置成input来告诉Git在提交时把CRLF转换成LF,签出时不转换
git config --global core,autocrlf input
这样会在Windows系统上的签出文件中保留CRLF,会在Mac和Linux系统上,包括仓库中保留LF.
如果你是Windows程序员,且正在开发仅运行在Windows上的项目,可以设置false取消此功能,把回车符记录在库中:
git config --global core.autocrlf
- 文本编码配置
- i18n.commitEncoding 选项: 用来让git commit log存储时,采用的编码,默认UTF-8.
- i18n.logOutputEncoding 选项:查看git log时,显示采用的编码,建议设置为UTF-8.
#中文编码支持
git config --global gui.encoding utf-8
git config --global i18n.commitencoding utf-8
git config --global
i18n.logoutputencoding utf-8
#显示路径中的中文:
git config --global core.quotepath false
- 与服务器的认证配置
常见的协议分为http/https协议认证和ssh协议认证
#设置口令缓存:
git config --global credential.helper store
#添加HTTPS证书信任:
git config http.sslverify false
ssh协议认证
SSH协议是一种非常常用的Git仓库访问协议使用公钥认证、无需输入密码,加密传输,操作便利又保证安全性
#生成公钥
ssh-keygen -t rsa -C zhangsan1123@huawei.com
添加公钥到代码平台 :
- 代码平台
- 进入“Profile Settings’
- 点击左侧栏的“SSH Keys’
- 点击“Add SSH Key”,将刚生成的公钥文件的内容,复制到“Public Key”栏,保存即可
第三章 Git基本命令
3.1 工程准备
git clone
远端服务器的某个工程前提条件:
- Git账号有访问、下载工程权限
- 获取该工程的Git仓库URL
#在本地目录下新建git项目仓库
git init [project name]
#克隆远端工程到本地磁盘
git clone [URL] 或者 git lfs clone [URL]
#git lfs clone是针对二进制文件的区别管理
3.2 新增/删除/移动文件
-
在提交修改文件之前,需要
git add
把文件添加到暂存区;如果该文件是新创建,尚未被git跟踪的,需要先执行git add
将该文件添加到暂存区,再执行提交如果文件已经被git追踪,即曾经提交过的。在早期版本的git中,需要git add再提交;在较新版本的git中不需要git add
即可提交 -
git rm
将指定文件彻底从当前分支的缓存区删除,因此它从当前分支的下一个提交快照中被删除.
如果一个文件被git rm
后进行了提交,那么它将脱离it跟踪,这个文件在之后的节点中不再受git工程的管理。执行git rm
后,该文件会在缓存区消失你也可以直接从硬盘上删除文件,然后对该文件执行git commit
,git会自动将删除的文件从索引中移除,效果一样 -
git mv
命令用于移动文件,也可以用于重命名文件例1:需要将文件codehunter_nginx.conf从当前目录移动到config目录下,可执行:
git mv codehunter nginx.conf config
例2:需要将文件codehunter_nginx.conf重命名为new_nginx.conf,可执行:
git mv config/codehunter nginx.conf config/new nginx.conf
3.3 查看工作区
git diff
用于比较项目中任意两个版本(分支)的差异,也可以用来比较当前的索引和上次提交间的差异。
git status
命令用于显示工作目录和暂存区的状态
使用此命令能看到修改的git文件是否已被暂存,新增的文件是否纳入了git版本库的管理。下例中的信息表明: modeules/_init,py已被修改并暂存,LICENSE已被修改但未暂存,README.md已被删除但未暂存,extend.txt已被新建但未跟踪。注意,请保证能理解git status
回显的每一行文字含义。
3.4 提交更改的文件到本地版本库
git commit
主要是将暂存区里的文件改动提交到本地的版本库
在此强调,提交这个动作是本地动作,是往本地的版本库中记录改动,不影响远端服务器。git commt
一般需要附带提交描述信息,所以常见用法是:
git commit file name -m “commit message'
如果要一次性提交所有在暂存区改动的文件到版本库,可以执行:
git commit -am "commit message'
3.5 查看日志
git log
用于查看提交历史,会按提交时间由近到远列出所有的历史提交日志,包含每个日志基本包含提交节点、作者信息、提交时间、提交说明等
3.6 推送到远端仓库
在使用git commit
命令将自己的修改从暂存区提交到本地版本库后,可以使用git push
将本地版本库的分支推送到远程服务器上对应的分支。
成功推动远端仓库后,其他开发人员可以获取到你新提交的内容
常用的推送命令格式:
git push origin branch_name
branch name决定了你的本地分支推送成功后,在远端服务器上的分支名,其他人据此可以获取该分支上的改动内容.
你的本地分支名可以与推送到远端的分支名不同:
git push origin branch_name:new_branch_name
### 3.7 分支管理
git fetch
的作用是,从远端服务器中获取某个分支的更新到本地仓库。注意,与git pull
不同,git fetch
在获取到更新后,并不会进行合并 (即下页中的git merge) 操作这样能留给用户一个操作空间,确认git fetch内容符合预期后,再决定是否手动合并节点。常用的获取远端分支更新命令格式:
git fetch origin remote branch:local branch
如果远程指定的分支与本地指定的分支相同,则可直接执行
git fetch origin remote branch
3.8 分支合并
- 方法一:
git merge
命令用于从指定的分支(节点)合并到当前分支的操作;
git会将指定的分支与当前分支进行比较,找出二者最近的一个共同节点base,之后将指定分支在base之后分离的节点合并到当前分支上。分支合并,实际上是分支间差异提交节点的合并。
git merge + branch_name
- 方法二:
git rebase
用于合并目标分支内容到当前分支
git rebase branch_name
背后实现机制差异很大,有各自的风险存在
3.9 撤销操作
- 方法一:
git checkout .
用于回退本地所有修改而未提交的文件内容
git checkout .
,这是条有风险的命令,因为它会取消本地工作区的修改(相对于暂存区),用暂存区的所有文件直接覆盖本地文件,达到回退内容的目的。但它不给用户任何确认机会,所以谨慎使用
如果仅仅想回退某个文件的未提交改动,可以使用下面命令来达到目的;
git checkout -filename
如果想将工具区回退 (检出)到某个提交版本,可以使用
git checkout commit_id.
- 方法二:
git reset + "commit_id"
用于撤销当前工作区的某些git add/commit
操作,将工作区内容回退到历史提交节点;
第四章 基本提交推送
4.1 克隆项目到本地
创建工程之后先拉取git Lab上面的project到本地
4.2 新建READ.md文件
创建一个READ.md文件查看其在当前分支下的状态:
显示Untracked files表示还没有跟踪,也就是没有进入git版本控制
4.3 加入并提交到版本库
git add READ.md //对工作区进行修改或新增,暂存区被更新 纳入版本管理中
git commit READ.md -m "first test" //提交暂存区的更新后的目录树到本地版本库中,并添加提交信息
- 查看提交的日志信息
git log
git log --name-status //查看commit文件是新增还是修改还是移除
图中M是modify然后A是add的意思
4.4 推送到远端
git push origin main //推送到远端服务器的main分支上面
"origin"指的是远端服务器的名称
第五章 本地分支上开发与日志查看
5.1 修改最近一次commit的信息
第一次提交commit后发现描述提交内容不够详细
git commit --amend //进入vim编辑模式
- vim模式下 i进入编辑模式,修改完后 esc + :wq(表示保存退出)回车
git commit --amend
会新生成一个节点来代替之前的commit
5.2 进入另一个分支开发
git checkout -b liurunda/test1 //新建分支并切到新分支
- 拉新分支之后把原分支历史提交节点和信息都继承过来了
5.3 在新分支上提交修改
- 查看详细的修改过程
git log --name-status
- 推送到远端
git push origin liurunda/test1
第六章 本地基本分子合并
### 6.1 查看本地分支/远端分支
git branch //查看本地分支
git branch -r //查看远端分支
git branch -a //查看所有分支
6.2 检视通过之后合并代码到主干
- 方法一:
git merge
git merge + "源分支(主干)" + "目的分支(默认本地分支)"
不会破坏历史节点,新生成一个merge提交节点在本地分支;
缺点:git log
日志会比较难看
- 方法二:
git rebase
会把主干上与本地分支有差异的节点合并到本地分支上,会破坏公共主干上的历史节点,所以原则上不能在版本公共节点上使用。
第七章 本地基本分支与节点更新
7.1 查看远端同名分支与本地的差异
git diff bugfix/cooperate origin/bugfix/cooperate
7.2 将远端主干分支更新到本地分支
git pull
和git fetch
+git merge
git pull = git fetch + git merge
git fetch //git fetch的作用是,从远端服务器中获取某个分支的更新到本地仓库。注意,与git pull不同,git fetch在获取到更新后,并不会进行合并 (即下页中的git merge) 操作这样能留给用户一个操作空间,确认git fetch内容符合预期后,再决定是否手动合并节点。常用的获取远端分支更新命令格式:
git merge //会把从主干获取到本地仓库的分支与自己当前工作区的分支进行合并
git pull
自动更新本地和远端的同名分支
git cherry-pick + "commoit_ID"
仅更新某一次commit的提交,其他的提交不care
第八章 本地分支合并过程中的冲突处理
本地两个分支两个同名文件合并内容不同出现COMFLICT
git status
查看目前的冲突详情,这里是c.txt两个分支都修改了但是不一致
vim c.txt //查看冲突
- 删除冲突部分内容 vim 中在esc后标准模式下 DD删除光标所在行
git add c.txt
git commit -am "resolve conflict"
下图为解冲突后的commit节点,核心关键在于多看看git status
提示内容来协助进一步解冲突的操作
第九章 本地撤销操作
9.1 本地工作区的回退
git reset --hard + "commit_ID" //工作区内容恢复到对应commit_ID对应那一次历史commit的节点
9.2 未提交文件在本地回退到之前版本
git checkout READ.md //还原工作区未提交文件
git checkout . //将所有本地修改但未提交文件回退到
- 查看最近做了那些操作
git reflog
第十章 如何在代码平台上添加SSH公钥
一般用SSH clone项目代码,HTTPs协议需要输入用户名和密码
生成 SSH 密钥对
如果您没有现有的 SSH 密钥对,请生成一个新的。
-
打开一个终端。
-
输入
ssh-keygen -t
,然后输入密钥类型和可选注释。此注释包含在创建的.pub
文件中。您可能希望在注释中使用电子邮件地址。例如,对于 ED25519:
ssh-keygen -t ed25519 -C "<comment>"
-
在shell中查看秘钥
cat ~/.ssh/id_rsa.pub
复制到GitLab里面对应位置即可