一、分支概念
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止
到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。
HEAD 严格来说不是指向提交,而是指向master,而 master才是指向提交
的,所以,HEAD指向的就是当前分支。
开始的时候,master分支是一条线,Git 用 master 指向最新的提交,再用
HEAD指向 master,就能确定当前分支,以及当前分支的提交点。每次提
交,master分支都会向前移动一步,这样,随着你不断提交,master分支
的线也越来越长。
二、创建分支过程
1、git仓库的建立
[root@git ~]# yum search git|grep git.x86
[root@git ~]# yum -y install git
[root@git ~]# rpm -qa|grep git
git-1.8.3.1-25.el7_9.x86_64
linux-firmware-20180220-62.git6d51311.el7.noarch
crontabs-1.11-6.20121102git.el7.noarch
[root@git ~]# rpm -ql git
1)创建一个空目录,使用git指令一定要cd到初始化之后的目录,init命令初始
化
[root@git ~]# mkdir /yy000
2)进入这个目录
[root@git ~]# cd /yy000/
3)执行git init 指令
[root@git yy000]# git init # 初始化工作区(yy000)和仓库(.git)
初始化空的 Git 版本库于 /yy000/.git/
4)发现隐藏目录.git
[root@git yy000]# ls -a
. .. .git
[root@git yy000]# cd .git/
[root@git .git]# ls
branches description hooks objects
config HEAD info refs
[root@git .git]# cd ..
[root@git yy000]# vim Test.java
public class Test{
public static void main(String [] args){
System.out.println("hello world");
}
}
[root@git yy000]# git log
fatal: bad default revision 'HEAD'
2、常用指令:
格式:git add .|文件名 # 将修改的文件提交的暂存区域
git commit -m "说明" 将暂存区的数据保存到仓库
git log 查看提交日志
[root@git yy000]# git config --global user.name caizijuan # 放进仓库
[root@git yy000]# git config --global user.email 19119921829@163.com
[root@git yy000]# echo "//这是一行java注释,不会被编译,能提高文件的可读
性" > Test.java # 修改Test.java文件,添加一行注释
[root@git yy000]# cat Test.java
//这是一行java注释,不会被编译,能提高文件的可读性
[root@git yy000]# git log
commit 7685d39974154b97bb156ca51d3da0beb0650266
Author: caizijuan <19119921829@163.com>
Date: Thu Jul 25 10:48:07 2024 +0800
新建了一个Test..java文件,这是新建的
[root@git yy000]# git add . # add后面加.表示当前目录所有文件
[root@git yy000]# git commit -m "这是第二次提交项目"[master dc3c99e] 这是第
二次提交项目
1 file changed, 1 insertion(+), 5 deletions(-)
[root@git yy000]# echo "//又加了一个注释" >> Test.java
[root@git yy000]# cat Test.java
//这是一行java注释,不会被编译,能提高文件的可读性
//又加了一个注释
[root@git yy000]# git log # 没有commit就不会产生日志
[root@git yy000]# git add .
[root@git yy000]# git commit -m "将缓存中的内容提交 到仓库" # -m:会调用
终端的注释
[root@git yy000]# git log # 新增了
[root@git yy000]# echo "//再次添加注释" >> Test.java[root@git yy000]# cat Test.java
//这是一行java注释,不会被编译,能提高文件的可读性
//又加了一个注释
//再次添加注释
[root@git yy000]# git add .
[root@git yy000]# git commit -m "在提交仓库的同时也为自己创建了一个还原点"
[root@git yy000]# git branch # 查看当前仓库的分支
* master
3、分支:(意义:让一个项目有多重可能性)
1)分支的创建
git branch 新分支名称
2)切换分支
git checkout 分支名称
git checkout -b新分支名称 //创建的同时进行切换
3)删除分支,要求是分支已经合并
git branch -d 分支名 git branch -D 分支名 //强制删除
[root@git yy000]# git branch -d abranch
[root@git yy000]# git branch -d bbranch
[root@git yy000]# git branch -d cbranch
[root@git yy000]# git branch -d dbranch
[root@git yy000]# git branch
* master
当前只有一个主分支,工作完成后,其他分支都会合并到主分支
4)查看分支 git branch 有几行,就有几个分支,*标注当前所在的分支
git branch git status
5)分支合并
git merge分支名称
git checkout abranch //切换到a分支
git merge bbranch //在a分支下合并b分支
6)分支冲突(将两个分支合并时产生的)
产生的原因:合并的时候有可能出现在文件冲突,即主分支或其他分支都修了
这个文件,此时合并时不知道以哪个分支为主
解决:手动修改一部分,只保留主分支修改的内容再提交
[root@git yy000]# git add Test.java # git add表示添加缓存
[root@git yy000]# git commit -m "新建了一个Test..java文件,这是新建的"
创建newbranch分支,修改内容
[root@git yy000]# echo "//我是主分支 ,我修改了文件" > Test.java
[root@git yy000]# git checkout -b newbranch
[root@git yy000]# git branch
master
* newbranch
[root@git yy000]# cat Test.java
//我是主分支 ,我修改了文件
[root@git yy000]# echo "//我是newbranch分支" > > Test.java
[root@git yy000]# cat Test.java
//我是主分支 ,我修改了文件
//我是newbranch分支
[root@git yy000]# git checkout newbranch
[root@git yy000]# git status
位于分支 newbranch
[root@git yy000]# git add .
[root@git yy000]# git commit -m "abcd"
回到主分支修改内容
[root@git yy000]# git checkout master
[root@git yy000]# cat Test.java # 发现内容并未改变
[root@git yy000]# echo "eft" >> Test.java
[root@git yy000]# git add .
[root@git yy000]# git commit -m "mntyuo"
[root@git yy000]# git branch
* master
newbranch
将newbranch合并到主分支
[root@git yy000]# git merge newbranch
自动合并 Test.java
冲突(内容):合并冲突于 Test.java
自动合并失败,修正冲突然后提交修正的结果。
[root@git yy000]# cat Test.java
<<<<<<< HEAD
//这是一行java注释,不会被编译,能提高文件的可读性
//又加了一个注释
//再次添加注释
// 我是a员工,我不骄傲
我是b员工
eft
=======
//我是主分支 ,我修改 了文件
//我是newbranch分支
>>>>>>> newbranch
解决:手动修改一部分,只保留主分支修改的内容再提交
[root@git yy000]# vim Test.java
我是b员工
eft
[root@git yy000]# git add .
[root@git yy000]# git commit -m "合并修正"
[master b1f3f55] 合并修正
[root@git yy000]# git log
项目实战
需求:abc三人实现一个接口Test.java,但一个文件在同一时间只能被一个用户
编辑。
- 切换到master分支
格式:git branch 分支名称 git checkout -b 分支名称 //分支的同时创建分
支
[root@git yy000]# git checkout master
已经位于 'master'
[root@git yy000]# ls
Test.java
[root@git yy000]# cat Test.java
//这是一行java注释,不会被编译,能提高文件的可读性
//又加了一个注释
//再次添加注释
2、创建分支 abranch
[root@git yy000]# git branch abranch
[root@git yy000]# git branch # 查看当前所在的分支及总分支
abranch
* master
3、切换分支 'abranch'
[root@git yy000]# git checkout abranch
切换到分支 'abranch'
[root@git yy000]# git branch
* abranch
master
[root@git yy000]# cat Test.java
//这是一行java注释,不会被编译,能提高文件的可读性
//又加了一个注释
//再次添加注释
4、添加内容
[root@git yy000]# echo "// 我是a员工,我不骄傲" >> Test.java
[root@git yy000]# cat Test.java
//这是一行java注释,不会被编译,能提高文件的可读性
//又加了一个注释
//再次添加注释
// 我是a员工,我不骄傲
[root@git yy000]# git add .
[root@git yy000]# git commit -m "a员工提交的内容"
[root@git yy000]# git branch # 主分支
abranch
* master
[root@git yy000]# cat Test.java # 没有此行(// 我是a员工,我不骄傲
)
[root@git yy000]# git checkout -b bbranch
切换到一个新分支 'bbranch'
[root@git yy000]# git branch
abranch
* bbranch
master
[root@git yy000]# cat Test.java
//这是一行java注释,不会被编译,能提高文件的可读性
//又加了一个注释
//再次添加注释
// 我是a员工,我不骄傲
[root@git yy000]# echo "我是b员工" >> Test.java
[root@git yy000]# git branch
abranch
* bbranch
master
[root@git yy000]# git checkout abranch
M Test.java
切换到分支 'abranch'
[root@git yy000]# cat Test.java
//这是一行java注释,不会被编译,能提高文件的可读性
//又加了一个注释
//再次添加注释
// 我是a员工,我不骄傲
我是b员工
5、测试
[root@git yy000]#mkdir abc
[root@git yy000]#touch efg
[root@git yy000]#git add abc/
[root@git yy000]#git commmit -m "更新一个目录"
[root@git yy000]#git add efg
[root@git yy000]#git commmit -m "新增了一个efg目录"
[root@git yy000]#git add .
[root@git yy000]#git commmit -m "所有文件都提交"
git拉取
环境准备
两台主机:git(192.168.2.27) lq(192.168.2.28)
1、安装git
[root@lq ~]# yum -y install git
2、作免密,连接到git主机
[root@lq ~]# ssh-keygen
[root@lq ~]# ssh-copy-id root@192.168.2.27
[root@lq ~]# ssh root@192.168.2.27
Last login: Thu Jul 25 14:02:56 2024 from 192.168.2.88
[root@git ~]#
3、复制git主机上的资料
[root@lq ~]# git clone 192.168.2.27:/yy000/.git
[root@lq ~]# ls
anaconda-ks.cfg soft yy000
[root@lq ~]# cd yy000/
[root@lq yy000]# ls
efg Test.java
[root@lq yy000]# ls -a # 查看隐藏文件
. .. efg .git Test.java
4、设置自己的姓名和邮箱并修改内容
[root@lq yy000]# git pull # 获取更新的内容
Already up-to-date.
[root@lq yy000]# git config --global user.name aaa
[root@lq yy000]# git config --global user.email juan@163.com
[root@lq yy000]# touch A.class
[root@lq yy000]# git add .
[root@lq yy000]# git commit -m "mnt"
在码云上创建项目并pull和push
仓库初始化
[root@lq ~]# git clone https://gitee.com/cai-zijuan/huajuan.git
[root@lq ~]# cd huajuan/
[root@lq huajuan]#
[root@lq huajuan]# ls
[root@lq huajuan]# mkdir -p src/main/java/
[root@lq huajuan]# ls
[root@lq huajuan]# touch src/main/java/Test.java
[root@lq huajuan]# tree src/
src/
└── main
└── java
└── Test.java
[root@lq huajuan]# git add .
[root@lq huajuan]# git commit -m "文件提交"
[root@lq huajuan]# git push # 输入账号和密码
[root@lq huajuan]# vim src/main/java/Test.java
public class Test{
public static void main(String [] args){
System.out.println("i shi ceshi test");
}
}
[root@lq huajuan]# git add .
[root@lq huajuan]# git commit -m "做测试"
[root@lq huajuan]# git pull # 查看最新的及被修改过的