Git快速入门技巧&常见问题
前情提要
最近在来回不停切环境开发项目,总是发现各种奇奇怪怪的问题,解决Git各种工具应用、代码版本冲突、多环境切换配置冲突等问题,总是会有重复的问题出现,正常来说一次配置完成即可,但是真到了环境崩了的情况不得不又各种找补,归根结底还是对Git原生不熟练(过于依赖工具),导致出现问题的时候反而不明确问题出现的原因,导致排查内容无限重复、无限踩坑,因此抽了一点时间重新梳理了Git相关的内容,针对新环境开发快速入门上手GIt,介绍常用的Git管理工具以及常见Git问题分析&排查思路。
Git VS SVN
SVN:集中式版本控制系统,都有一个统一的版本号,放在一个统一的服务器上,工作时把最新的版本的代码拉取到电脑上,代码完成后在把写完的代码推送到服务器上,由于所有的操作都需要服务器的支持,对网络要求比较大,而且如果服务器里的数据出了问题,那么所有的数据都会丢失,本机客户端仅保存当前版本的信息
Git:分布式版本控制系统,每个人的电脑都相当于服务器,当你拉取仓库的代码后,你的电脑就是一个完整的版本库,工作时不需要联网,所有版本都在自己的本机里,当你想把自己的代码提交到主仓库时,只需要在联网时合并推送到主仓库
Git安装使用&配置
参考网站
1.Git安装
Git安装
Git相关软件最基础的入门软件就是GIt原生+小乌龟(ToriseGit)
Git软件推荐下载路径:Git软件官方下载、Git for Windows、阿里镜像
可视化操作工具:ToriseGit官方下载、以及关联的语言包
此处需注意版本的兼容性,尽量参考版本适配避免操作过程出现问题。
Git安装说明
可以选择参考的教程进行安装,但一般来说就是傻瓜式的安装(一步步默认选择即可),Git安装主要关注两点:环境变量配置、GitBash/GIt GUI
之所以推荐傻瓜式安装方式是为了快速入门,后续这些配置都可以结合实际开发场景进行调整,或者是遇到操作问题回来复盘这些配置反而会有进一步的了解
1)关注是否将git执行指令加入环境变量(可以通过CMD窗口操作,安装完成通过git --version
查看安装版本信息确认是否安装成功)
2)关注Git Bash、Git GUI的搭配使用
类似地小乌龟的安装也是傻瓜式安装,安装完成后把对应语言包也安装一下并进行配置。小乌龟安装完成,可以在任意文件路径点击右键选择ToriseGit=》设置
(如果没有出现小乌龟选项,则需进一步排查是否安装成功),在设置=》常规设置中配置语言包(如果语言包安装成功会自动检测语言包内容,直接选择即可)
Git基础配置(配置文件路径:~/.gitconfig文件,windows对应用户下)
shell
# 全局设置个人用户名和邮箱地址
// 获取个人用户名
git config --global user.name
// 设置个人用户名
git config --global user.name "myName"
// 获取个人邮箱
git config --global user.email
// 设置个人邮箱
git config --gloabl user.email "myEmail"
// 查看git配置
git config --list
2.Git使用
自建本地仓库
场景:创建一个本地Git仓库=》添加文件并提交=》推送到仓库
1)创建本地Git仓库
选择一个文件夹目录(例如:GitRepo),将其初始化为Git仓库
进入到该目录下执行指令(可通过CMD窗口或者GitBash操作git命令行,此处选用CMD)
cmd
# 初始化GitRepo为Git仓库
git init
初始化操作完成,会看到目录下生成一个.git
目录
2)查看分支(初始化仓库默认创建了master分支:可以通过git bash窗口查看内容)
shell
// 查看分支
git branch
// 会在当前目录显示分支信息(例如.../GitRepo(master))
3)在仓库下添加一个文件(hello.txt),并将其添加到暂存区
shell
# 1.添加一个hello.txt文件,并通过git status查看文件状态
git status
# 2.将hello.txt添加到暂存区
git add hello.txt
# 3.再次查看文件状态
git staus
4)提交暂存区文件到仓库
shell
# 1.提交暂存区文件到仓库(git commit -m '提交说明')
git commit -m 'create hello.txt'
# 2.查看文件状态
git status
5)修改hello.txt文件内容、重新提交并推送到仓库
上述操作提交完成,可以看到hello.txt文件图标的变化(有一个绿色对钩标识),当对文本内容进行了修改之后会发现图标变了(变成一个红色感叹号)
shell
# 1.修改hello.txt文件内容,查看文件状态
git status
# 2.重新提交到暂存区
git add hello.txt
# 3.再次提交暂存区文件到仓库
git commit -m 'modify hello.txt'
6)查看提交日志
shell
# 查看提交日志
git log
# 查看所有分支的提交记录,可根据索引码切换分支版本内容
git reflog
git reset --hard 版本唯一索引值
基于上述操作完成仓库创建,编辑文件并进行版本管理。(此处所有的操作都是基于Git仓库构建,这个Git仓库是在本地的磁盘资源上,且为单一分支版本管理,后续引入远程仓库、多人协作、多分支模式)
如何理解本地仓库和远程仓库:本地仓库类似于当前案例创建的存放在本地磁盘资源的仓库,它只能供个人使用。如果是多人协作模式,其他开发者可能需要通过其他方式访问到这个仓库,因此引入远程仓库概念,通过一个平台(专门存放仓库信息),所有的开发者可以通过网络资源访问到远程仓库并进行协作开发,这里GitLab、GitCode、GitHub、Gitee则是起到这么一个平台的作用。其实所谓的本地和远程的概念区分主要在于仓库的托管交由谁负责,如果是本机负责则为本地仓库、如果是交由平台负责则是远程仓库
克隆仓库
场景:clone现有仓库=》提交代码=》推送到远程仓库
1)通过clone将远程仓库拉取到本地进行开发
例如GitHub上现有一个仓库(拥有对其的访问权限)
shell
# 1.clone远程仓库到本地(选择仓库存储路径)
git clone https://github.com/holic-x/drawio-repo.git
# 2.创建文件,参考上上述步骤完成操作(操作指令都是大同小异)
// 添加内容到暂存区
git add .
// 提交到本地仓库
git commit -m 'create hello-remote.txt'
// 推送到远程仓库
git push
当执行git push指令的时候,此时会弹出github用户名、密码确认的窗口,输入用户名密码验证通过后则可进行push操作
创建远程代码仓库
远程代码仓库可以通过平台可视化界面进行创建,然后本地通过clone拉取元辰仓库代码到本地,然后进行开发。
还有一种方式是先创建好本地从仓库然后再创建远程仓库,岂可信息步骤参考如下:
1)创建本地仓库
2)创建或者修改文件,添加文件到暂存区,提交到版本库
3)创建远程仓库
4)将本地仓库推送到远程仓库(推送代码之前需要配置SSH公钥)
分支branch
仓库新建默认提供了一个master分支,前面的案例是基于master分支进行开发,当多人参与协作开发或者是项目模块划分开发分支划分等情况,一个项目可能会发散不同的分支,因此通过分支管理来进一步管理项目内容
1)创建分支
shell
# 查看目前所有分支
git branch
# 切换分支并切换(创建dev分支并切换)
git checkout -b dev
# 切换分支(如果切换指定分支不存在会报错)
git checkout dev
2)切换分支并管理内容
shell
# 1.切换到dev分支
git checkout dev
# 2.新建一个文件,并将其推送到仓库
// 添加所有文件到暂存区
git add .
// 提交暂存区内容到仓库
git commit -m 'create dev-hello.txt'
3)合并分支
将dev分支的内容合并到主分支:
shell
# 1.先切换到master分支
git checkout master
# 2.执行merge操作
git merge dev
// 如果没有检测到可合并的内容状态提示Already to date.
3.Git工作流程
Workspace: 工作区,平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),安全存放数据的位置,这里面有提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是项目组中的一台电脑用于远程数据交换
远程仓库的工作流程
文件的状态
untracked:未跟踪,此文件在文件夹中, 但没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged
tracked:已跟踪,被纳入版本控制
结合一个文件的创建=》提交操作去理解文件状态的变化,平时可以通过git status查看文件状态信息区跟踪:
- 新建文件--->untracked
- 使用add命令将新建的文件加入到暂存区--->staged
- 使用commit命令将暂存区的文件提交到本地仓库--->unmodified
- 如果对unmodified状态的文件进行修改---> modified
- 如果对unmodified状态的文件进行remove操作--->untracked
Git可视化工具使用
可视化工具的应用本质上是Git执行的可视化执行,简化git指令的使用,需要在了解Git指令的基础上,再去看可视化工具每个功能点的使用去对照,就会更好地理解Git的的操作原理和应用
常用Git可视化工具
Git GUI(GIt安装后自带)
1.ToriseGit
1)创建一个工作目录,并将其初始化为Git仓库
2)在这个工作目录完成文件新增并借助工具实现git add等操作
3)提交暂存区内容到本地仓库(确认提交信息)
git commit
2.GitHubDesktop
操作参考示例
1>将远程项目导入仓库
"add-clone repository"在本地创建文件夹专门用于存储git项目,不同的项目区分不同文件夹,在GitHub官网复制指定版本项目的URL,随后添加至本地仓库
如果本地已经存在现有仓库,则可直接选择add existing repostitory
如果有现存项目,则可直接将项目拖入版本库(将已有项目复制到指定仓库),随后配置忽略列表(.ignore
)
确认提交内容无误,可点击publish repository确认发布仓库:需要确认项目内容、忽略配置文件数据,提交数据-push数据,初次项目发布到"master"分支(忽略IDE生成的配置文件、数据库配置文件,关注代码核心文件)
2>分支管理
一般开发情况下,每个团队成员应该独立管理自己的分支,可通过创建自己的分支独立开发,待基本框架和流程完成后再合并到主分支进行测试、调整
3>文件操作
对于工作空间的每个文件可以进行操作(选中要操作的文件,右键选择执行操作)
操作 | 说明 |
---|---|
discard changes | 放弃选中的文件更改 |
discard all changes | 放弃所有文件更改 |
ignore files | 添加到忽略目录(根据指定规则) |
4>提交到本地仓库
5>历史版本管理
已经提交的内容会在History进行版本跟踪,可以对历史版本进行管理
回退指定分支版本:revert this commit(撤销提交操作)
切换对应分支版本:checkout commit
6>远程仓库处理
git fetch/pull
git fetch:相当于是从远程获取最新版本到本地,不会自动merge
git pull:相当于是从远程获取最新版本并merge到本地
git push
当工作区内容提交到本地仓库之后,可以通过git push指令推送到远程分支
PS:本地项目commit之后,可在History查看提交记录,随后点击push可将本地分支推送到服务器,需要注意的是如无特别需求,除却初始化搭建项目框架,后续项目本地的环境配置不要commit,否则后续出现项目配置乱套,导致程序报错
git merge:分支合并
如果从远程获取到最新版本的代码信息,则校验选择指定分支进行合并
GitHub操作常见问题
1>操作同一个分支,本地代码还没提交,内容被另一个用户修改并提交
要多补充一下git知识点,遇到问题才有思路排查:
githubDesktop在拉取代码的时候会提示(stash ....相关的内容),点击确认代码会被存在stash区域,这个时候会发现本地还没提交的内容会被分支最新提交的数据"冲掉"(实际上就是保存到stash一个缓存区),可以通过stash pop重新将区域中的内容拉取到本地
stash的一个应用场景:本地写了代码暂时还不想提交,先将工作内容通过git stash进行暂存,需要的时候再取出来(类似]【备份】概念),这个时候如果检测到有用户提交了代码可以先通过git pull更新(从远程获取代码到本地),随后借助git stash pop指令获取最近一次stash进去的内容(这个操作可以借助Git工具类进行操作)
2>GitHub提交(提示需要指定用户名)
这对一些项目组的限制,需要验证提交用户名规则,因此要设定自己的Git账号信息才能正常提交,根据相应提示进行调整即可。不同操作工具类配置不同,需要确认自己目前使用的操作工具是哪个软件,然后修改对应软件的配置信息
如果是gitBash方式提交
cmd
# 查看用户名
git config user.name
# 设置用户名
git config user.name "xxxx"
GitHubDesktop修改用户信息:File=》Options=》Git,修改对应的名称
3>GitHubDesktop突然崩掉
在设置gitclone空格字符处理的时候,按照提示修改全局git配置,但是保存后发现所有的git仓库都不生效了。考虑还是修改的格式问题(注意配置文件打开的软件,如果用一些奇奇怪怪的第三方软件打开保存的时候可能就会导致格式异常)
如果是修改配置文件导致的问题,则去查看对应配置文件(将其复原),例如此处的配置文件(windows下用户的.gitconfig文件)
4>GitHubDesktop某个分支突然无法关联远程仓库(断电背大锅)
某天下班回来发现断电了,一开始没有关注太多内容,后面发现本地仓库无法正常关联到内容(提示某个分支无法连接到本地仓库),就算Fetch重新拉请求也不生效,本来打算重新拉取仓库代码的,但是代码内容太大无法一次性拉取(且Git方式拉取、GitHubDesktop拉取一直报错无法解决,卸载了Git重装还是一样的🤡问题)
偶然看到一个文章教程:解决断电导致IDEA无法提交代码错误,跟着提示一步步定位错误,最终解决(本质上还是Git配置的问题)
1)在对应的代码仓库下的.git
文件夹进行跟踪,先确认.git/logs/refs/heads/[对应分支]
文件中代码的最后一次提交记录,定位最后一行记录的第二个参数(hash值)
2)如果是dev分支报错,则跟踪对应dev文件(本地:.git/refs/heads
、对应远程仓库:.git/refs/remotes
),确保对应的dev文件的hash一致(进行绑定)
3)修改完成,重新打开代码提交工具(此处为GitHubDesktop),检查分支关联情况,发现仓库可以正常关联(关联完成则可进一步操作)
完成上述操作又出现了新的问题(原因是手贱重装了Git,一些配置可能需要重新调整才能生效),此处列举遇到的一些点和常见处理方式:
5>无法从xxx.git中拉取内容(443):
分析:此前的源码仓库是从java-base-docs更名过来的,这次断电不知道为啥又把参数冲掉了,需要手动修改.git/config
配置文件中的远程的URL参数
6>SSL/TLS connection failed
SSL/TLS 连接失败:全局关闭掉SSL验证后再次访问尝试:git config --global http.sslVerify false
PS:此处涉及到前面Git安装的时候提示是否开启SSL验证,此处更改的是针对global 全局的配置,如果针对某个仓库的修改则需在其对应的.git
仓库配置文件中修改
方案2:如果是对仓库的.git
文件修改,则修改其下的config文件,然后在文件底部增加内容(需要注意格式问题,如果不小心改崩了的话githubdesktop会提示仓库无法关联)
cmd
# ----- 默认配置 ------
# 新增内容在下方
[http]
sslbackend = openssl
7>无法访问远程仓库(Couldn't connect to server)
无法访问远程仓库:考虑是网络连接或者代理的问题,此处有两种解决方案
shell
# 方案1:修改git全局配置
git config --global --unset http.proxy
git config --global --unset https.proxy
# 方案2:如果说使用了网络代理VPN(上面的配置可能没啥作用),需要配置相应的代理路径
git config --global http.proxy http://127.0.0.1:7890
3.IDEA引入CVS
场景:clone现有项目参与开发
拉取远程仓库
创建或切换分支
文件状态
IDEA中使用Git,文件不同颜色代表的含义
- 绿色------已经加入控制暂未提交;
- 红色------未加入版本控制;
- 蓝色------加入,已提交,有改动;
- 白色------加入,已提交,无改动;
- 灰色------版本控制已忽略文件;
- 黄色 ------被git忽略,不跟踪
提交到本地仓库
选择指定文件,右键选择Git=》Commit FIles,然后填写提交信息
查看日志
提交完成可以跟踪提交日志信息
经过commit操作,提交到本地仓库,还需要推送到远程仓库,可以通过日志跟踪,这个时候remote并没有dev分支,说明分支信息还没推送到远程,需要进一步操作
如果是第一次推送则需要鉴权(输入登陆账号、密码信息等,校验用户对仓库的操作权限),检验通过则等待推送完成后进一步确认分支信息(例如此处鉴权可以选择账号登陆或者token验证)