Git
学习内容来自 :
-
B站 : (遇见狂神说)https://space.bilibili.com/95256449
-
Git最新教程通俗易懂https://www.bilibili.com/video/BV1FE411P7B3
1. 版本控制
1.1 本地版本控制
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。
1.2 集中版本控制 SVN
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本;如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品 : SVN、CVS、VSS
1.3 分布式版本控制 GIT
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
每个人都拥有全部的代码!安全隐患!
不会因为服务器损坏或者网络问题,造成不能工作的情况!
1.4 Git和SVN的区别
SVN是集中式版本控制系统,版本库是集中放在*服务器的,而工作的时候,用的都是自己的电脑,所以首先要从*服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到*服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
Git是分布式版本控制系统,没有*服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的 : 比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
Git是目前世界上最先讲的分布式版本控制系统
2. 启动
-
Git Bash : Unix与Linux风格的命令行,使用最多,推荐最多
-
Git CMD : Windows风格的命令行
-
Git GUI : 图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
3. 基本命令
Git Bash : Linux命令
-
cd : 改变目录
-
cd .. : 回退到上一个目录,直接cd进入默认目表
-
pwd : 显示当前目录路径
-
ls(ll) : 都是列出当前目录中的所有文件
-
touch : 新建一个文件
-
rm : 删除一个文件
-
mkdir : 新建一个目录
-
rm -r : 删除一个文件夹
-
mv : 移动文件
-
reset : 重新初始化终端/清屏
-
clear : 清屏 | windows : cls
-
history : 查看命令历史
-
help : 帮助
-
exit : 退出
-
#: 表示注释
查看配置 : $ git config -l
系统配置 : $ git config --system --list
全局配置 : $ git config --global --list
Git相关的配置文件:
-
安装目录\etc\gitconfig : 系统配置文件地址
-
C:\Users\Administrator\ .gitconfig 只适用于当前登录用户的配置 , 全局配置
这里可以直接编辑配置文件,通过命令设置后会响应到这里。
设置用户名邮箱(必要) :
$ git config --global user.name "miku_moe"
$ git config --global user.email 1359403221@qq.com
4. 基本理论
工作区域
Git本地有三个工作区域︰工作目录(Working Directory )、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
Workspace : 工作区,就是你平时存放项目代码的地方
Index/Stage : 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository : 仓库区(本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote : 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
工作流程
git的工作流程一般是这样的︰
-
在工作目录中添加、修改文件
-
将需要进行版本管理的文件放入暂存区域 git add ...
-
将暂存区域的文件提交到git仓库 git commot
因此,git管理的文件有三种状态∶已修改( modified ) ,已暂存( staged ) ,已提交(committed)
5. 项目搭建
工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。
日常使用只要记住下图6个命令(尤其是下面三个) :
本地搭建仓库 : $ git init
克隆远程仓库到本地 : $ git clone [url]
6. 文件操作
文件的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
查看指定文件状态 : $ git status [filename]
查看所有文件状态 : $ git status
添加所有文件到暂存区 : $ git add .
将暂存区内容提交到本地仓库(-m 提交信息) : $ git commit -m "info"
忽略文件
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等
在主目录下建立 " gitignore " 文件,此文件有如下规则∶
-
忽略文件中的空行或以井号(#)开始的行将会被忽略
-
可以使用Linux通配符,如 : 星号( * )代表任意多个字符,问号( ? )代表一个字符,方括号( [abc] )代表可选字符范围,大括号( {string1,string2,…} )代表可选的字符串等
-
如果名称的最前面有一个感叹号( ! ),表示例外规则,将不被忽略
-
如果名称的最前面是一个路径分隔符( / ),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
-
如果名称的最后面是一个路径分隔符( / ),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.txt #忽略所有.txt结尾的文件
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略bui1d/目录下的所有文件
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*
7. 基本使用
设置本机绑定SSH公钥,实现免密码登录
进入 C:\Users\Administrator\ .ssh 目录 (如果没有此目录,这在上一级目录亦可)
生成公钥 $ ssh-keygen -t rsa " -t rsa 加密 "
将公钥添加至码云账户 ==> 使用码云创建一个仓库 ==> 在本地git克隆仓库连接
克隆仓库 $ git clone [url]
8. IDEA集成
新建项目 ==> 拷贝所有文件(注意.git文件夹为默认隐藏) ==> 刷新项目
修改文件,使用IDEA操作git
-
提交到暂存区(add)
-
commit提交
-
push到远程仓库
测试
#git分支
常用指令
$ git branch 列出所有本地分支
$ git branch -r 列出所有远程分支
$ git branch [branch -name] 新建一个分支,但依旧停留在当前分支
$ git checkout [branch] 切换分支
$ git checkout -b [branch] 新建一个分支,并切换至该分支
$ git branch -d [branch-name] 删除分支
$ git push origin --delete [branch-name] 删除远程分支
$ git branch -dr [remote/branch] 删除远程分支
如多个分支并行执行,会导致代码不冲突,也就是存在多个版本
如果冲突 , 协商
如果同一个文件在合并分支时都被修改了则会引起冲突 : 解决的办法是我们可以修改冲突文件后重新提交 , master主分支应该非常稳定 , 用来发布新版本 , 一般情况下不允许在上面工作 , 工作一般情况下在新建的dev分支上工作 , 工作完后 , 比如上要发布 , 或者说dev分支代码稳定后可以合并到主分支master上来
$ git merge [branch] 合并指定分支至当前分支