git分支指针移动问题
使用git之前,我们必须git init初始化本地库,才能使用git命令
文件没有提交的时候是没有指针指向的
还有一点是,文件必须先添加到暂存区在添加到本地库
在提交到本地库
提交完了之后,就会创建一个指针比如上面是master第一次提交,指针指向了30f8956
现在我们创建test分支
Git branch可以查看当前处于什么分支
很明显可以看到创建分支之后,并且切换到新的分支之后,新的分支指针还是指向了最新提交的文件位置指针
如果我们在test分支在创建一个文件hello1.txt,添加到暂存区,提交到本地库
我们很明显可以看到test分支上,指针已经移动到最新提交的位置
切换到master分支看看指针在什么位置
它指向了在这个分支最新提交的位置,而且它看不见在test分支上面创建的文件,也就是下面的hello1.txt文件
上面就是整体指针移动过程:每个分支永远指向他最新修改的文件指针
假如两个分支共有一个文件,比如上面的hello.txt文件
现在master去修改了,并且已经提交到了本地库
它的指针自然是指向最新修改的位置
我们去看一下test分支,它的分支明显是还是指向它最新修改提交的位置。与其他分支无关
每一个分支只能查看到自己所处分支的文件
说一下文件merge的问题
如果你不知道你的文件被修改之后,有没有提交到本地库,那么就git status查看一下当前的文件状态,如果有修改没有被提交,就会爆红
现在就是master与test都修改了这个文件 ,合并就会冲突
上面合并的意思就是,当前处于test分支上面,我们就git merge 另外合并分支的名字
上面很明显就是冲突了,我们可以用git status查看哪一个文件冲突了,然后合并过来之后,多的文件是什么
这里很明显提示,多了m1.txt文件,然后冲突文件是hello.txt,我们直接去修改
这里冲突文件,整体是长下面这个样子
上面特殊符号可以全部删除
这样就解决冲突了
一张图说明git
分支之间的操作
这个 框里面的linux命令都可以用
操作开始:
在master分支里面创建了一个hello.txt,并且放入了一些数据进去
这个去查一下日志
问题:当你放入了暂存区,你去查看日志会报错
一个分支这个指针head永远会指向新提交的文件位置。
上面这个解释一下:
head->master 指向最新的提交版本的地址,也就是第三次提交的 hello1.txt
之前还提交过两次hello和两次hello1
现在我做这样一件事儿,我把hello1.txt 恢复第一次提交的版本
下面我们来创建另外一个分支pxx1
当你创建了一个分支之后,这个分支会默认指向这个本地仓库最新修改的文件。
分支创建之后,我现在是pxx这个分支,如果在这个分支我去修改了hello1.txt
然后我们去master分支
两个分支内容明显不一致
下面进行一个分支合并
我们要让这两个文件内容一直,就是helllo1.txt的内容
上面就是把pxx分支合并到master上面
这里pxx改过,master没动,所以,直接会把pxx覆盖过去
但是我们如果把master分支改动呢
下面就是这两个文件都走了改动,并且提交到了本地库
这个时候因为文件都做了改动,所以会造成冲突
我们要去修改如下这个文件
上面就已经把pxx中文件内容给合并过来了
Git团队协作机制
下面说一下git的工作流程
Github远程库操作
自己去注册个账号使用
注意现在这里要用token密码登录
讲一下如何从github上面clone一个项目下来
团队协作往一个库推送代码需要注意的问题
比如我是之前是pxx520pxx创建这个远程库,那么我来推送当来是没有问题的,那么如果换一个用户来向我这个库进行推送可以吗?肯定不是说,只要是一个用户来推送都是可以。这里如下操作
好像不管从本地文件什么位置进行push都可以上传到某个库里面
只不过如果我们从这个远程库中添加了一个collaborators合作者,那么就会在合作者远程的仓库看到我们添加者的这个远程库,并且可以上传代码
下面说一下关于文件从远程仓库push的问题
从仓库push ,很容易造成文件冲突问题,也就是说如果你在仓库改动了某个文件,又在本地库改动某个文件,在进行push的时候是肯定会造成问题的
IDEA集成git
这个文件是已经创建好的
下面去写一个git.ignore,这里面写上我们要忽略上传的文件后缀
大体内容如下
# 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/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
文件的
后缀名必须叫.ignore
搭建自己的代码托管平台gitlab
先克隆一台虚拟机出来
下面修改一下ip与主机地址
去参考一下e\linux这是我资料存放的地方
这里贴一篇文章
下面去Windows下面配置一把
IP与主机名的一个映射
下面我们写一个shell脚本来执行这个安装程序
gitlab-install.sh
sudo rpm -ivh /opt/module/gitlab-ce-13.10.2-ce.0.e17.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
#这段脚本可以不要,因为我们已经下载了rpm包
sudo EXTERNAL URL="http://gitlab.example.com" yum -y install gitlab-ce
rpm -e MySQL-server-5.6.25-1.el6.x86_64 --nodeps
在安装中会出现如下问题
软件包在安装过程中出现冲突
服务启动问题出错
默认创建一个root账户,我们需要自定义密码
关于文件各个分支合并单独文件的问题
先来说一下各个分支之间的一个整体合并,比如在test这个库下面,我们创建一个A分支,并且给它两个文件,一个d1.txt,一个d2.txt
下面把上面都创建一下
遇到一个问题
其实就是当前库没有任何提交,主分支还没有创建出来,那我们要去先创建一个文件,提交到暂存区然后提交本地库,我们先来看一下git的初始状态
有一个文件当前库,没有被追踪也没有被提交
那我吧这个文件删了,因为这个不是我要的
删了之后提示没有提交
上面就是创建在pxx1这个本地库上面创建一个master分支
下面我们实际业务操作
我们先来创建一个A分支
A分支第一次的指向是主分支第一次提交的指针
那现在有一个问题是如果主分支又提交了指针,那么A分支的指针会跟着改变吗?明确说,不会,因为其实就是说这里是给主分支A一个指向初始指向,并没有其他的,不信,我们来测试一下,比如我们把master1这个文件在用master分支给改变一下
上面我们执行了三次提交,A还是在初始位置。
那么现在我切换一下分支,比如切到A这个分支
他还是停留在第一次文件停留的版本,也就是分支之间的操作不会影响你当前的指针位置
现在还是回到我们两个分支合并上面来讲
这里在来说一下分支合并
我创建一个pxx1分支,然后下面创建两个文件 p1.txt p2.txt
这个库目前的指针指向了pxx1,它创建了一个文本,p1.txt,内容如下:
下面再来创建一个分支pxx2,它可以去处理的所有文件,只不过指针不同嘛
提交暂存区,提交本地库
上面值得注意的就是,这也是分支操作文件的关键,我们虽然不同的分支都是操作同一个文件,但是他们把内容指针指向的都不一样,比如pxx1->84db7d9,也就是pxx1第一床创建px1.txt,然后现在是pxx2又去改变了pxx1.txt文件,他指向了pxx2->93c847,所以两个分支的pxx1.txt内容并不一样
下面我们把pxx1当做主分支,让pxx2去合并当pxx1上面,也就是把pxx2开发的新功能提交过去,当下如果直接合并,是不会提示冲突的,因为只是pxx2修改了,ppxx1没动
下面我们切换到pxx1上面,然后让pxx2过来
这个时候指针就都指向了同一个修改点。
在我们实际业务开发中,我们把主体开发项目用一个master分支保存,然后我们弄几个副本分支去开发不一样的功能。
当我们想要把这个功能放到主分支上去的时候,我们直接在主分支merge副本分支就可以l了。这个时候副本的所有修改都会到主分支里面。
说一下项目推送push
一般我们会往github与gitee上面进行推送,先来说一下如果在github上面通过token登录保存到IEDA里面我们怎么去获得令牌,点击旁边的generate就能进入下面的页面
GitHub老是会因为网络的问题出现push不上去,这里我们说一下gitee,国内的托管平台
当我们在客户端操作的时候,最好做如下步骤
首先,我们先git pull origin master我们先pill下来远程库,他只会自动给我们Merge文件,而且都是当前分支最新版本提交的,我们先pull的原因也是为了必变push冲突问题,也就是文件不一致,我们无法上传的,我们只有解决了本地与远程的conflict冲突,才能push
我们push的地址origin可以通过下面定义
我们可以定义多个不同的origin地址,以便进行不同的git地址推送。注意新增一个文件或者修改一个文件,必须先提交暂存区,在提交本地库,然后在push
针对于IDEA里面的操作就是,下面我们记得可以先pull一下拿到最新版本
下面这个可以看提交状态
可以在下面的位置创建新的分支
远程修改文件文件之后,我们本地先pull出现了冲突的问题
这个时候,比如出现了一个问题的是 我们在远程仓库修改了readme.md文件,然后本地没有动,还是之前,那么pull的时候就会出现一个问题。文件不一样的问题,那么这个时候,我们按照如下方式来做
右键出现了冲突的文件,然后把他们隐藏起来
隐藏起来了,就表示这个文件没了,没了之后在pull就没有问题了
如果我们想要源文件,并且去解决冲突,可以如下
我们打开冲突然后解决
好了,祝大家早安午安晚安。