Git本地分支以及远程分支管理

文章目录

  • 一、查看分支
  • 二、git branch创建分支
  • 三、git checkout -b 创建分支
      • 1.在裸仓库中是不能使用git checkout -b 创建分支的
      • 2.在带有工作区的仓库中是可以使用git checkout -b 来创建分支的
  • 四、切换分支git checkout
  • 五、分支实例演示
      • 1.验证注意点1
      • 2.验证注意点2
  • 六、远程分支管理和本地分支建立关系
      • `1.git push和git pull参数详解`
        • `(1)git push用法`
        • `(2)git pull用法`
      • 2.在服务端建立分支,客户端拉取
          • (1)在客户端克隆仓库,并且提交数据
          • (2)在服务端创建分支
          • (3)在客户端拉取远程分支方法1
          • (4)在客户端拉取远程分支方法2
      • 3.在客户端建立分支,然后推送到服务端
  • 七、删除分支
      • 1.删除本地分支
      • 2.删除远程分支

一、查看分支

查看命令介绍:
1.列出所有分支  包括远程分支和本地分支
git branch -a
    
例子:
[root@node3 base1]# git branch -a
* master
  remotes/origin/jishubu
  remotes/origin/master

2.只列出远程分支
git branch -r

[root@node3 base1]# git branch -r
  origin/jishubu
  origin/master
   
3.只列出本地分支
git branch

例子:
[root@node3 base1]# git branch
* master

二、git branch创建分支

#当前只有一个master主分支
[root@node1 base1]# git branch
* master

#创建了一个test分支
[root@node1 base1]# git branch test
[root@node1 base1]# git branch
* master
  test

三、git checkout -b 创建分支

1.在裸仓库中是不能使用git checkout -b 创建分支的

[root@node1 data]# cd base1/
[root@node1 base1]# ls
branches  config  description  HEAD  hooks  info  objects  readme  refs
[root@node1 base1]# git branch
* master
  test
[root@node1 base1]# git checkout -b test1
fatal: This operation must be run in a work tree

2.在带有工作区的仓库中是可以使用git checkout -b 来创建分支的

[root@node1 ~]# mkdir git_test_base
[root@node1 ~]# git init git_test_base/
Initialized empty Git repository in /root/git_test_base/.git/
[root@node1 ~]# cd git_test_base/
[root@node1 git_test_base]# ls
[root@node1 git_test_base]# touch test
[root@node1 git_test_base]# git add -A
[root@node1 git_test_base]# git  commit -m '1'
[master (root-commit) 16381f9] 1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test

#我们发现提交完数据之后会自动创建一个master分支
[root@node1 git_test_base]# git branch
* master

#我们使用branch创建一个分支 是不会切换到新分支上,还停留在原理的分支上
[root@node1 git_test_base]# git branch test
[root@node1 git_test_base]# git branch
* master
  test

#而是用checkout -b 创建完分支后并且会自动切换到新的分支上
[root@node1 git_test_base]# git checkout -b test1
Switched to a new branch 'test1'
[root@node1 git_test_base]# git branch
  master
  test
* test1

四、切换分支git checkout

[root@node1 git_test_base]# git branch
* master
  test
[root@node1 git_test_base]# git checkout test
Switched to branch 'test'
[root@node1 git_test_base]# git branch
  master
* test

五、分支实例演示

注意点(以下表述是为了方便理解,真正原理并非如下叙述,真正原理是HEAD的指向问题):

1.当我们创建新的分支时,你在哪个分支上创建的新分支,就会把当前分支上的复制到新的分支上
2.不论在哪个分支的工作区中新增文件,其它分支都能看到,但是一旦提交了,就属于自己分支的内容了,其它 分支就看不到了,如果其它分支想看到,就需要合并分支了

1.验证注意点1

[root@node1 ~]# cd git_test_base/
[root@node1 git_test_base]# git init ./
Initialized empty Git repository in /root/git_test_base/.git/

#新增数据,git仓库会自动创建master主分支
[root@node1 git_test_base]# touch master1
[root@node1 git_test_base]# git add -A
[root@node1 git_test_base]# git  commit -m 'master1'
[master (root-commit) 7c6e8bb] master1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 master1

#master主分支出现
[root@node1 git_test_base]# git branch
* master

#创建测试分支,并且切换到zhangsan分支上
[root@node1 git_test_base]# git checkout -b zhangsan
Switched to a new branch 'zhangsan'
[root@node1 git_test_base]# git branch
  master
* zhangsan

#我们发现是可以看到master的文件的。
[root@node1 git_test_base]# ls
master1

2.验证注意点2

#我们在zhangsan分支上添加新文件
[root@node1 git_test_base]# git branch
  master
* zhangsan
[root@node1 git_test_base]# touch zhangsan
[root@node1 git_test_base]# echo "zhangsan" >> zhangsan 
[root@node1 git_test_base]# cat zhangsan 
zhangsan

#我们切换到master分支上,查看是否可以看到zhangsan未提交的数据
[root@node1 git_test_base]# git checkout master
Switched to branch 'master'
[root@node1 git_test_base]# ls
master1  zhangsan

#我们在master上是可以到zhangsan分支上未提价的数据的
[root@node1 git_test_base]# cat zhangsan 
zhangsan

我们在切换到zhangsan分支 提交zhangsan分支上的数据,看master是否还能看到zhangsan新增的数据

[root@node1 git_test_base]# git checkout zhangsan
Switched to branch 'zhangsan'
[root@node1 git_test_base]# git branch
  master
* zhangsan
[root@node1 git_test_base]# git add -A
[root@node1 git_test_base]# git  commit -m 'zhangsan'
[zhangsan 73e7cea] zhangsan
 1 file changed, 1 insertion(+)
 create mode 100644 zhangsan

我们在切换回master看看,我们看不到zhangsan提交后的数据了

[root@node1 git_test_base]# git checkout master
Switched to branch 'master'
[root@node1 git_test_base]# git branch
* master
  zhangsan
[root@node1 git_test_base]# ls
master1

我们来合并分支来看看

[root@node1 git_test_base]# git branch
* master
  zhangsan

#合并分支
[root@node1 git_test_base]# git merge zhangsan
Updating 7c6e8bb..73e7cea
Fast-forward
 zhangsan | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 zhangsan

#此时将zhangsan分支合并到了master分支,此时我们就看到了zhangsan的内容
[root@node1 git_test_base]# ls
master1  zhangsan
[root@node1 git_test_base]# cat zhangsan 
zhangsan

六、远程分支管理和本地分支建立关系

1.git push和git pull参数详解

在前边的几篇文章中 我们没有涉及到到分支的概念,使用的命令格式也比较简单 比如:
git pull、git push origin master
现在涉及到分支的概念了 就要详细讲讲这两个参数的用法
(1)git push用法
1.将本地当前分支 推送到 与本地当前分支同名的远程分支上(需先关联远程分支,方法见文章末尾)
git push

2.将本地当前分支 推送到 与本地当前分支同名的远程分支上
git push origin <本地分支名>

3.将本地当前分支 推送到 远程指定分支上
git push origin <本地分支名>:<远程分支名>

推荐使用第二种
(2)git pull用法
1、将与本地当前分支同名的远程分支 拉取到 本地当前分支上(需先关联远程分支,方法见文章末尾)
git pull

2、将远程指定分支 拉取到 本地当前分支上:
git pull origin <远程分支名>

3、将远程指定分支 拉取到 本地指定分支上:
git pull origin <远程分支名>:<本地分支名>

推荐使用第二种		

2.在服务端建立分支,客户端拉取

#初始化一个裸仓库
[root@node1 ~]# cd /data/base1/
[root@node1 base1]# git init --bare ./
Initialized empty Git repository in /data/base1/.git/
[root@node1 ~]# chmod -R 777 /data/base1/
(1)在客户端克隆仓库,并且提交数据
[root@node3 data]# git clone [email protected]:/data/base1
Cloning into 'base1'...
[email protected]'s password: 
warning: You appear to have cloned an empty repository.

[root@node3 data]# cd base1/
[root@node3 base1]# touch client
[root@node3 base1]# echo "hello" >> client
[root@node3 base1]# git add -A
[root@node3 base1]# git commit -m '123'
[master (root-commit) e62862f] 123
 1 file changed, 1 insertion(+)
 create mode 100644 client

#提交数据到远程仓库
[root@node3 base1]# git remote -v
origin	[email protected]:/data/base1 (fetch)
origin	[email protected]:/data/base1 (push)

[root@node3 base1]# git push origin master
[email protected]'s password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 209 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/data/base1
 * [new branch]      master -> master

(2)在服务端创建分支
[root@node1 ~]# cd /data/base1/
[root@node1 base1]# ls
branches  config  description  HEAD  hooks  info  objects  refs
[root@node1 base1]# git branch
* master
[root@node1 base1]# git branch jishubu
[root@node1 base1]# git branch
  jishubu
* master

(3)在客户端拉取远程分支方法1
[root@node3 base1]# git branch -a
* master
  remotes/origin/master

#更新远程仓库
[root@node3 base1]# git remote update
Fetching origin
[email protected]'s password: 
From 192.168.1.107:/data/base1
 * [new branch]      jishubu    -> origin/jishubu

#我们在客户端查看远程仓库列表
[root@node3 base1]# git branch -r
  origin/jishubu
  origin/master

#但是我们的本地分支还是只有master
[root@node3 base1]# git branch
* master

#我们在客户端口直接checkout jishubu即可,git会自动在本地创建jishubu分支
[root@node3 base1]# git checkout jishubu
Branch jishubu set up to track remote branch jishubu from origin.
Switched to a new branch 'jishubu'

[root@node3 base1]# git branch
* jishubu
  master

#测试:将本地的数据提交到远程分支上
[root@node3 base1]# touch jishubu
[root@node3 base1]# git add -A
[root@node3 base1]# git commit -m 'jishubu'
[jishubu 499ee65] jishubu
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 jishubu
 
[root@node3 base1]# git push origin jishubu
[email protected]'s password: 
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 268 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/data/base1
   a207f40..499ee65  jishubu -> jishubu


(4)在客户端拉取远程分支方法2
#1.我们在服务端创建一个caiwubu分支
#2.在客户端本地创建一个分支caiwubu,然后切换到caiwubu分支上
[root@node3 base1]# git branch -a
* jishubu
  master
  remotes/origin/jishubu
  remotes/origin/master

[root@node3 base1]# git checkout -b caiwubu
Switched to a new branch 'caiwubu'

[root@node3 base1]# git branch
* caiwubu
  jishubu
  master

[root@node3 base1]# git pull origin caiwubu
[email protected]'s password: 
From 192.168.1.107:/data/base1
 * branch            caiwubu    -> FETCH_HEAD
Already up-to-date.


#测试 提交数据
[root@node3 base1]# touch caiwubu
[root@node3 base1]# git add -A
[root@node3 base1]# git commit -m 'caiwubu'
[caiwubu 2dc9709] caiwubu
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 caiwubu

[root@node3 base1]# git push origin caiwubu
[email protected]'s password: 
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 268 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To [email protected]:/data/base1
   a207f40..2dc9709  caiwubu -> caiwubu


3.在客户端建立分支,然后推送到服务端

1.首先要保证客户端的仓库和服务端的仓库是有联系的
[root@node3 base1]# git remote -v
origin	[email protected]:/data/base1 (fetch)
origin	[email protected]:/data/base1 (push)

2.我们在客户端创建本地仓库
[root@node3 base1]# git branch
* master
[root@node3 base1]# git checkout -b test
Switched to a new branch 'test'
[root@node3 base1]# git branch
  master
* test

3.将本地分支推送到远程仓库上去
#先查看服务端仓库的分支,服务端只有一个master分支
[root@node1 base1]# git branch
* master

#将本地分支推送到服务端
[root@node3 base1]# git push origin test
[email protected]'s password: 
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:/data/base1
 * [new branch]      test -> test

#我们回到服务端 查看分支,我们发现服务端自动创建了test分支
[root@node1 base1]# git branch
* master
  test

七、删除分支

注意:在删除分支的时候,是不能停留在要删除的分支上的

1.删除本地分支

[root@node1 git_test_base]# git branch
  master
  test
* test1
[root@node1 git_test_base]# git checkout master
Switched to branch 'master'
[root@node1 git_test_base]# git branch
* master
  test
  test1

#删除test1分支
[root@node1 git_test_base]# git branch -d test1
Deleted branch test1 (was 16381f9).
[root@node1 git_test_base]# git branch
* master
  test
    
#删除分支还可以使用-D 强制删除

2.删除远程分支

[root@node3 base1]# git push origin --delete test
[email protected]'s password: 
To [email protected]:/data/base1
 - [deleted]         test
 #服务端口的分支会被删除,本地的还需要手动删除

你可能感兴趣的:(liunx)