Git进阶(二)
===============================================================================
概述:
===============================================================================
1.分支命名法则及常用命令
master(主干分支) 是指向指定分支的最近一次提交;
dev 是指向dev分支的最近一次提交;
不管有多少分支,活动分支只能有一个;
head 一定是指向某个分支的,head表示 映射了当前工作目录当中所反映的最近一次提交;即 head始终指向活动分支的最近一次提交;
★分支命名法则
可以使用"/",但不能使用"/"结尾;
不能以 "-" 开头;
以位于 "/" 后面的组件,不能以 "." 开头;
不能使用连续的 "...";
不能使用空白字符" ";
不能使用"^","~","?","*","[" 等符号
必须唯一,分支的名字始终指向目标分支的最近一次提交;
★git branch :列出,创建及删除分支
git branch BRANCH_NAME [START_COMMIT]
git branch -d BRANCH_NAME 删除分支
★git show-branch:查看分支及其相关的提交
★git checkout
git checkout <branch> 检出分支
演示1:git 创建分支
[root@node1 test]# ls
first.sh INSTALL readmin subdir
[root@node1 test]# git branch --list
* master # 带"*"表示当前分支
[root@node1 test]# git log
commit 3c0b6864718ec8f8aebb5b66fbfd65b757504169 (HEAD -> master)
Author: watao <wangzhangtao@pachiratech.com>
Date: Mon Aug 19 23:06:00 2019 +0800
v0.0.2
commit b0e9cc432d3adb683963686a2eec197129ef48b8
Author: watao <wangzhangtao@pachiratech.com>
Date: Tue Jul 16 23:26:38 2019 +0800
v0.0.1
[root@node1 test]# git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: first.sh
Untracked files:
(use "git add <file>..." to include in what will be committed)
readmin
[root@node1 test]# git commit -m 'v1.0'
[master 13051f2] v1.0
1 file changed, 4 insertions(+)
create mode 100644 first.sh
[root@node1 test]# git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
readmin
nothing added to commit but untracked files present (use "git add" to track)
[root@node1 test]# git ls-files -s
100644 b6a56662e48ee60ef2d65fd2b00dd555e758b7fa 0 INSTALL
100644 1809e7ac283fd186a50d97b1462d2d27396f9b42 0 first.sh
100644 a4ec1ecd97368714ba8b5c8d002b1a24647bb7ec 0 subdir/1.txt
[root@node1 test]# git add readmin
[root@node1 test]# git ls-files -s
100644 b6a56662e48ee60ef2d65fd2b00dd555e758b7fa 0 INSTALL
100644 1809e7ac283fd186a50d97b1462d2d27396f9b42 0 first.sh
100644 8bf9463e75dfb20077fafb8358ee3cb471dd7900 0 readmin
100644 a4ec1ecd97368714ba8b5c8d002b1a24647bb7ec 0 subdir/1.txt
[root@node1 test]# git commit -m 'v1.1'
[master e522483] v1.1
1 file changed, 1 insertion(+)
create mode 100644 readmin
[root@node1 test]# git log
commit e522483313931f3dbc914ff6e132f5cd205f7d62 (HEAD -> master)
Author: watao <wangzhangtao@pachiratech.com>
Date: Wed Aug 21 22:48:52 2019 +0800
v1.1
commit 13051f2788b17981a72f641e6b30bc8bea0f2e38
Author: watao <wangzhangtao@pachiratech.com>
Date: Wed Aug 21 22:46:23 2019 +0800
v1.0
commit 3c0b6864718ec8f8aebb5b66fbfd65b757504169
Author: watao <wangzhangtao@pachiratech.com>
Date: Mon Aug 19 23:06:00 2019 +0800
v0.0.2
commit b0e9cc432d3adb683963686a2eec197129ef48b8
Author: watao <wangzhangtao@pachiratech.com>
Date: Tue Jul 16 23:26:38 2019 +0800
v0.0.1
[root@node1 test]# git branch
* master
# 指明1.0版本创建分支
[root@node1 test]# git branch dev 13051f
[root@node1 test]# git branch
dev
* master
[root@node1 test]# git branch bug/first
[root@node1 test]# git branch
bug/first
dev
* master
演示2:git show-branch 查看分支
# git show-branch 查看具体的分支信息
[root@node1 test]# git show-branch
! [bug/first] v1.1
! [dev] v1.0
* [master] v1.1
---
+ * [bug/first] v1.1
++* [dev] v1.0
[root@node1 test]# git show-branch dev
[dev] v1.0
[root@node1 test]#
[root@node1 test]# git show-branch bug/first
[bug/first] v1.1
演示3:git checkout BRANCH_NAME 切换分支
[root@node1 taotao]# git checkout dev #切换分支
Switched to branch 'dev'
[root@node1 taotao]#
[root@node1 taotao]# git branch --list
bug/first
* dev
master
[root@node1 taotao]#
[root@node1 taotao]# git show-branch
! [bug/first] v1.1
* [dev] v1.0
! [master] v1.1
---
+ + [bug/first] v1.1
+*+ [dev] v1.0
[root@node1 taotao]#
[root@node1 taotao]#
[root@node1 taotao]# git log
commit 5d4298d6fdcbb6276e69f002e7148210124e52d9 (HEAD -> dev)
Author: watao <wangzhangtao@pachiratech.com>
Date: Wed Oct 9 22:04:34 2019 +0800
v1.0
commit b9182448b3e9503ce5fd09edb5b378f612209d01
Author: watao <wangzhangtao@pachiratech.com>
Date: Wed Oct 9 21:05:05 2019 +0800
v0.0.2
commit 1b5d8e0fea57e85045c8d98f12e379fdc73138bc
Author: watao <wangzhangtao@pachiratech.com>
Date: Tue Oct 8 21:24:06 2019 +0800
v0.0.1
#############################
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
[root@node1 taotao]#
[root@node1 taotao]# git status
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: first.sh
no changes added to commit (use "git add" and/or "git commit -a")
[root@node1 taotao]# git add first.sh
[root@node1 taotao]# git commit -m "v1.1-dev"
[dev 587719d] v1.1-dev
1 file changed, 1 insertion(+)
[root@node1 taotao]# git log
commit 587719dd3920429904c2b2a24637f20ecd20c4e0 (HEAD -> dev)
Author: watao <wangzhangtao@pachiratech.com>
Date: Fri Oct 11 22:34:41 2019 +0800
v1.1-dev
commit 5d4298d6fdcbb6276e69f002e7148210124e52d9
Author: watao <wangzhangtao@pachiratech.com>
Date: Wed Oct 9 22:04:34 2019 +0800
v1.0
commit b9182448b3e9503ce5fd09edb5b378f612209d01
Author: watao <wangzhangtao@pachiratech.com>
Date: Wed Oct 9 21:05:05 2019 +0800
v0.0.2
commit 1b5d8e0fea57e85045c8d98f12e379fdc73138bc
Author: watao <wangzhangtao@pachiratech.com>
Date: Tue Oct 8 21:24:06 2019 +0800
v0.0.1
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
# 切回主分支,再次查看first.sh,发现还是原来的,因为master分支并没有提交新的操作
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]#
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
# 不被追踪的文件在所有分支上都可以看见
[root@node1 taotao]# git checkout dev
Switched to branch 'dev'
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
[root@node1 taotao]#
[root@node1 taotao]# vim second.sh
[root@node1 taotao]# cat second.sh
#!/bin/bash
echo "second.sh"
[root@node1 taotao]# ls
first.sh INSTALL second.sh subdir
[root@node1 taotao]#
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]#
[root@node1 taotao]# ls
first.sh INSTALL readmin second.sh subdir
[root@node1 taotao]# cat second.sh
#!/bin/bash
echo "second.sh"
# 添加到索引发现在所有分支上依然可以看见
[root@node1 taotao]# git add second.sh
[root@node1 taotao]# git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: second.sh
[root@node1 taotao]# git checkout dev
A second.sh
Switched to branch 'dev'
[root@node1 taotao]# git status
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: second.sh
#在dev分支上提交
[root@node1 taotao]# git commit -m "v1.1.1-dev"
[dev 21a0411] v1.1.1-dev
1 file changed, 2 insertions(+)
create mode 100644 second.sh
[root@node1 taotao]# git status
On branch dev
nothing to commit, working tree clean
#再次切回master分支,发现second.sh 已经没有了
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]# ls
first.sh INSTALL readmin subdir
[root@node1 taotao]# git status
On branch master
nothing to commit, working tree clean
#在主分支创建一个second文件,然后切回dev分支报错,因为和dev分支中已提交的second 发生冲突
[root@node1 taotao]# echo "#XIUXIU" > second.sh
[root@node1 taotao]# git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
second.sh
nothing added to commit but untracked files present (use "git add" to track)
[root@node1 taotao]# git checkout dev
error: The following untracked working tree files would be overwritten by checkout:
second.sh
Please move or remove them before you switch branches.
Aborting
[root@node1 taotao]# git add second.sh
[root@node1 taotao]# git checkout dev
error: Your local changes to the following files would be overwritten by checkout:
second.sh
Please commit your changes or stash them before you switch branches.
Aborting
#删除master主分支的second后,顺利切换到dev分支
[root@node1 taotao]# git rm -f second.sh
rm 'second.sh'
[root@node1 taotao]# git checkout dev
Switched to branch 'dev'
[root@node1 taotao]# git status
On branch dev
nothing to commit, working tree clean
[root@node1 taotao]# git show-branch
! [bug/first] v1.1
* [dev] v1.1.1-dev
! [master] v1.1
---
* [dev] v1.1.1-dev
* [dev^] v1.1-dev
+ + [bug/first] v1.1
+*+ [dev~2] v1.0
[root@node1 taotao]# git show-branch --more=10
! [bug/first] v1.1
* [dev] v1.1.1-dev
! [master] v1.1
---
* [dev] v1.1.1-dev
* [dev^] v1.1-dev
+ + [bug/first] v1.1
+*+ [dev~2] v1.0
+*+ [dev~3] v0.0.2
+*+ [dev~4] v0.0.1
演示4:git checkout -d BRANCH_NAME 删除分支
[root@node1 taotao]# git branch -d bug/first
Deleted branch bug/first (was 5685269).
[root@node1 taotao]# git branch --list
dev
* master
1.分支合并--git merge
★相关概念
合并基础:要合并的分支的最近一次的共同提交;
我们的版本:当前分支的最近一次提交;
他们的版本:要合并进来的分支的最近一次提交;
☉无冲突合并:
git checkout master; 检出到主分支
git status 检查是否有未提交的信息
git merge BRANCH_NAME 从他们的版本合并到我们的版本
git log --graph --pretty=oneline --abbrev-commit 以图形的方式查看
☉有冲突合并:
手动解决冲突;
解决完成之后:git add ---> git commit
☉回退到合并之前的版本
git reset --hard ORIG_HEAD
演示1:无冲突的合并
[root@node1 taotao]# git branch --list
dev
* master
[root@node1 taotao]#
[root@node1 taotao]#
[root@node1 taotao]# git merge dev
Merge made by the 'recursive' strategy.
first.sh | 1 +
second.sh | 2 ++
2 files changed, 3 insertions(+)
create mode 100644 second.sh
[root@node1 taotao]#
[root@node1 taotao]# git status
On branch master
nothing to commit, working tree clean
[root@node1 taotao]# git show-branch
! [dev] v1.1.1-dev
* [master] Merge branch 'dev'
--
- [master] Merge branch 'dev'
+* [dev] v1.1.1-dev
[root@node1 taotao]# git log --graph --pretty=oneline --abbrev-commit
* 43d8e9a (HEAD -> master) Merge branch 'dev'
|\
| * 21a0411 (dev) v1.1.1-dev
| * 587719d v1.1-dev
* | 5685269 v1.1
|/
* 5d4298d v1.0
* b918244 v0.0.2
* 1b5d8e0 v0.0.1
演示2:有冲突的合并
[root@node1 taotao]# echo "taotaohuihui" > my.txt
[root@node1 taotao]# git add my.txt
[root@node1 taotao]# git commit -m "v2.0"
[master 1df3da7] v2.0
1 file changed, 1 insertion(+)
create mode 100644 my.txt
[root@node1 taotao]# git log --graph --pretty=oneline --abbrev-commit
* 1df3da7 (HEAD -> master) v2.0 # 新创建的提交
* 43d8e9a Merge branch 'dev'
|\
| * 21a0411 (dev) v1.1.1-dev
| * 587719d v1.1-dev
* | 5685269 v1.1
|/
* 5d4298d v1.0
* b918244 v0.0.2
* 1b5d8e0 v0.0.1
[root@node1 taotao]# git branch dev
fatal: A branch named 'dev' already exists. #dev分支存在不能创建相同的,实际上可以删除了,因为已经合并到master分支上去了
[root@node1 taotao]#
[root@node1 taotao]#
[root@node1 taotao]# git branch fotfix # 在master 2.0 的基础上常见fotfix分支
[root@node1 taotao]# git show-branch
! [dev] v1.1.1-dev
! [fotfix] v2.0
* [master] v2.0
---
+* [fotfix] v2.0
-- [fotfix^] Merge branch 'dev'
++* [dev] v1.1.1-dev
[root@node1 taotao]# echo "third line" >> first.sh # 修改master分支的内容
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
third line
[root@node1 taotao]# git add first.sh
[root@node1 taotao]# git commit -m "v2.1"
[master 697a6c5] v2.1
1 file changed, 1 insertion(+)
[root@node1 taotao]# git show-branch
! [dev] v1.1.1-dev
! [fotfix] v2.0
* [master] v2.1
---
* [master] v2.1
+* [fotfix] v2.0
-- [fotfix^] Merge branch 'dev'
++* [dev] v1.1.1-dev
[root@node1 taotao]# git checkout fotfix #切换到fotfix分支
Switched to branch 'fotfix'
[root@node1 taotao]# ls
first.sh INSTALL my.txt readmin second.sh subdir
[root@node1 taotao]#
[root@node1 taotao]# echo "new line" >> first.sh # 编辑first文件并提交
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
new line
[root@node1 taotao]# git add first.sh
[root@node1 taotao]# git commit -m "v2.0-1"
[fotfix 26b42ef] v2.0-1
1 file changed, 1 insertion(+)
[root@node1 taotao]# git show-branch
! [dev] v1.1.1-dev
* [fotfix] v2.0-1
! [master] v2.1
---
* [fotfix] v2.0-1
+ [master] v2.1
*+ [fotfix^] v2.0
-- [fotfix~2] Merge branch 'dev'
+*+ [dev] v1.1.1-dev
# 切回主分支,然后合并 fotfix分支,发现报错,即内容发生冲突。需手动修复冲突后再合并
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]#
[root@node1 taotao]#
[root@node1 taotao]# git merge fotfix
Auto-merging first.sh
CONFLICT (content): Merge conflict in first.sh
Automatic merge failed; fix conflicts and then commit the result.
不能合并成功的文件,发现三个版本中 first.sh 内容各不相同
[root@node1 taotao]# git ls-files
INSTALL
first.sh
first.sh
first.sh
my.txt
readmin
second.sh
subdir/1.txt
[root@node1 taotao]#
[root@node1 taotao]# git ls-files --unmerged
100644 816a1b1e686cf6adb716b10e1a9eed870b2f18fa 1first.sh # "1" 表示合并基础
100644 3adec3b3bf2616c52eaba36bd8af2e79e9ef6495 2first.sh # "2" 表示我们的版本
100644 e45ccd5a231f9debdd84ffd621cdc3acfc8d15f1 3first.sh # "3" 表示他们的版本
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
<<<<<<< HEAD
third line
=======
new line
>>>>>>> fotfix
[root@node1 taotao]# git diff
diff --cc first.sh
index 3adec3b,e45ccd5..0000000
--- a/first.sh
+++ b/first.sh
@@@ -1,4 -1,4 +1,8 @@@
#!/bin/bash
echo "hello world"
echo "new date"
++<<<<<<< HEAD "<<<<"或">>>>>"为三方合并标记,由2个 ++ 开头
+third line #为主分支最近一次提交的内容
++=======
+ new line
++>>>>>>> fotfix #为其他版本最近一次提交的内容
#直接在冲突文件的基础上修改即可,如想要都保留的话就把"三方合并标记"给删除
[root@node1 taotao]# vim first.sh
[root@node1 taotao]# git diff
diff --cc first.sh
index 3adec3b,e45ccd5..0000000
--- a/first.sh
+++ b/first.sh
@@@ -1,4 -1,4 +1,5 @@@
#!/bin/bash
echo "hello world"
echo "new date"
+third line #新加的两行
+ new line
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
third line
new line
#修改好之后重新添加到索引并提交
[root@node1 taotao]# git add first.sh
[root@node1 taotao]# git commit #出现内容提示,保存即可
[master dd73764] Merge branch 'fotfix'
[root@node1 taotao]# git log --graph --pretty=oneline --abbrev-commit
* dd73764 (HEAD -> master) Merge branch 'fotfix'
|\
| * 26b42ef (fotfix) v2.0-1
* | 697a6c5 v2.1
|/
* 1df3da7 v2.0
* 43d8e9a Merge branch 'dev'
|\
| * 21a0411 (dev) v1.1.1-dev
| * 587719d v1.1-dev
* | 5685269 v1.1
|/
* 5d4298d v1.0
* b918244 v0.0.2
* 1b5d8e0 v0.0.1
演示3:回到合并之前的版本
#回到合并之前的版本
[root@node1 taotao]# git reset --hard ORIG_HEAD
HEAD is now at 697a6c5 v2.1
[root@node1 taotao]# git log --graph --pretty=oneline --abbrev-commit
* 697a6c5 (HEAD -> master) v2.1
* 1df3da7 v2.0
* 43d8e9a Merge branch 'dev'
|\
| * 21a0411 (dev) v1.1.1-dev
| * 587719d v1.1-dev
* | 5685269 v1.1
|/
* 5d4298d v1.0
* b918244 v0.0.2
* 1b5d8e0 v0.0.1
[root@node1 taotao]# git show-branch
! [dev] v1.1.1-dev
! [fotfix] v2.0-1
* [master] v2.1
---
+ [fotfix] v2.0-1
* [master] v2.1
+* [fotfix^] v2.0
-- [fotfix~2] Merge branch 'dev'
++* [dev] v1.1.1-dev
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
third line #原来的文件还在
[root@node1 taotao]# git checkout fotfix
Switched to branch 'fotfix'
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
new line #原来的文件还在
1.git变基分支合并--git rebase
★变基操作
$ git checkout dev : 首先切换到要变基的分支;
$ git rebase master: 把他的基从最近一次的共同祖先提交转换为master的最新提交;
$ git checkout master :回到master分支;
$ git merge -m "MSG" :master 获取新的提交。
演示:
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]# ls
first.sh INSTALL my.txt readmin second.sh subdir
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
third line
[root@node1 taotao]# vim first.sh
[root@node1 taotao]# cat first.sh #编辑文件先解决冲突,以便于演示git变基操作
#!/bin/bash
echo "hello world"
echo "new date"
#再次提交一次
[root@node1 taotao]# git add first.sh
[root@node1 taotao]# git commit -m "v2.2"
[master 7961be2] v2.2
1 file changed, 1 deletion(-)
[root@node1 taotao]# git log --graph --pretty=oneline --abbrev-commit
* 7961be2 (HEAD -> master) v2.2
* 697a6c5 v2.1
* 1df3da7 v2.0
* 43d8e9a Merge branch 'dev'
|\
| * 21a0411 (dev) v1.1.1-dev
| * 587719d v1.1-dev
* | 5685269 v1.1
|/
* 5d4298d v1.0
* b918244 v0.0.2
* 1b5d8e0 v0.0.1
#切换到要变基的分支
[root@node1 taotao]# git checkout fotfix
Switched to branch 'fotfix'
[root@node1 taotao]# ls
first.sh INSTALL my.txt readmin second.sh subdir
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
new line # 新增加的一行
#执行变基操作,表示把当前 fotfix的基变为master分支的最近一次提交
[root@node1 taotao]# git rebase master
First, rewinding head to replay your work on top of it...
Applying: v2.0-1
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
new line
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date" # 此时没有新行,需执行合并操作
[root@node1 taotao]# git merge fotfix
Updating 7961be2..3eaaead
Fast-forward # 快进合并
first.sh | 1 +
1 file changed, 1 insertion(+)
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
new line
[root@node1 taotao]# git log --graph --pretty=oneline --abbrev-commit
* 3eaaead (HEAD -> master, fotfix) v2.0-1
* 7961be2 v2.2
* 697a6c5 v2.1
* 1df3da7 v2.0
* 43d8e9a Merge branch 'dev'
|\
| * 21a0411 (dev) v1.1.1-dev
| * 587719d v1.1-dev
* | 5685269 v1.1
|/
* 5d4298d v1.0
* b918244 v0.0.2
* 1b5d8e0 v0.0.1
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。