赞
踩
Git部分:
Git介绍 - 分布式版本控制工具 VS 集中式版本控制工具
Git安装 - 基于官网发布的2.32.1安装讲解
Git命令 - 基于开发案例讲解git的常用命令
Git分支 - 分支特性 分支创建 分支转换 分支合并 代码合并冲突解决 【Git分支是Git的一大特性】
IDEA集成Git
GitHub部分:
创建远程库
代码推送 - Push
代码拉取 - Pull
代码克隆 - Clone
SSH免密登录【GitHub服务器在国外,有时连接较慢或连接失败,这时可以用SSH免密登录】
Idea集成GitHub
Gitee码云:
码云创建远程库
Idea集成Gitee码云
Gitee码云连接GitHub进行代码的复制和迁移
GitLab:
简介:GitLab是一个基于局域网的代码托管中心。(如果一个公司不是开源的,其编写的代码也没有打算放到互联网上,这时就可以搭建公司自己内部的GitLab服务器,将代码上传到公司自己的服务器上)
GitLab服务器的搭建和部署
Idea继承GitLab
Git是一个免费的、开源的分布式版本控制系统。
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
Git官网:https://git-scm.com
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
然而在实际项目开发中都是团队协作开发,此时创建副本进行版本控制是行不通的,可以借助Git进行版本控制。
集中式版本控制系统诸如SVN(Subversion)等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协调工作的人们都可以通过客户端连接到这台服务器,取出最新的文件或者提交更新。
这种做法的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发送故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
1、服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
2、每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
其中工作区指的是代码存放在磁盘上的位置(代码项目文件夹目录)。
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。
Git官网:https://git-scm.com
去官网下载安装包:
安装:
Git选项配置,推荐默认设置,然后下一步:
Git安装目录名,不用修改,直接点击下一步:
选择对于Git的默认编辑器:
对于新的库是否要修改初始化分支的名字:
修改环境变量:
选择后台客户端连接协议,默认为OpenSSL,然后下一步:
配置行末换行符,默认为第一个,然后下一步(Windows的换行符为CRLF,Unix的换行符为LF。第一个会自动检查是Windows还是Unix,自动转换成对应的换行符):
在Git Bash中使用哪种终端,默认为第一个,然后下一步:
选择git pull的默认行为,默认选择第一个,然后下一步:
选择凭据管理器。【因为要使用Git客户端对远程库进行push(推送)和pull(拉取),不可能每次使用Git客户端都要登录,因此凭据管理器可以记录登录行为,只要登录一次,后面便不需要登录了。】:
其他配置:
完成安装:
查看是否安装成功:
Git GUI(图形化界面):
Git图形化界面几乎不用,经常使用的是Git Bash:
可以使用 git --version
查看Git的版本号:
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.email 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m “日志信息” 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
前两个命令(global全局)是用于设置用户签名的,当Git安装好之后,只需要设置一次用户签名即可。【用户签名必须设置,否则提交代码时会报错】
后六个命令则是经常使用到的。
打开Git Bash输入命令,进行设置用户签名:
【注】:Git是Linux编写者编写的,在Linux中输入命令时,打出单词的一部分,使用Tab键可以进行补全;同样在Git中也有这样的操作,使用Tab键可以补全。
那么如何查看已经设置好的用户签名:
到C盘-用户-user下找到 .gitconfig
文件,打开即可查看配置的用户签名。
说明:
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git首次安装必须设置一下用户签名,否则无法提交代码。
注意:
这里设置的用户签名只是代表本地客户端,其与将来登录GitHub(或其他代码托管中心)的账号没有任何关系。
对“初始化本地库”的简单理解:
如果想要使用Git管理目录,首先需要让Git获取这个目录的管理权,而初始化本地库就可以让Git获得其管理权。
下面通过一个开发案例说明如何初始化本地库:
假设现在D:\Git-Space\git-demo是我的项目目录,我现在想要使用Git对其进行管理,该如何进行?
进入要使用Git管理的目录下,执行初始化本地库命令:
上面提到过Git是Linux编写者编写的,所以在Linux中的命令同样可以在Git Bash中使用。
在Linux系统中,可以通过简单的一行命令来使用 ll
命令,命令行格式如下:ll 参数 [path]
其中,path表示需要显示信息的文件路径,默认情况下命令会显示当前目录下的所有文件和文件夹信息。 而在命令执行后,ll命令将返回当前目录中所有文件和文件夹的详细信息,并将它们以一种简洁、直观的方式进行展示。
需要注意 ll
命令默认不显示隐藏文件,如果要查看隐藏文件需要加上参数 -a
。
下面在Git Bash中使用 ll
命令:
查看本地库状态的命令:git status
。
首次查看本地库状态(工作区没有任何文件):
新增文件(hello.txt):
这里练习在Git Bash中使用vim编辑器创建文件(vim编辑器在安装Git时已经设置过了)。vim编辑器是Linux中使用的,在学习Linux时需要学习使用vim编辑器,vim的使用可以参考 Linux vi/vim | 菜鸟教程。
这样在该目录下就会创建名为hello.txt的文件:
再次查看本地库的状态(检测到未追踪文件):
追踪文件就是将文件添加到暂存区;未被追踪文件就是文件已存在于工作区,但未添加到暂存区。
将文件添加到暂存区的命令:git add 文件名
。
将工作区的文件添加到暂存区:
查看状态(检测到暂存区有新文件):
演示删除暂存区文件:
将暂存区文件提交到本地库的命令:git commit -m "日志信息" 文件名
。其中 -m 表示要写一个版本日志信息,这个必须写。
将暂存区的文件提交到本地库:
查看状态(没有文件需要提交):
已经提交到本地库,生成历史版本,下面查看历史版本:
命令:git reflog
查看历史记录(日志信息)
命令:git log
查看详细日志命令(不仅能看到版本,还能看到是谁提交的该版本)
使用vim编辑器修改文件(hello.txt):
查看状态(检测到工作区有文件被修改):
将修改的文件再次添加到暂存区:
提交到本地库:
查看状态:
下面再练习修改文件:
注意:
在工作区中永远只有一个文件,Git控制版本用的不是副本方案(所谓副本方案,就是前面提到的论文多版修改的例子),Git底层是利用指针进行控制的。
查看历史版本命令:
命令:git reflog
查看历史记录(日志信息)
命令:git log
查看详细日志命令(不仅能看到版本,还能看到是谁提交的该版本)
查看其他版本的内容可以用到版本穿梭。版本穿梭的命令:git reset --hard 版本号
。
前面提到在工作区中永远只有一个文件,Git控制版本用的不是副本方案(所谓副本方案,就是前面提到的论文多版修改的例子),Git底层是利用指针进行控制的。当版本穿梭后,工作区的文件也会回到指定的版本。
Git切换版本,底层其实是移动的HEAD指针,具体原理如下图所示:
分支概述:
在版本控制过程中,同时推进多个任务,可以为每个任务创建单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(理解为副本只是为了方便理解,但实际上在Git中分支并不是副本,分支底层其实也是指针的引用)
分支的优点:
了解了什么是分支以及分支的优点就会明白分支在实际开发中是很重要的,而且分支也是Git的一大特点。
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
查看分支的命令:git branch -v
。
创建分支的命令:git branch 分支名
。
切换分支的命令:git checkout 分支名
。
切换到 hot-fix 分支后,在 hot-fix分支上做修改:
查看历史记录(日志信息):
合并分支的命令(把指定的分支合并到当前分支上):git merge 分支名
。
冲突合并是更常用的。
冲突产生的原因:
合并分支时,两个分支在同一个文件有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。
在上面正常合并过hot-fix和master分支后,此时两个分支中hello.txt的内容完全一致。进行下面操作:
在master分支上对hello.txt文件做修改:
在hot-fix分支上对同一个文件hello.txt文件做修改:
这时两个分支在同一个文件hello.txt上有两套完全不同的修改。这时再将hot-fix分支合并到master分支时便会出现冲突。【冲突产生的表现:后面状态为MERGING】
使用vim hello.txt命令进入产生合并冲突的文件,人为决定要保留的代码:
还需要将“人为解决冲突后的文件”添加到暂存区;然后再将其提交到本地库(注意:此时使用git commit命令时不能带文件名。因为两个分支中都有hello.txt,Git不知道提交哪个):
合并分支只会改变master分支的内容,并不会改变hot-fix分支的内容(这里将hot-fix分支合并到master分支):
创建分支和切换分支图解:
master、hot-fix其实都是指向具体版本记录的指针。当前所在的分支,其实是由HEAD决定的。所以创建分支的本质就是多创建一个指针。
HEAD如果指向master,那么现在就在master分支上。
HEAD如果指向hot-fix,那么现在就在hot-fix分支上。
所以切换分支的本质就是移动HEAD指针。
GIt底层就是两个指针,HEAD指向分支,分支指向具体的版本。
Git有本地库,个人编写的代码都会提交到本地库中生成历史版本。如果想进行团队协作,查看别人的代码或让别人查看自己的代码,则需要用到远程库(代码托管中心,如GitHub、Gitee)。
Git团队协作又分为团队内协作和跨团队协作。
A创建了自己的本地库,想让自己团队内其他成员查看,就将自己的本地库 push(推送)
到了远程库。B刚加入团队,什么也没有,就从远程库 clone(克隆) 了一份A的本地库到自己的本地库中,这时B的本地库就和A的本地库一模一样了。B更新了一些内容并提交到了自己的本地库,为了让A查看更新的内容,B就将自己的本地库 push(推送) 到了远程库【注意:必须有push权限,即只有属于该团队的人才能push到远程库】。A从远程库 pull(拉取) 了更新的内容。至此,A、B、远程库的内容都完全一样了。
简单理解:如果一开始什么都没有,需要从远程库 clone(克隆) 生成自己的本地库。等有了本地库之后,可以从远程库 pull(拉取) 更新的内容。
在上面的例子中,A和B属于同一个团队。但是现在发现A和B的团队开发的代码有一点问题,想要让团队外的大佬甲帮忙修改一下。这时甲可以 fork(叉子,可以理解为复制) A团队的远程库到自己的远程库中,然后甲从自己的远程库中 clone(克隆) 生成自己的本地库,甲修改了一些内容并提交到了自己的本地库,甲就将自己的本地库 push(推送) 到了甲的远程库。然后甲发出 pull request(拉取请求) ,A的团队 审核 过之后发现甲的代码没问题就可以将甲的远程库 merge(合并) 到自己团队的远程库。A和B从自己团队的远程库 pull(拉取) 了更新的内容。
通过对Git团队协作机制的学习可以更好的理解:Git版本控制都是在本地库中进行的,因此称Git为分布式版本控制系统。
GitHub官网:https://github.com
远程库的名字最好与本地库的名字一样。
远程仓库操作:
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
后三条命令经常使用。
创建远程库别名命令:
git remote -v
查看当前所有远程地址别名。git remote add 别名 远程地址
起别名。创建远程库别名的好处在于,远程库的链接(HTTPS)太长了,这时可以给链接起别名,以后进行push和pull时就可以使用别名进行。
起别名的规则:别名最好与库名保持一致。
推送本地分支到远程仓库的命令:git push 别名 分支
。(如果没有起别名,直接用远程库地址也可以。同时注意这里推送的单位是分支)。
还记得前面提到的凭据管理器吗(在安装Git时提过)。
凭据管理器:【因为要使用Git客户端对远程库进行push(推送)和pull(拉取),不可能每次使用Git客户端都要登录,因此凭据管理器可以记录登录行为,只要登录一次,后面便不需要登录了。】
可以在Windows搜索框中搜索凭据管理器:
在第一次使用Git将本地分支推送到远程仓库之前,可以看到凭据管理器中没有github:
第一次使用Git将本地分支推送到远程仓库时,会弹出窗口登录GitHub账号:
选择第一个在浏览器中登录验证会在浏览器中出现如下界面,验证账号即可:
使用Git将本地分支推送到远程仓库之后,就会发现凭据管理器中出现了github,以后在push或者pull时便不必再验证账号了:
推送成功后可以在GitHub上查看:
拉取远程库分支到本地库的命令:git pull 远程库地址别名 远程分支名
。(如果没有起别名,直接用远程库地址也可以。同时注意这里推送的单位是分支。将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并)。
下面直接在远程库中编辑代码,修改远程库中的内容,以此来模拟远程库内容改变(实际应该是在团队开发中其他成员提交了代码导致远程库内容改变)。
下面开始拉取远程库分支到本地库:
要随时保证 本地库 = 远程库。即要随时保持本地库的代码是最新的状态。
克隆远程库到本地的命令:git clone 远程地址
。 (将远程仓库的内容克隆到本地。本地没有这个远程库,克隆一个远程库到本地生成本地库)
注:
clone克隆代码是不需要登录GitHub账号的,因为要clone克隆的远程库为公共库
,而公共库的读权限是没有限制的。
克隆完后会发现在git-clone下有了本地库git-demo。同时不仅有hello.txt,还有 .git 文件。
这就说明clone克隆干了三件事:
1、拉取代码
2、初始化本地库
3、创建别名
拉取代码—>hello.txt
初始化本地库—> .git 文件夹
创建别名:
团队内协作机制已在上面“Git团队协作机制”章节中讲到:
假设在上面的内容中是A创建了远程库git-demo,B clone克隆了远程库git-demo到本地生成自己的本地库。
假设刚开始A团队中仅有A一个人,B不属于该团队(公共库的读权限是没有限制的,任何人都可以clone克隆远程库,查看远程库)。现在B clone克隆了远程库到本地生成自己的本地库后对自己的本地库做了修改,如果此时B要将自己的本地库push推送到A团队的远程库,则会出现:
git push https://github.com/LXL1716812333/git-demo.git master
remote:Permission to LXL1716812333/git-demo.git denied to liuxinlongzzu
fatal:unable to access ‘https://github.com/LXL1716812333/git-demo.git/’: The requested URL returned error:403
意思是B没有权限push推送到A团队的远程库。
只有同一个团队的成员才可以往自己团队的远程库中push推送代码,团队外的人没有权限push推送。
邀请成员加入团队(现在A邀请B加入自己的团队):
登录A的GitHub账号,进入要进行团队协作的远程库,点击Settings-Collaborators:
复制邀请函(实际上是一个链接:https://github.com/LXL1716812333/git-demo/invitations),将其发送给要邀请的成员:
被邀请的成员B打开邀请函(链接):
被邀请的成员B同意加入该团队后,就能在B的GitHub账号上看到该团队的远程库。此时B已经是A团队的成员了,就拥有了push推送到A团队远程库的权限。
B将代码push推送到团队的远程库后,A应该将远程库更新的内容pull拉取到自己的本地库,随时保持本地库=远程库。
跨团队协作机制已在上面“Git团队协作机制”章节中讲到:
在GitHub中搜索项目:
Fork(将他人的远程库复制一份至自己的账号中,生成自己的远程库):
pull request:
如果对Fork过来的远程库没有做任何修改,则在 New pull request 界面会显示:
下面对Fork过来的远程库做些修改(实际跨团队协作都是Fork他人的远程库到自己账号中生成自己的远程库,然后clone克隆下来,在本地修改完以后push推送到自己的远程库,然后发起pull request):
对Fork过来的远程库做完修改后再pull request - New pull request (这里还会把修改的代码展示出来):
GitHub有聊天的功能(全球最大的单身交友网站):
跨团队协作中甲发起pull request,然后A可以在自己的GitHub账号中查看到该pull request:
A查看甲修改的代码进行审核:
A可以看到甲修改了哪里:
A审核通过之后,可以将甲修改的代码Merge合并到自己的远程库:
至此,A团队就将甲修改的代码放到了自己的远程库中,A团队内的人就可以pull拉取更新的内容到本地库,时刻保持本地库=远程库。
前面连接远程库使用的都是HTTPS协议。可以看到远程仓库中还有一个SSH的地址,因此也可以使用SSH进行访问。
但是提示上图蓝色内容时还无法使用SSH协议,需要添加公共的SSH秘钥。添加公共SSH秘钥的步骤:
下面使用Git命令生成 .ssh 文件:
ssh-keygen -t rsa -C 1716812333@qq.com
其中ssh-keygen
是生成SSH免密登录的私钥和公钥的命令,-t
是指定哪种加密算法生成,rsa
是一种著名的非对称加密协议,-C
是描述,后面紧跟邮箱,说明这个免密登录是对该邮箱的GitHub账号准备的。
运行Git命令后,在该目录下就出现了 .ssh 文件:
复制公钥,然后将公钥粘贴到GitHub账号里:
设置好公钥以后,那么在当前电脑上连接该GitHub账号时就不必反复输入账号密码了,比较方便。
下面使用SSH协议:
直接在GitHub中进行编辑,修改远程库。
pull拉取远程库更新的内容至本地库:
修改本地内容,使用SSH协议进行push推送至远程库:
1、Eclipse特定文件
2、Idea特定文件
.idea
文件夹下的内容以及 .iml
文件都不需要让Git进行管理,因此需要让Git忽略这些文件。在Idea项目中,只让Git管理 pom.xml
和代码。
3、Maven工程的target目录
为什么要忽略这些文件?
答:这些文件与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽IDE工具之间的差异。
怎么忽略?
答:创建忽略规则文件 xxxx.ignore
(前缀名随便起,后缀名必须是ignore,建议起名 git.ignore
)。这个文件的存放位置原则上在哪里都可以,为了便于让 ~/.gitconfig 文件引用,建议也放在用户家目录下(C盘-用户-用户名)。
git.ignore文件模版内容如下(想忽略什么文件,直接写在里面即可。.idea
表示忽略该文件,*.iml
表示忽略所有iml文件):
# Compiled class file *.class # Log file *.log # BlueJ files *.ctxt # Mobile Tools for Java(J2ME) .mtj.tmp/ # Package Files # *.jar *.war *.nar *.ear *.zip *.tar.gz *.rar # virtual machine crash logs,see http://www.java.com/em/download/help/error_hotspot.xml hs_err_pid* .classpath .project .settings target .idea *.iml
光创建git.ignore
还不够,还需要在家目录(C盘-用户-用户名)下的.gitconfig
文件中引用git.ignore
文件:
[core]
excludesfile = C:/Users/Mao/git.ignore
# 注意这里要使用正斜线( / ),不要使用反斜线( \ )。
# Mao是这台电脑的用户名
定位Git程序:
想在Idea中使用Git,还需要配置一下,告诉Idea去哪里找Git程序。
打开Idea,创建Maven项目:
定位Git程序。File-Settings-Version Control-Git。
配置好Git忽略文件,在Idea中定位到Git程序,至此在Idea中便可以使用Git进行版本控制了。
下面是在Idea中初始化本地库的步骤:
下面调出独立的Commit窗口,显示的信息更加丰富:
独立出来的Commit窗口信息更加丰富,能显示哪些代码做了修改:
值得注意的一点,对提交后的代码修改后,文件名会变为蓝色,蓝色表示该文件被追踪过(被添加到暂存区过),但是又被修改了。可以对这些文件再次添加到暂存区,然后再提交。其实也可以直接在Idea中提交,这也是没问题的。
切换版本:
版本可以向前穿梭,也可以向后穿梭。在Idea中切换版本还是比较简单的。
现在在hot-fix分支上修改GitTest.java文件,发现修改后文件名变蓝色了。前面说过,在Idea中修改后可以添加到暂存区,然后提交本地库;也可以直接提交本地库。待会直接提交本地库。
提交本地库:
学会看日志信息Log:
合并分支(正常合并):
冲突合并是开发过程中更常见的情况。
冲突产生的原因(同上面“Git分支操作”章节中 冲突合并 一样):
合并分支时,两个分支在同一个文件有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。
在上面正常合并之后,master分支与hot-fix分支已经同步。现在切换为hot-fix分支,对其进行修改:
在master分支上对同一个文件GitTest.java文件做修改:
这时两个分支在同一个文件GitTest.java上有两套完全不同的修改。这时再将hot-fix分支合并到master分支时便会出现冲突。
冲突合并:
IDEA是默认安装有GitHub插件的,如果没有则在Plugins中下载GitHub插件就可以看到了:
添加GitHub账号:
当然也可以选择使用GitHub账号的Token口令登录:
GitHub账号生成Token口令:
正常情况下是先在GitHub账号中创建一个远程仓库,然后在IDEA中push推送工程项目。但是在IDEA中安装有GitHub插件,该插件可以直接将IDEA中的工程项目分享到GitHub上面,因此在GitHub账号中创建远程仓库这一步骤可以省略。
分享工程到GitHub:
在GitHub账号中也可以看到从IDEA工程项目分享得来的远程库:
从IDEA分享工程项目到GitHub等于先在GitHub中创建远程库,然后进行push推送。
小插曲:发现在IDEA的顶部Tab中VCS的位置变为了Git,如下所示:
将其变回来:File - Settings - Version Control - Directory Mappings,将Git换为none即可。
这样顶部Tab的VCS就回来了:
其实顶部Tab中VCS的位置变为Git,也可以将IDEA的工程项目分享到GitHub上:
VCS(Version Control Settings,版本控制工具设置),当该项目交给Git管理时,VCS的位置就会变为Git。
push推送本地库代码至远程库:
复制SSH链接:
push推送成功:
回到GitHub中查看:
注意:
push是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,push的操作是会被拒绝的。也就是说,想要push成功,一定要保证本地库的版本要比远程库的版本高!因此在动手改本地代码之前,一定会先检查下远程库跟本地库代码的区别!如果本地的代码版本已经落后,切记要先pull拉取一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送!
因此在业内使用Git时有一个小技巧:push之前先pull,先pull拉取到最新的代码,在最新的代码上做修改,然后push。
直接在GitHub中对GitTest.java进行编辑,以此来模拟团队开发中远程库更新,导致远程库与本地库不一致的情况,需要进行pull拉取,将更新的内容同步至本地库,保持本地库=远程库。
注意:
pull拉取远程库的时候尽量不要修改本地库,如果远程库已经修改,并且本地库也已经修改,这时也会遇到代码合并的问题(pull是拉取远端仓库代码到本地,如果远程库代码和本地库代码不一致,会自动合并,如果自动合并失败,还会涉及到手动解决冲突的问题)。
下面演示最正常的pull,即没有修改本地库,不涉及冲突问题:
下面演示发生冲突时的pull,即在远程库发生更新后,又同时修改了本地库,涉及冲突问题:
直接在GitHub中对GitTest.java进行编辑,以此来模拟团队开发中远程库更新,导致远程库与本地库不一致的情况,需要进行pull拉取,将更新的内容同步至本地库,保持本地库=远程库。
在修改远程库后,再修改本地库,此时进行pull时,便会出现代码冲突,需要手动解决冲突(类似合并冲突):
用同样的方式进行pull:
此时出现了代码合并冲突,需要手动解决:
前面已经将该IDEA工程项目分享到GitHub上,即拥有了远程库,将代码备份到了该远程库里。
下面演示将该项目代码的本地库删除,然后从远程库clone克隆一份再生成本地库。(注意这里只是为了演示在IDEA中进行clone克隆操作,在实际开发中不能轻易删除本地库。实际开发中删除本地库一定要在有备份的情况下删除,这里已经在GitHub远程库中有备份。在实际开发中一般都是新成员加入团队时需要从该团队的远程库中clone克隆一份生成自己的本地库,然后在本地库上进行开发。):
删除项目本地库:
在IDEA中clone克隆该项目远程库生成本地库:
众所周知,GitHub服务器在国外,使用GitHub作为项目托管网站,如果网速不好的话,严重影响使用体验,甚至会出现登录不上的情况。针对这个情况,可以使用国内的项目托管网站----码云。
码云是开源中国推出的基于Git的代码托管服务中心,网址是https://gitee.com/,使用方式跟GitHub一样,而且它还是一个中文网站。
码云是仿照GitHub开发的,使用起来与GitHub几乎没有区别,并且码云还是中文的。
进入Gitee官网https://gitee.com/:
可以注册账号,也可以使用GitHub账号进行登录
在Gitee上删除仓库:
在Gitee码云上创建远程仓库:
同样在Gitee也有HTTPS与SSH两种。也可以配置SSH免密登录,配置方法同GitHub一样。只不过在Gitee上用HTTPS就够了,因为Gitee服务器在国内,连接速度比较快。
IDEA默认不带Gitee插件,第一步要在IDEA中安装Gitee插件。
File - Settings - Plugins - Marketplace - 搜索Gitee - Install:
然后在IDEA中绑定Gitee账号:
File - Settings - Version Control - Gitee :(只有在IDEA中安装了Gitee插件后才会在Version Control下面看到Gitee)
这里使用Log in with Password(使用账号密码)进行登录:
注意在这里使用账号密码登录Gitee时不能使用手机号作为账号,而应该用邮箱号作为账号。
前面学过在可以将IDEA工程项目分享到GitHub上,这一步相当于先在GitHub上创建远程库,然后进行push推送。当然这里也可以将IDEA工程项目分享到Gitee上,这一步相当于先在Gitee上创建远程库,然后进行push推送。
将IDEA工程项目直接分享到Gitee:
这里我用先在Gitee上创建远程库,然后进行push推送的方式。前面在“Gitee码云”章节的“创建远程库”部分创建了远程库git-test。下面进行push推送:
push推送成功:
再练习一下在Gitee上进行push。
先修改工作区文件:
直接提交本地库:
push推送Gitee远程库:
push推送成功:
直接在Gitee中对GitTest.java进行编辑,以此来模拟团队开发中远程库更新,导致远程库与本地库不一致的情况,需要进行pull拉取,将更新的内容同步至本地库,保持本地库=远程库。
pull拉取:
pull拉取成功:
在Gitee上clone克隆远程库到本地的方法同GitHub一样。
Gitee提供了直接复制GitHub项目的功能(在Gitee中导入GitHub项目),方便做项目的迁移和下载。
考虑这样一种情况:由于网络原因,下载GitHub上面的项目非常慢,或者直接下载失败,这时可以将该GitHub项目复制到Gitee上面,然后从Gitee上面下载。
在我的GitHub账号中有一个名为 git-demo 的远程库,下面演示将该项目复制(迁移、导入)到Gitee中:
登录Gitee账号,进入新建仓库页面,不要输入仓库名称,直接点击该页面中的“点击导入”:
迁移成功:
Gitee复制GitHub项目后还有强制刷新功能:项目仓库从GitHub上复制到Gitee上,如果该项目在GitHub中进行了更新,可以在Gitee上进行强制刷新,从而获取该项目在GitHub中的更新内容,实现强制同步。
直接在GitHub中对hello.txt进行编辑,以此来模拟该项目在GitHub中远程库的更新:
到这一步,该项目在GitHub中的远程库已经更新了,同时该项目之前从GitHub上复制(迁移、导入)到Gitee上,下面演示如何进行强制刷新,获取该项目在GitHub中的更新内容,实现强制同步:
强制刷新(强制同步)在实际开发中用的比较多。
GitLab是在局域网上的代码托管平台。
GitLab是基于网络的Git仓库管理工具。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
GitLab官网https://about.gitlab.com/ 。
官网首页:
进入官网进行安装:
GitLab一般都是安装在服务器上,自己学习时创建虚拟机作为服务器即可:
点进CentOS 7查看安装指南:
安装GitLab需要准备一个系统为CentOS 7以上版本的服务器,要求内存4G以上,磁盘最好50G以上。
关闭防火墙,并且配置好主机名和IP,保证服务器可以上网。
此教程使用虚拟机:
在哔哩哔哩搜索“Hadoop教程(尚硅谷)”,在Hadoop入门部分详细讲解了如何克隆虚拟机,虚拟机模版如何安装等。
进入虚拟机(系统为CentOS 7),桌面右键打开终端,修改IP地址:
修改主机名:
修改完主机名和IP地址,需要进行重启。重启命令 : reboot。
下面配置Windows的hosts文件及Xshell链接地址。
首先配置Windows的hosts文件:C盘 - Windows - System32 - drivers - etc - hosts:
将刚才服务器(虚拟机)的IP地址和主机名配置到hosts映射文件中:
再来配置Xshell链接:
配置好Xshell链接后,点击gitlab-server,连接该主机:
这里安装的是 gitlab-ce 即社区版。
Yum在线安装 gitlab-ce时,需要下载几百M的安装文件,非常耗时,所以最好提前把所需RPM包下载到本地,然后使用离线rpm的方式安装。
gitlab-ce的rpm安装包下载地址:https://packages.gitlab.com/gitlab/gitlab-ce 。
下载下来该安装包后,直接将该安装包上传到服务器(虚拟机)/opt/module 目录下即可。
关于GitLab安装可以参考官网:
可以看到,GitLab安装步骤比较繁琐,这里参考GitLab官网编写了一个GitLab的安装脚本,直接使用该脚本进行安装即可(该脚本就是从官网上抄下来的,不必深究)。
脚本内容如下:
[root@gitlab-server module] # vim gitlab-install.sh sudo rpm -ivh /opt/module/gitlab-ce-13.10.2-ce.0.el7.x86_64.rpm sudo yum install -y curl policycoreutils-python openssh-server cronie sudo lokkit -s http -s ssh sudo yum install -y postfix sudo service postfix start sudo chkconfig postfix on curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash sudo EXTERNAL_URL="https://gitlab.example.com" yum -y install gitlab-ce
该脚本的使用方法:
写好GitLab安装脚本后此时该脚本还不能执行,需要给该脚本增加执行权限:
有了执行权限后,下面开始执行该脚本,开始安装gitlab-ce。
注意:此时一定要保证服务器(虚拟机)可以上网(因为在上面GitLab安装脚本中使用到了 yum install,这是“在线安装”命令)。
安装成功:
执行 gitlab-ctl reconfigure
命令初始化GitLab服务,过程大概需要几分钟:
执行 gitlab-ctl start
命令启动GitLab服务,如需停止,执行 gitlab-ctl stop
命令。
GitLab服务启动之后,就可以使用浏览器访问GitLab了。
使用主机名或者IP地址即可访问GitLab服务(使用主机名进行访问的前提是需要先配置Windows的hosts文件,在前面已经配置过了)
浏览器使用IP地址访问GitLab:
浏览器使用主机名访问GitLab(通过主机名访问GitLab服务的前提是先在Windows的hosts文件中配置映射文件):
首次登录GitLab之前,需要先修改下GitLab提供的root账号密码(GitLab默认给我们提供了一个root账号),并且该密码的复杂度有要求,密码要求8位以上,同时包含大小写字母和特殊符号。因此这里修改密码为 Xinlong.123456
然后使用修改后的密码登录GitLab:
GitLab登录进来的首页:
远程仓库创建成功:
新版IDEA已经默认安装了GitLab插件,如果没有安装,需要安装过后才能使用。
File - Settings - Plugins - Marketplace - 搜索GItLab - Install :
安装好GitLab插件后,就可以到File - Settings - Version Control - GitLab 添加GitLab服务器:
添加好GitLab服务器后就可以将本地库push推送到远程库中了。
登录GitLab提供的root账号,找到前面创建的远程库git-test,点击下方的Clone,选择HTTP协议链接。需要注意的一点是这里默认给的是案例链接http://gitlab.example.com/root/git-test.git,需要将中间的gitlab.example.com替换给GitLab服务器的主机名gitlab-server。所以进行push推送时使用的GitLab远程库链接地址应为http://gitlab-server/root/git-test.git。
push推送:
然后选择新建的GitLab远程库链接地址别名进行push推送。
push推送成功:
只要GitLab的远程库链接定义好以后,对GitLab远程库进行push、pull和clone操作和GitHub、Gitee码云一致。
Git常用命令章节只是列举了在使用Git中经常用到的命令,实际Git中的命令有很多,但只需要熟记那几个常用的命令即可。(同样Linux的命令也有很多,只需要熟记常用的命令即可)。
GitHub操作章节详细学习了使用GitHub。
IDEA集成Git、GitHub章节详细学习了在IDEA中使用Git和GitHub,这在实际开发中是经常用到的,很重要。
越来越多的公司开始使用Gitee码云,因为其服务器在国内,连接速度非常快;同时是中文的,很友好。
也有一些公司会搭建自己内部的GitLab服务器。
注意 1:
push是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,push的操作是会被拒绝的。也就是说,想要push成功,一定要保证本地库的版本要比远程库的版本高!因此在动手改本地代码之前,一定会先检查下远程库跟本地库代码的区别!如果本地的代码版本已经落后,切记要先pull拉取一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送!
因此在业内使用Git时有一个小技巧:push之前先pull,先pull拉取到最新的代码,在最新的代码上做修改,然后push。
注意 2:
pull拉取远程库的时候尽量不要修改本地库,如果远程库已经修改,并且本地库也已经修改,这时也会遇到代码合并的问题(pull是拉取远端仓库代码到本地,如果远程库代码和本地库代码不一致,会自动合并,如果自动合并失败,还会涉及到手动解决冲突的问题)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。