千家信息网

Git应用进阶(二)

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,Git进阶(二)===============================================================================概述:==========
千家信息网最后更新 2025年02月04日Git应用进阶(二)

Git进阶(二)

===============================================================================

概述:


===============================================================================

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 检出分支

演示1:git 创建分支

[root@node1 test]# lsfirst.sh  INSTALL  readmin  subdir[root@node1 test]# git branch --list* master   # 带"*"表示当前分支[root@node1 test]# git logcommit 3c0b6864718ec8f8aebb5b66fbfd65b757504169 (HEAD -> master)Author: watao Date:   Mon Aug 19 23:06:00 2019 +0800    v0.0.2commit b0e9cc432d3adb683963686a2eec197129ef48b8Author: watao Date:   Tue Jul 16 23:26:38 2019 +0800    v0.0.1[root@node1 test]# git statusOn branch masterChanges to be committed:  (use "git reset HEAD ..." to unstage)        new file:   first.shUntracked files:  (use "git add ..." 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 statusOn branch masterUntracked files:  (use "git add ..." to include in what will be committed)        readminnothing added to commit but untracked files present (use "git add" to track)[root@node1 test]# git ls-files -s100644 b6a56662e48ee60ef2d65fd2b00dd555e758b7fa 0       INSTALL100644 1809e7ac283fd186a50d97b1462d2d27396f9b42 0       first.sh100644 a4ec1ecd97368714ba8b5c8d002b1a24647bb7ec 0       subdir/1.txt[root@node1 test]# git add readmin[root@node1 test]# git ls-files -s100644 b6a56662e48ee60ef2d65fd2b00dd555e758b7fa 0       INSTALL100644 1809e7ac283fd186a50d97b1462d2d27396f9b42 0       first.sh100644 8bf9463e75dfb20077fafb8358ee3cb471dd7900 0       readmin100644 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 logcommit e522483313931f3dbc914ff6e132f5cd205f7d62 (HEAD -> master)Author: watao Date:   Wed Aug 21 22:48:52 2019 +0800    v1.1commit 13051f2788b17981a72f641e6b30bc8bea0f2e38Author: watao Date:   Wed Aug 21 22:46:23 2019 +0800    v1.0commit 3c0b6864718ec8f8aebb5b66fbfd65b757504169Author: watao Date:   Mon Aug 19 23:06:00 2019 +0800    v0.0.2commit b0e9cc432d3adb683963686a2eec197129ef48b8Author: watao 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 logcommit 5d4298d6fdcbb6276e69f002e7148210124e52d9 (HEAD -> dev)Author: watao Date:   Wed Oct 9 22:04:34 2019 +0800    v1.0commit b9182448b3e9503ce5fd09edb5b378f612209d01Author: watao Date:   Wed Oct 9 21:05:05 2019 +0800    v0.0.2commit 1b5d8e0fea57e85045c8d98f12e379fdc73138bcAuthor: watao Date:   Tue Oct 8 21:24:06 2019 +0800    v0.0.1    #############################[root@node1 taotao]# cat first.sh#!/bin/bashecho "hello world"echo "new date"[root@node1 taotao]# [root@node1 taotao]# git statusOn branch devChanges not staged for commit:  (use "git add ..." to update what will be committed)  (use "git checkout -- ..." to discard changes in working directory)        modified:   first.shno 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 logcommit 587719dd3920429904c2b2a24637f20ecd20c4e0 (HEAD -> dev)Author: watao Date:   Fri Oct 11 22:34:41 2019 +0800    v1.1-devcommit 5d4298d6fdcbb6276e69f002e7148210124e52d9Author: watao Date:   Wed Oct 9 22:04:34 2019 +0800    v1.0commit b9182448b3e9503ce5fd09edb5b378f612209d01Author: watao Date:   Wed Oct 9 21:05:05 2019 +0800    v0.0.2commit 1b5d8e0fea57e85045c8d98f12e379fdc73138bcAuthor: watao Date:   Tue Oct 8 21:24:06 2019 +0800    v0.0.1    [root@node1 taotao]# cat first.sh#!/bin/bashecho "hello world"echo "new date"# 切回主分支,再次查看first.sh,发现还是原来的,因为master分支并没有提交新的操作[root@node1 taotao]# git checkout masterSwitched to branch 'master'[root@node1 taotao]# [root@node1 taotao]# cat first.sh #!/bin/bashecho "hello world"# 不被追踪的文件在所有分支上都可以看见[root@node1 taotao]# git checkout devSwitched to branch 'dev'[root@node1 taotao]# cat first.sh #!/bin/bashecho "hello world"echo "new date"[root@node1 taotao]# [root@node1 taotao]# vim second.sh[root@node1 taotao]# cat second.sh #!/bin/bashecho "second.sh"[root@node1 taotao]# lsfirst.sh  INSTALL  second.sh  subdir[root@node1 taotao]# [root@node1 taotao]# git checkout masterSwitched to branch 'master'[root@node1 taotao]# [root@node1 taotao]# lsfirst.sh  INSTALL  readmin  second.sh  subdir[root@node1 taotao]# cat second.sh #!/bin/bashecho "second.sh"# 添加到索引发现在所有分支上依然可以看见[root@node1 taotao]# git add second.sh[root@node1 taotao]# git statusOn branch masterChanges to be committed:  (use "git reset HEAD ..." to unstage)        new file:   second.sh[root@node1 taotao]# git checkout devA       second.shSwitched to branch 'dev'[root@node1 taotao]# git statusOn branch devChanges to be committed:  (use "git reset HEAD ..." 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 statusOn branch devnothing to commit, working tree clean#再次切回master分支,发现second.sh 已经没有了[root@node1 taotao]# git checkout masterSwitched to branch 'master'[root@node1 taotao]# lsfirst.sh  INSTALL  readmin  subdir[root@node1 taotao]# git statusOn branch masternothing to commit, working tree clean#在主分支创建一个second文件,然后切回dev分支报错,因为和dev分支中已提交的second 发生冲突[root@node1 taotao]# echo "#XIUXIU" > second.sh[root@node1 taotao]# git statusOn branch masterUntracked files:  (use "git add ..." to include in what will be committed)        second.shnothing added to commit but untracked files present (use "git add" to track)
[root@node1 taotao]# git checkout deverror: The following untracked working tree files would be overwritten by checkout:second.shPlease move or remove them before you switch branches.Aborting[root@node1 taotao]# git add second.sh[root@node1 taotao]# git checkout deverror: Your local changes to the following files would be overwritten by checkout:second.shPlease commit your changes or stash them before you switch branches.Aborting#删除master主分支的second后,顺利切换到dev分支[root@node1 taotao]# git rm -f second.shrm 'second.sh'[root@node1 taotao]# git checkout devSwitched to branch 'dev'[root@node1 taotao]# git statusOn branch devnothing 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

Git 分支合并

1.分支合并--git merge

相关概念

  • 合并基础:要合并的分支的最近一次的共同提交;

  • 我们的版本:当前分支的最近一次提交;

  • 他们的版本要合并进来的分支的最近一次提交;

无冲突合并:

  1. git checkout master; 检出到主分支

  2. git status 检查是否有未提交的信息

  3. git merge BRANCH_NAME 从他们的版本合并到我们的版本

  4. git log --graph --pretty=oneline --abbrev-commit 以图形的方式查看

有冲突合并:

  1. 手动解决冲突;

  2. 解决完成之后: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 devMerge 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 statusOn branch masternothing 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 devfatal: 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/bashecho "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]# lsfirst.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/bashecho "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 masterSwitched to branch 'master'[root@node1 taotao]# [root@node1 taotao]# [root@node1 taotao]# git merge fotfix Auto-merging first.shCONFLICT (content): Merge conflict in first.shAutomatic merge failed; fix conflicts and then commit the result.不能合并成功的文件,发现三个版本中 first.sh 内容各不相同[root@node1 taotao]# git ls-filesINSTALLfirst.shfirst.shfirst.shmy.txtreadminsecond.shsubdir/1.txt[root@node1 taotao]# [root@node1 taotao]# git ls-files --unmerged100644 816a1b1e686cf6adb716b10e1a9eed870b2f18fa 1first.sh   # "1" 表示合并基础100644 3adec3b3bf2616c52eaba36bd8af2e79e9ef6495 2first.sh   # "2" 表示我们的版本100644 e45ccd5a231f9debdd84ffd621cdc3acfc8d15f1 3first.sh   # "3" 表示他们的版本[root@node1 taotao]# cat first.sh #!/bin/bashecho "hello world"echo "new date"<<<<<<< HEADthird line=======new line>>>>>>> fotfix[root@node1 taotao]# git diffdiff --cc first.shindex 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 diffdiff --cc first.shindex 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/bashecho "hello world"echo "new date"third linenew 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_HEADHEAD 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/bashecho "hello world"echo "new date"third line  #原来的文件还在[root@node1 taotao]# git checkout fotfix Switched to branch 'fotfix'[root@node1 taotao]# cat first.sh #!/bin/bashecho "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 masterSwitched to branch 'master'[root@node1 taotao]# lsfirst.sh  INSTALL  my.txt  readmin  second.sh  subdir[root@node1 taotao]# cat first.sh #!/bin/bashecho "hello world"echo "new date"third line[root@node1 taotao]# vim first.sh [root@node1 taotao]# cat first.sh  #编辑文件先解决冲突,以便于演示git变基操作#!/bin/bashecho "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 fotfixSwitched to branch 'fotfix'[root@node1 taotao]# lsfirst.sh  INSTALL  my.txt  readmin  second.sh  subdir[root@node1 taotao]# cat first.sh #!/bin/bashecho "hello world"echo "new date"new line  # 新增加的一行#执行变基操作,表示把当前 fotfix的基变为master分支的最近一次提交[root@node1 taotao]# git rebase masterFirst, rewinding head to replay your work on top of it...Applying: v2.0-1[root@node1 taotao]# cat first.sh #!/bin/bashecho "hello world"echo "new date"new line[root@node1 taotao]# git checkout masterSwitched to branch 'master'[root@node1 taotao]# cat first.sh #!/bin/bashecho "hello world"echo "new date"  # 此时没有新行,需执行合并操作[root@node1 taotao]# git merge fotfix Updating 7961be2..3eaaeadFast-forward # 快进合并 first.sh | 1 + 1 file changed, 1 insertion(+) [root@node1 taotao]# cat first.sh #!/bin/bashecho "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








0