Git
Git是一种分布式版本控制系统,它可以帮助开发团队更好地管理代码并进行协同开发。
gitee,github,gitlab,是基于git的代码托管平台。
官方文档地址(中文):Git - Git 是什么?
安装和配置
官网下载地址:Git - Downloads
1、安装
windows的安装方式
一直下一步直至安装完成
安装成功的校验方式 ——打开cmd输入
git --version 查看版本号
mac的安装方式
brew install git
Homebrew更换国内镜像源(中科大、阿里、清华) - 知乎
如果返回了版本号,说明安装成功。
2、查看开源项目
配合github或gitee
github官网:GitHub: Let’s build from here · GitHub
gitee官网:Gitee - 基于 Git 的代码托管和研发协作平台
gitlab官网 : 请稍候… (gitlab.com)
以java面试题为例,代码地址:
JavaGuide: 【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。
1)找到【clone or download】按钮,点击download zip (并不常用)
2)git clone + 链接地址 ,代表将远程代码克隆到本地
链接地址来自下方默认HTTPS选项
创建项目存放路径
路径不要包含中文,建议在E盘或D盘根路径下创建gitProjects目录
然后在资源管理器的地址栏输入 cmd 并回车,cmd 打开后会自动定位到当前目录
然后执行clone
git clone
JavaGuide: 【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。
注意在输入命令时,需要用空格分隔,如果使用不熟练也可直接复制粘贴
看到日志中有100%字样,说明项目下载完成。
补充说明,如果下载的是maven项目,那么打开项目时,
可能需要找到pom.xml,右键,选中Add as Maven Project这一项
3、配置git
第一次使用git时,需要设置两个全局的参数,分别为名字和邮箱,当你后续提交代码后,别人可以通过名字和邮箱来识别出,这是你提交的代码。
命令: git config --list 显示配置列表
git config --global user.name "${用户名}"
git config --global user.email "${邮箱}"
git config --list 显示配置列表 (再次查看就变成自己修改后的了)
在第一次提交代码时,会弹出另一个登录窗口,需要填写在gitee网站中注册的用户名和密码,填写一次后,以后都会默认生效,这个登录操作也是用来校验你是否拥有此仓库的开发权限。
4、配置秘钥(可选)
如果要使用以git开头的链接地址
如 git@gitee.com:SnailClimb/JavaGuide.git (切换SSH选项)
- 在本地生成秘钥
ssh-keygen -t rsa -C "${邮箱}"
执行命令后,会提醒你设置文件夹保存key,默认是.ssh文件夹
不设置密码直接回车后,生成id_rsa.pub秘钥文件
- 在gitee上配置秘钥
用户中心 - 设置 - SSH公钥 - 添加公钥
github的对应路径 用户右键 - settings - SSH and GPG keys - new ssh key
- 验证是否添加成功
使用ssh -T git@gitee.com
或者直接执行 git clone git@gitee.com:SnailClimb/JavaGuide.git
理论基础
1、仓库
仓库是管理项目的最基础目录
git仓库分为本地仓库和远程仓库
1)git init 新建一个本地代码库
2)git clone 从远程拷贝
拿到远程仓库的修改 git pull(拉取)
提交给远程仓库修改 git push(推送)
工作区和暂存区
工作区:就是存放代码的地方 (项目文件夹)
暂存区:临时存放改动的地方 (通常在新建文件时使用)
本地仓库:安全存放代码的地方
远程仓库:(github/gitee)
git所存储的都是一系列的文件快照,然后git来跟踪这些文件快照,发现哪个文件快照有变化它就会提示你需要添加到暂存区或是提交到本地仓库来保证你的工作目录是干净的。
2、更新代码
git pull
pull(拉取)最新的代码,也就是先让本地代码和服务器保持相同的最新状态。
只需要点击蓝色向下的箭头
右下角返回 all files are up-to-date。代表当前代码已经是最新的状态。
git fetch
git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
3、提交代码
点击对号
左边会显示相应的文件 , 点击提交并推送
点击推送
右下角出现这个就说明推送成功了 .
在第一次提交代码时,会弹出一个登录窗口,需要填写在gitee网站中注册的用户名和密码
按照此流程,以后就能顺利的提交自己的代码,也能方便的查看别人提交的代码了,虽然刚开始接触会有一点陌生,但是熟练之后会非常方便,希望前几次你能按照此文档操作一下,养成良好的习惯,也能为将来工作打下很好的基础。
查看提交历史
git -> show history 展示谁在什么时间进行了什么修改。
查看某次提交所有相关的文件
如果右侧没显示,那么在提交记录上右键 -> show all affected files
双击文件本身,可以查看对应的修改
将本地仓库和远程关联
第一种:
1)先在gitee上创建仓库 如 xxxxxxxxxxxxxxxxxxx
2)在本地通过idea创建springboot-shop-seckill-1项目,存放在路径A下,会提醒这是一个空的仓库
3)git clone 仓库地址,存放在路径B下
4)将路径A中的内容 拷贝到路径B下,然后进行提交和推送(git add)
第二种:
1)先在gitee上创建仓库 xxxxxxxxxxxxxxxxxxx
2)在本地创建或修改好一个已有的项目,然后对其进行git初始化
git init (让文件夹通过git进行版本管理,会生成 .gitignore文件)
git add (文件夹下的文件需要添加到git中)
之后就分别进行 提交、关联、推送
git commit -m "first commit"
git remote add origin xxxxxxxxxxxxxxxxxxx
git push -u origin master
.gitignore
在工程中,并不是所有文件都需要保存到版本库中的,例如“target”目录及目录下的文件就可以忽略。在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件或目录。
# Compiled class file
*.class
# Eclipse
.project
.classpath
.settings/
# Intellij
*.ipr
*.iml
*.iws
.idea/
# Maven
target/
# Gradle
build
.gradle
# Log file
*.log
log/
# out
**/out/
# Mac
.DS_Store
# others
*.jar
*.war
*.zip
*.tar
*.tar.gz
*.pid
*.orig
temp/
4、回退代码
回退(reset)分为本地仓库回退和远程仓库回退,除此之外还有一种方式为反做(revert),实际应用较少,此处暂且不表。
本地仓库回退
本地仓库回退又分为两种情况,一种是未提交,一种是已提交未push。
对于未提交的情况
文件更改后,状态由白色变为蓝色。
如果修改代码后,不想提交,想恢复成修改前的版本,那么可以本地回退
文件右键-> git -> 回滚-> 确认
对于已提交未push的情况
需要回退提交
执行命令 git reset --hard HEAD~
--hard代表强制执行,会强制将代码更改为你提交前的版本。而HEAD~代表上一次提交,~可以加上数字,HEAD~2返回上上次提交,以此类推,可以指定回退到本地的哪一次提交状态。
远程回退
远程回退的本质是,本地先回退到某一版本。
先在提交记录中找到指定的版本,将当前代码回退到此版本中。
对应命令为
使用git log查看版本号
使用“git reset --hard 目标版本号”命令将版本回退。
git reset --hard 9feb83df6db8b132004325ab03377b2088cba540
git push -f 将更改强制推送到远程
补充说明
因为我们回退后的本地库HEAD指向的版本比远程库的要旧,此时如果用“git push”会报错。如下:
5、分支
分支是一种平行时空,能够支持一种互不影响又同时进行的合作方式。
创建仓库时,自动创建了一个master主干。
具体使用场景:
master 一般用来存放已上线的代码
开发新的功能时,创建新的分支,当前版本在当前分支开发,在此版本上线前,合并到master分支上,然后在master基础上创建下一个分支,这样就能保存每个版本对应的代码,更好地支持版本追溯和回滚。
分支最终还是要合并的,按照此规范时,分支不会出现冲突,但在其他使用情况中合并分支也可能出现冲突。
创建分支
git branch
列出本地已经存在的分支,并且当前分支会用*标记,增加-r 可以查看远程仓库的分支
git branch + {分支名}
默认拉取master上代码到新创建的分支中
git checkout + {分支名}
通过查看git branch结果中 * 所在的位置,来定位分支
合并分支
test -> master
首先当前分支是需要合并过来代码的分支(master)
git merge test 效果是test的最新提交的代码会出现在master中。
推送到远程仓库
git push origin test:test
test:test 冒号前代表 本地分支的名字
冒号后代表 远程分支的名字
分支使用流程
1)如果要创建一个自己的分支 newBranch,确认要基于哪个分支来创建新的分支,比如master,确保是最新代码git pull,然后执行创建分支的流程 git branch newBranch
2)开始修改代码,如果间隔时间较久,再合并一次代码 git merge master
3) 将分支推送给远程仓库 git push origin newBranch:newBranch
4)如果此分支的代码可以上线,还需要将分支代码合并回master中
git checkout newBranch
git pull
git checkout master
git pull
git merge newBranch
#可能需要修改冲突
git commit
git push
分支合并的原理
分支是用来标记特定代码的提交,每一个分支通过SHA1sum值来标识,所以对分支的操作是轻量级的,你改变的仅仅是SHA1sum值。
如下图所示,当前有2个分支,A,C,E属于master分支,而A,B,D,F属于dev分支。
A----C----E(master)
\
B---D---F(dev)
它们的head指针分别指向E和F,对上述做如下操作:
git checkout master //选择or切换到master分支
git merge dev //将dev分支合并到当前分支(master)中
合并完成后:
A---C---E---G(master)
\ /
B---D---F(dev)
现在ABCDEFG属于master,G是一次合并后的结果,是将E和F的代码合并后的结果,可能会出现冲突。而ABDF依然属于dev分支。可以继续在dev的分支上进行开发:
A---C---E---G---H(master)
\ /
B---D---F---I(dev)
6、可视化工具
sourcetree: Sourcetree | Free Git GUI for Mac and Windows (最流行)
Git GUI(Git官方自带的可视化工具)
冲突解决
1、产生冲突的原因
当多个开发者同时使用或者操作 git 中同一个文件时:多个本地分支需要向同一个远端分支推送代码,就有可能发生冲突。
push操作的本质是将本地代码merge到远端分支;同理,pull操作的本质是将远程分支merge到本地分支。所以冲突往往发生在进行这两种操作时。
举例说明:张三和李四都拿到一份提交历史为 a,b 的代码,两人都对同一部分代码进行修改并提交,分别为 c 和 d。现在要将两个提交进行合并,git 不知道应该采用哪个修改,于是就提示冲突,让我们人为进行修改。
2、解决冲突的方式
首先尽量养成避免冲突的提交习惯:
- 尽可能频繁地使用 git pull 同步代码,每次修改都基于最新的代码,可以极大减少发生冲突的概率。
- 减少每次提交代码的行数,每次做完一个小修改就提交并上传代码。这样即使发生冲突了,也能很快速地解决。
1)每个人使用独立git账户的情况
建议代码提交方式为【先保存本地更改】-【拉取远程代码】-【将本地更改覆盖到最新代码中】
对应命令是
git stash(恢复到上次拉取代码的未改动状态,并将改动保存到暂存区)
git pull
git stash pop (将暂存区的改动覆盖本地)
如果远程代码和本地发生冲突,那么代码会直接报错,先解决冲突,再commit和push。如果没有冲突,就可以直接提交。这里也需要注意,每次commit和push时,需要确认只提交了自己的修改,而没有覆盖他人的修改。如果发生冲突,最好和冲突的另一方沟通一下,进行双重验证。
2)多人共用同一git账户的情况
有一种每个人都在自己的分支上开发的方式,提交代码时合并到一个分支,但合并分支同样会出现冲突,还增加了维护分支的成本,因此并不推荐。
更推荐的使用方式为,在准备提交前,直接使用commit and push,如果没有冲突,会进行自动合并,避免了其他冗余操作。如果存在冲突,在idea或其他git 操作页面会弹出冲突列表,依次解决存在冲突的文件,注意此时文件以三种版本展示,最左侧是你自己的版本,最右侧是远程版本,中间是你的合并结果。
上图中的冲突方案如下:
Accept Yours:代表以自己的为准
Accept Theris:代表以更新下来的文件为准
Merge:代表手动合并(推荐选择)
点击Merge,如果不小心关闭了也没关系,重新打开的入口为
项目右键 -> git -> conflicts resolved
会出现三个对比框,最左侧是当前分支的代码(master) ,最右侧待合并的分支代码(test),中间是想要的合并结果
将需要的内容点击:">>"既可以合并内容到 result 中,不需要的内容点击“x”即可,合并完成后点击 apply 即可。大部分时候是将两个版本的更改都合并到中间就可以了,如果是纯粹的逻辑冲突,就需要找到先提交代码的同事来确认最终结果。
补充说明
如果执行git merge合并时发生冲突,则会进入合并的中间状态。合并的中间状态下将无法执行其他一些操作(如切换分支)。如果不想继续合并,要先用git merge --abort命令退出。该命令会使你回到执行git merge 分支之前的状态。
常用命令总结
git clone 从远程拷贝
git pull 将代码从远程仓库 -> 本地仓库
git add 将代码从工作区 -> 暂存区 (把文件托管git)
git commit 将代码从暂存区 -> 本地仓库 (存在一笔提交记录)
git push 将代码从本地仓库 -> 远程仓库 (促进多人合作)
git stash(恢复到上次拉取代码的未改动状态,并将改动保存到暂存区)
git stash pop (将暂存区的改动覆盖本地)
git branch 创建分支
git checkout 切换分支
git merge 合并分支
git init 新建一个本地代码库
补充说明
github访问不到的解决方案
1、获取ip
依次进入网址,获取ip、域名ip和静态资源ip
IP/服务器github.com的信息 - 站长工具
IP/服务器github.global.ssl.fastly.net的信息 - 站长工具
IP/服务器assets-cdn.github.com的信息 - 站长工具
2、修改hosts文件
Windows系统:打开 C:\Windows\System32\drivers\etc 找到hosts文件
Mac系统:打开文件 vim /etc/hosts
在底部加入前三步获得的内容,保存并退出,然后重启浏览器访问。
过一段时间如果无法访问,就是ip地址更新了,重新获取即可。
这期就到这里 , 下期见!