Git学习笔记
Git学习笔记目录
1、版本控制分类
-
本地版本控制
-
集中版本控制 SVN (Subversion)
所有的版本数据都保存在服务器上,每个人工作时从中央服务器下载代码,必须联网才能工作,个人修改后提交到版本库。
如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据。
-
分布式版本控制 Git
每个人都拥有全部的代码,所有版本信息仓库全部同步到本地的每个用户。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据。
2、Git安装和环境配置
软件下载
Git启动选项
安装成功后在开始菜单中会有Git项,任意文件夹下右键也可以看到对应的程序
**Git Bash:**Unix与Linux风格的命令行,使用最多,推荐最多
**Git CMD:**Windows风格的命令行
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
用户目录
C:\Users\MyUserName
# gitbash 用户目录标识符 ~
MyUserName@xxxx MINGW64 ~
$ pwd
/c/Users/MyUserName
根目录
根目录为git安装目录
# 根目录标识符 /
MyUserName@xxxx MINGW64 /
3、常用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目录
rm -rf / 切勿在Linux中尝试!删除电脑中全部文件! - mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
- reset 重新初始化终端/清屏。
- clear 清屏。
- history 查看命令历史。
- help 帮助。
- exit 退出。
- #表示注释
4、Git的必要配置
所有配置文件都保存在本地
# 查看Git所有配置 l: list
$ git config -l
# 查看Git系统配置
$ git config --system --list
# 查看Git用户(global)配置
$ git config --global --list
# 查看Git局部(Local)配置
$ git config --local --list
Git用户配置文件的保存位置:
- system 系统级配置:Git 安装目录下Git\etc\gitconfig
- global 全局配置:用户目录下C:\Users\MyUserName\ .gitconfig
- Local 局部配置:工作空间目录下**.git/config**
优先级:Local > global >System
4.1 设置用户名和邮箱(用户的标识)(重要!!!必须配置)
每次提交都会使用用户的信息,可以直接编辑配置文件,通过命令设置后会响应到这里
如果用了 –global 选项,那么更改的配置文件就是全局配置。如果要在某个特定的项目中使用其他名字,只要去掉 --global 选项重新配置即可。
git config --global user.name "kuangshen" #名称
git config --global user.email 24736743@qq.com #邮箱
4.2 为常用命令设置别名(可选)
-
打开用户目录
C:\Users\MyUserName
,创建.bashrc
文件 -
在
.bashrc
文件中配置# 等号前后不能有空格 # 用于输出git日志 alias git-log="git log --all --pretty=oneline --abbrev-commit --graph" # 用于输出文件目录下所有文件信息 alias ll="ls -al"
-
打开gitBash
执行
source ~/.bashrc
5、Git基本理论
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上**远程的git仓库(Remote Directory)**就可以分为四个工作区域。
-
**版本库:**工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
-
Workspace 工作区:电脑里能看到的目录,存放项目代码的地方。
-
Index / Stage 暂存区:用于临时存放你的改动,保存即将提交到文件列表信息。存放在
.git
目录下的index文件
**(.git/index)
**中,所以我们把暂存区有时也叫作索引(index) -
Repository 仓库区:安全存放数据的位置,这里面有你提交到所有版本的数据。
其中HEAD指向当前版本分支(Master)。
-
Remote 远程仓库:托管代码的服务器。
-
Stash 隐藏:是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
6、Git项目创建
-
创建全新的本地仓库
# 在当前目录新建一个Git代码库 # 执行后在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面 # 需要手动配置远端仓库的关联关系 $ git init
-
克隆远程仓库
# 将远程服务器上的仓库完全镜像一份至本地,克隆一个项目和它的整个代码历史(版本信息) $ git clone [url]
7、Git的文件操作
7.1 文件的四种状态
- Untracked: 未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制。通过git add 状态变为Staged。
- Staged: 暂存状态。执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态。
- Unmodify: 文件已入库,如果它被修改,而变为Modified。
- Modified / Unstaged: 文件被修改。 通过git add可进入暂存staged状态。
7.2 文件操作
# 查看指定文件状态
$ git status [filename]
# 查看所有文件状态
$ git status
# 查看提交记录
# git log [option]
# --all 显示所有分支
# --pretty=oneline 将提交信息显示为一行
# --abbrev-commit 缩短Commit ID的显示
# --graph 以图形的形式显示
$ git log
$ git log --all --pretty=oneline --abbrev-commit --graph
# 注:如果显示内容过长,git会分页显示,使用上下进行翻译,结尾有(END)标识,按q键退出
# 添加所有文件到暂存区
$ git add .
# 提交暂存区中的内容到本地仓库 -m "提交信息"
$ git commit -m "消息内容"
7.3 文件版本的回退
# 回退到指定版本 (commitID通过 git log 或者 git reflog 查看)
$ git reset --hard commitID
# 查看已经删除的记录
$ git reflog
7.4 设置忽略文件
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等
在主目录下建立 “.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
7.5 Git tag
如果达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag
给它打上标签。
# Tag的名称(tag名称不能带有空格)
# -a 选项意为"创建一个带注解的标签不带-a的话无法注解信息 / -m 指定Tag信息
$ git tag -a [tagname] -m "Tag note"
# 查看所有的tag
$ git tag
8、GIT分支
HEAD指向的为当前分支地址
8.1 分支在开发中使用的流程
-
master分支:线上分支,主分支
-
develop分支:开发分支,在此分支上开发需求,开发完成后合并到主分支上。
-
feature/xxxx分支:从develop上创建的分支,分支上研发任务完成后合并到develop分支。
-
hotfix/xxxx分支:从master上创建的分支,一般作为线上bug修复使用,修复完成后合并到master、develop等分支上。
-
其它分支:test分支用于代码测试、pre分支用于预上线等。
-
一般情况下合并后会删除hotfix、feature分支,保留master和develop分支
8.2 Git分支常用操作
-
当前分支为dev01,master分支和dev01分支相同
-
当前分支为dev01,dev01完成一次提交,master分支在上一个版本
-
切换分支为master,HEAD从新指向Master
-
在Master上添加修改,直观显示
-
在Master分支上合并Dev01分支,注意合并时会进入Vim编辑器,按
ESC
进入命令模式输入:wq
推出 -
注意:合并后删除分支
git branch -d 分支名
8.3 解决分支冲突
假设现在存在两个分支,master分支和dev01分支,存在文件demo.txt
- 如果dev01分支修改demo.txt文件,mater分支未修改,则master合并dev01分支时不会产生冲突,dev01分支的修改会覆盖master的demo.txt文件
- 如果dev01分支修改demo.txt文件,同时mater分支也修改了demo.txt文件,则产生冲突,需要确认冲突,再通过
git add .
和git commit
重新提交,即可完成合并。
结论:git bash中冲突检查是按照文件进行检查,即不会检查文件内的具体变化,只会判断文件是否在不同分支进行过修改。不同分支修改同一个文件就会产生冲突。
-
master分支上,demo01.txt文件内容为
Update count = 1
,当前分支dev02,修改文件为Update count = 2
-
master分支上修改demo01.txt内容为
Update Count = 3
-
master上合并分支后显示冲突
-
文件显示结果
-
需要手工修改结果,这里我们修改为10
-
完成修改后重新commit提交会自动合并结果
8.4 分支常用命令
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 切换分支
$ git checkout [branch]
# 新建一个分支,并切换到该分支(-b 新建)
$ git checkout -b [branch]
# 合并指定分支到当前分支(重要)
$ git merge [branch]
# 删除分支(不能删除当前分支,只能删除其它分支)(-d 删除分支需要做检查)
# 强制删除用于删除未合并分支的场景
$ git branch -d [branch-name]
(-D 不做任何检查,强制删除,未merge分支时)
$ git branch -D [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
9、远程仓库的设置与使用
9.1 配置远程仓库SSH公钥
设置本机绑定SSH公钥,实现免密码登录。
使用仓库URL时,复制SSH链接才能实现免密登录
- SSH公钥生成
# 进入 C:\Users\Administrator\.ssh 目录
# 通过命令 ssh-keygen 生成 SSH Key:
# ssh-keygen -t rsa -C "Gitee SSH Key"
# -t key 类型
# -C 注释
$ ssh-keygen -t rsa
# Gitee验证配置是否成功
$ ssh -T git@gitee.com
-
查看生成的 SSH 公钥和私钥
私钥文件 id_rsa232
公钥文件 id_rsa232.pub -
记事本打开id_rsa232.pub复制公钥
-
在github或gitee的设置中–>SSH公钥–>添加复制的公钥
9.2 远程仓库添加/查看/推送/clone
# 添加一个远程仓库,起名为orgin。 git remote add <远端名称> <仓库路径>
$ git remote add origin [url]
# 查看远端仓库
$ git remote
# 推送代码到远端仓库
# git push [-f] --set-upstream [远端名称[本地分支名]:[远端分支名]]
# -f 强制推送
# --set-upstream 推送到远端时建立本地分支和远端分支的关联关系,下次推送默认使用该关系
$ git push orgin master
$ git push origin master:master
$ git push # 按照分支的关联关系推送
# 查看本地分支与远程分支的关联关系
$ git branch -vv
# 从远端仓库克隆
$ git clone [url]
9.3远程仓库抓取/拉取
-
抓取:
-
将远端仓库里的更新都抓取到本地,不进行合并
-
如果不指定远端名称和分支名,则抓取所有分支
-
# 抓取命令:git fetch [remote name] [brance name]
$ git fetch
# master分支上合并远端分支
$ git merge origin/master
-
拉取:
-
将远端仓库里的修改拉到本地并自动合并,等同于 fetch+merge
-
如果不指定远端名称和分支名,则拉取所有并更新当前分支
-
# 拉取命令:git pull [remote name] [brance name]
$ git pull
9.4 解决合并冲突
远端分支也是分支,所有合并冲突的解决方式也和本地分支冲突一样。
建议提交之前先pull在本地解决完冲突再提交
- 先拉取远程仓库的提交,经过合并后再推送到远端分支
10、IDEA中集成Git
-
IDEA中设置git路径
-
在工程项目中创建.git文件,注意要关联与远端仓库的关系
-
方法一:在项目导航栏VCS标签中启用版本控制
-
方法二:在.git目录下创建项目
-
方法三:复制.git文件到项目工程文件中
-
操作注意点:
- IDEA中对index缓冲区较为弱化,直接进行commit提交
- 切换分支前先提交本地的修改
- 提交之前先pull在本地解决完冲突再提交
- 冲突检查会对比文件内修改的代码行