查看命令介绍:
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
#当前只有一个master主分支
[root@node1 base1]# git branch
* master
#创建了一个test分支
[root@node1 base1]# git branch test
[root@node1 base1]# git branch
* master
test
[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
[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
[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.不论在哪个分支的工作区中新增文件,其它分支都能看到,但是一旦提交了,就属于自己分支的内容了,其它 分支就看不到了,如果其它分支想看到,就需要合并分支了
[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
#我们在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 <远程分支名>:<本地分支名>
推荐使用第二种
#初始化一个裸仓库
[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/
[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
[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
[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
#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
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
注意:在删除分支的时候,是不能停留在要删除的分支上的
[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 强制删除
[root@node3 base1]# git push origin --delete test
[email protected]'s password:
To [email protected]:/data/base1
- [deleted] test
#服务端口的分支会被删除,本地的还需要手动删除