[转] 00.Git学习笔记
前言:用了比较长时间的github了,一直都不能把git理清楚,于是决定整理一下git的学习笔记,供自己梳理和回顾。
说明:这里思路是B站up狂神的git教学
版本控制
版本控制 版本迭代的版本管理器(Revision control)
尤其在多人开发中,使用版本控制尤为重要
主流的版本控制器有:
-
Git
-
SVN (subversion)
-
CVS (Concurrent Version System)
-
VSS (Micorosoft Visual SourceSafe)
-
TFS (Team Foudation Server)
-
Visual Studio Online
现在影响力最大也是使用最广泛的是Git和SVN
版本控制分类
-
本地版本控制
记录文件每次更新,可以对每个版本做一个快照,或者是记录补丁文件,适用于个人,如RCS。
![本地版本控制]()
-
集中版本控制
所有版本数据都保存在服务器上,协同开发者从服务器上同步更新或者上传自己的修改。
![集中版本控制]()
所有的版本数据保存在服务器上,用户本地只有自己的以前所同步的版本,如果不联网,用户看不到历史版本,也午饭切换版本验证问题,或者不同分支工作。而且,所有有数据都保存在单一服务器上,一旦服务器损坏就会丢失所有数据,需要定期备份。代表有:SVN CVS VSS
-
分布式版本控制
所有版本星信息全部同步到本地的每一个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需要在连网时push到相应的服务器或者其他用户那里。由于每一个用户保存的都是所有的版本数据,只要有一个用户设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
![分布式版本控制]()
Git和SVN的区别
SVN是集中式版本控制系统,版本库集中放在中央服务器的,而工作的时候,用自己电脑首先要从重要服务器得到最新版本,然后工作,完成工作后需要推送到中央服务器。集中实版本控制系统必须联网才能工作,对网络带宽要求较高
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网,因为版本都在自己电脑上。协同方式:你在电脑上修改了文件A,其他人也修改了文件A,你们俩只需要把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到。
Git是目前世界上最先进的分布式版本控制系统。
Git的诞生
GIt是Linux社区 (特别是Linux的缔造者Linus Torvalds) 基于使用BitKeeper时的经验教训,开发出的自己的版本系统。大约花了两周左右,也就是后来的Git。
Git是免费的、开源的、最初Git是为辅助Linux内核开发的,来代替BitKeeper。
Git环境配置
Git下载
打开官网
下载过慢就是用镜像下载
Git卸载
直接反安装即可、清理环境变量
Git安装
无脑下一步安装即可。
启动Git
安装成功后开始菜单会有Git项,菜单下有3个程序:任意文件夹下右键也可以看到对应的程序

Git Bash: Unix与Linux风格的命令行,使用最多,推荐最多
Git CMD: Windows风格的命令行
GIt GUI: 图形界面的GIt,不建议初学者使用,尽量先熟悉常用的命令
基本的Linux命令
-
cd 改变目录
-
cd .. 回退到上一个目录,直接cd进入默认目录
-
pwd 显示当前目录路径
-
ls(ll) 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更加详细
-
touch 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
-
rm 删除一个文件,rm index.js 就会把index.js删除掉
-
mkdir 新建一个目录,就是新建一个文件夹
-
rm -r 删除一个文件夹,rm -r src 删除src目录
切勿随意在Linux系统中使用rm -rf / ,会从根目录全部递归删除,那么会删除电脑中全部文件。
-
mv 移动文件,mv index.html src index.html 是我们要移动的文件,src是目标文件夹,这么写必须在同一目录下。
-
reset 重新初始化终端/清屏
-
clear 清屏
-
history 查看命令历史
-
help 帮助
-
exit 退出
-
#表示注释
Git配置
查看配置 git config -l

查看不同级别的配置文件 (都保存在本地) :
# 查看系统config
git config --system --list
# 查看当前用户(global)配置
git config --global --list
Git相关的配置文件:
-
Git\etc\gitconfig : Git 安装目录下的gitconfig --system 系统级
-
C:\UsersAdminstrator\ .gitconfig 只适用于当前登录用户配置 --global 全局
这里可以直接编辑配置文件,通过命令设置后会响应到这里
配置用户名与邮箱 (用户标识,必要)
当你安装git后首先要设置你的用户名和e-mail地址。这非常重要,每次git提交都会使用该信息。它会被永远嵌入到你的提交中:
git config --global user.name "lihengxu" # 名称
git config --global user.email 15882320389@163.com # 邮箱
只需要设置一次,只要传递了--global选项,Git将总会使用该信息来处理你在系统中的一切处理。如果你希望在一个特定的项目中使用不同的名称或email地址,你可以在该项目运行该命令而不要--global选项。总之--global为全局配置,不加为某一个项目的特定配置。

Git基本理论 (核心)
工作区域
Git本地有三个工作区域:
-
工作目录(Working Direcitory)
-
暂存区(Stage/Index)
-
资源区(Repository 或 GIt Directory)
如果加上远程的
-
Git仓库(Remote Directory)
就可以分为4个工作区域,转换关系如下:

-
Workspace: 工作区,就是平时你存放项目代码的地方
-
Index/Stage: 暂存区,用于平时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。
-
Repository:仓库区(或者本地仓库), 就是安全存放数据的位置,这里面有你提交的所有版本数据。其中HEAD指向最新放入仓库的版本。
-
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。
本地三个区域确切的说应该是git仓库中HEAD指向的版本:

-
Directory:使用GIt管理的目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
-
WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间
-
.git:存放管理信息的目录,初始化仓库的时候自动创建。
-
Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
-
Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
-
Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
工作流程
git的工作流程一般是这样的:
-
在工作目录中添加、修改文件;
-
将需要进行版本管理的文件放入暂存区域;
-
将暂存区域的文件提交到git仓库。
因此,git管理文件有三种状态:已修改(modified)、已暂存(staged)、已提交(committed)

Git项目搭建
创建工程目录与常用指令
工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你的项目的目录,也可以是一个空目录,建议不要有中文,日常使用一下图中6个命令:

本地仓库搭建
创建本地仓库有两种方法:一种是创建一个全新仓库,另一种是克隆远程仓库。
-
创建全新仓库,需要用GIT管理的项目的根目录执行:
# 当前目录中新建一个Git代码库
$ git init -
执行后可以看到,仅仅在项目中多出了一个.git目录,关于版本等的所有信息都在这个目录里面。
克隆远程仓库
-
另一种方式是克隆远程目录,也就是将远程服务器上的仓库完全镜像一份到本地。
# 克隆一个项目和它整个历史代码(版本信息)
$ git clone https://github.com/LihengXu/WPS_Apolloscape.git -
去gitee或者github上克隆一个测试
Git文件操作
文件4种状态
版本控制就是对文件的版本控制,要对文件进行修改,提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在不想提交的文件,或者要提交的文件没有提交上。
-
Untracked:未跟踪,此文件在文件夹种,并没有加入到git库,不参与版本控制,通过
git add状态变为staged -
Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中的完全一致。这种类型的文件有两种去处,如果它被修改,而变为
Modified,如果使用git rm移出版本库,则成为untracked文件 -
Modified:文件已修改,仅仅是修改,并没有进行其他的操作。这个文件也有两个去处,通过
git add可以进入暂存staged状态,使用git checkout则丢弃修改,返回到Unmodify状态,这个git checkout即从库中取出文件,覆盖当前修改。 -
Staged:暂存状态。执行
git commit则将修改同步到库中,这是库中文件和本地文件右边为一致,文件为Unmodify状态。执行git reset HEAD filename取消暂存,文件状态为Modified。
查看文件状态
上面说文件有4种状态,通过如下命令可以查看文件的状态:
# 查看指定文件状态
git status [filename]
# 查看所有文件状态
git status
# 添加所有文件到暂存区
git add .
# 提交暂存区中内容到本地仓库,-m 提交信息
git commit -m
忽略文件
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等
在主目录下面建立一个".gitignore"文件,此文件有如下规则:
-
忽略文件中的空行或者以井号(#)开始的行将会被忽略。
-
可以使用Linux通配符。例如:星号(*)代表任意多字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
-
如果名称的最前面有一个感叹号(!),表示例外规则,将不会忽略。
-
如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
-
如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)
# 为注释
*.txt # 忽略所有.txt结尾的文件,这样的话上传就不会被选中。
!lib.txt # 但lib.txt除外
/temp # 仅忽略根目录下的TODO文件,不包括其他目录temp
build/ # 忽略build/目录下的所有文件
doc/*.txt # 会忽略doc/notes.txt但不包括doc/server/arch.txt
# 通常前后端项目都需要的.gitignore的配置
*.class
*.log
*.lock
# Package Files #
*.jar
*.war
*.ear
target/
# idea
.idea/
*.iml
*velocity.log*
### STS ###
.apt_generated
.factorypath
.springBeans
### IntelliJ IDEA###
*.iml
*.ipr
*.iws
.idea
.classpath
.project
.settings/
bin/
*.log
tmp/
#rebel
*rebel.xml*
使用码云gitee
国内一般使用gitee,而通常全球范围内大多都是用github,两者使用几乎一致,有些公司会自己搭建gitlab服务器
-
注册登录码云,完善个人信息,点击自己头像选设置
-
设置本机绑定SSH公钥,实现免密码登录
# 进入C:\Users\Administrator\.ssh目录
# 生成公钥,-t rsa是选择加密方式
ssh-keygen -t rsa![公钥生成结果]()
-
将公钥信息public key (打开上面的
.pub文件,这就是公钥)添加到码云账户中即可![添加公钥处]()
![添加成功后]()
-
使用码云创建自己的仓库
新建仓库的位置
![新建仓库]()
若公开的话有一个许可证选项:
开源是否可以随意转载,开源但是不能商用,等等各种限制协议。
![新建仓库2]()
-
最后克隆至本地即可
git clone https://gitee.com/lihengxu/gitstudy.git
IDEA中集成Git
(和Pycharm基本相同)
-
新建项目,绑定git
-
将远程的git文件目录直接拷贝到项目中即可,或者直接创建项目到git文件目录下
-
-
修改文件,使用IDEA操作git
-
添加到暂存区:命令行
git add .;或者手动鼠标右键点文件,选GIt然后点Add -
commit提交:界面右上角有一个commit选项,点击后选择,并输入一下message即可
-
push到远程仓库:直接在命令行中输入
git push即可
-
-
提交测试
以上全部都不涉及分支,全是单人操作
Git分支
分支类似平行宇宙的概念,适用于多人协同开发
当存在多个分支,我们进行分支合并时,可能会有冲突产生

git分支中常见命令:
# 列出所有本地分支 git branch # 列出所偶远程分支 git branch -r # 新建一个分支,但依然停留在当前分支 git branch [branch -name] # 切换到该分支 git checkout [branch] # 新建一个分支,并切换到该分支 git checkout -b [branch] # 重命名分支 git branch -m [branch -oldname] [branch -newname] # 合并指定分支到当前分支 $ git merge [branch] # 中止这一次提交的合并(当遇到冲突时) $ git merge --abort # 将分支变基(Rebase)到master # 先切换到分支,再完成变基 $ git checkout [branch] $ git rebase master # 删除分支 $ git branch -d [branch -name] # 删除远程分支 $ git push origin --delete [branch -name] $ git branch -dr [remote/branch]
想要形象的快速理解分支的概念,推荐一款图形化客户端
建议使用github账号关联登录,这里推荐
注意主分支master应该非常稳定,只有分支代码稳定之后才能合并到主分支上。
总结
-
Git其实还是比较简单的,很多命令其实只要多用就能熟悉,尤其时分支的操作,这部分用图形界面多使用就能理解得更深刻
-









浙公网安备 33010602011771号