git(三):git的分支管理

git管理分支结构

     分支即是平行空间,假设你开发某个功能,代码已经完成了80%,但如果将这不完整的代码直接提交到git仓库中,又有可能影响到其他人的工作,此时我们便可以在该软件的项目之上创建一个分支,这种分支只会属于你自己,而其他人看不到,等代码编写完成后再与原来的项目主分支合并下即可,这样即能保证代码不丢失,又不影响其他人的工作

 

 

一般在实际的项目开发中,我们要尽量保证master分支是非常稳定的,仅用于发布新版本,平时不要随便直接修改里面的数据文件,而工作的时候则可以新建不同的工作分支,等到工作完成后在合并到master分支上面,所以团队的合作分支看起来会像上面图那样。

1.1         新建分支

[admin@pe-jira git-test]$ git status
位于分支 master
nothing to commit, working tree clean
[admin@pe-jira git-test]$ git branch dev
[admin@pe-jira git-test]$ git checkout dev
切换到分支 'dev'
[admin@pe-jira git-test]$ git status
位于分支 dev
nothing to commit, working tree clean
[admin@pe-jira git-test]$

1.2         分支创建往前发展

我们在dev分支上创建文件,开发项目,不会影响到master,而master一直保持的是原来的版本。

[admin@pe-jira git-test]$ touch 222

 [admin@pe-jira git-test]$ touch dev-Readme

 [admin@pe-jira git-test]$ git add 222 dev-Readme

[admin@pe-jira git-test]$ git commit -m 'add 222,readme'

[dev 2c69cca] add 222,readme

 2 files changed, 0 insertions(+), 0 deletions(-)

 create mode 100644 222

 create mode 100644 dev-Readme

[admin@pe-jira git-test]$ git log --pretty=oneline

2c69cca9c37dda49e186bdc5cecf11a9ce228885 add 222,readme

cddd3589be5077dda255c708dab3dba35e45b39a 修改123文件添加lalal

8c0da95e7230b61a0cdb74c1d56d9e034025ae56 修改123文件添加456

ad14308b0030ab9b5a28b5629abd0bb1bdaea537 修改123文件

097f85f3af602919b8cc526387d8b2e9e4cd5781 pay.html

a39f4b365bca6892079f9bf5692fd74a43a3394b pay

a28c2d6a77895a9359fb8be4c205981a79b3f068 1111

[admin@pe-jira git-test]$ git checkout master

切换到分支 'master'

[admin@pe-jira git-test]$ git log --pretty=oneline

cddd3589be5077dda255c708dab3dba35e45b39a 修改123文件添加lalal

8c0da95e7230b61a0cdb74c1d56d9e034025ae56 修改123文件添加456

ad14308b0030ab9b5a28b5629abd0bb1bdaea537 修改123文件

097f85f3af602919b8cc526387d8b2e9e4cd5781 pay.html

a39f4b365bca6892079f9bf5692fd74a43a3394b pay

a28c2d6a77895a9359fb8be4c205981a79b3f068 1111

[admin@pe-jira git-test]$

 

1.3         分支常用命令

1.3.1         git branch列出所有分支标明当前分支

 

1.3.2          git branch –v 列出所有分支最近日志信息

 

 

1.3.3          git branch -d test 删除分支

 

 

1.3.4          git checkout+分支名字=切换分支,+文件=撤销文件修改

 

 

 

1.3.5          git merge 合并主干

#我们在分支开发比master主干快两个版本,开发完成之后再merge到master

[admin@pe-jira git-test]$ git checkout dev

切换到分支 'dev'

[admin@pe-jira git-test]$ ls

123  222  dev-Readme  index.html  pay.html

[admin@pe-jira git-test]$ git status

位于分支 dev

nothing to commit, working tree clean

[admin@pe-jira git-test]$ vim 123

[admin@pe-jira git-test]$ git add 123

[admin@pe-jira git-test]$ git commit -m '123 add '

[dev d3dd2d5] 123 add

 1 file changed, 2 insertions(+), 2 deletions(-)

[admin@pe-jira git-test]$ git log --pretty=oneline

d3dd2d5f3bcbb80b360041cf56e78244e6569959 123 add

2c69cca9c37dda49e186bdc5cecf11a9ce228885 add 222,readme

cddd3589be5077dda255c708dab3dba35e45b39a 修改123文件添加lalal

8c0da95e7230b61a0cdb74c1d56d9e034025ae56 修改123文件添加456

ad14308b0030ab9b5a28b5629abd0bb1bdaea537 修改123文件

097f85f3af602919b8cc526387d8b2e9e4cd5781 pay.html

a39f4b365bca6892079f9bf5692fd74a43a3394b pay

a28c2d6a77895a9359fb8be4c205981a79b3f068 1111

[admin@pe-jira git-test]$ cat 123

lalalal

from dev 修改的

ddddd

[admin@pe-jira git-test]$ git checkout master

切换到分支 'master'

[admin@pe-jira git-test]$ cat 123

123

456

lalalal

[admin@pe-jira git-test]$ git log --pretty=oneline

cddd3589be5077dda255c708dab3dba35e45b39a 修改123文件添加lalal

8c0da95e7230b61a0cdb74c1d56d9e034025ae56 修改123文件添加456

ad14308b0030ab9b5a28b5629abd0bb1bdaea537 修改123文件

097f85f3af602919b8cc526387d8b2e9e4cd5781 pay.html

a39f4b365bca6892079f9bf5692fd74a43a3394b pay

a28c2d6a77895a9359fb8be4c205981a79b3f068 1111

[admin@pe-jira git-test]$ git merge dev

更新 cddd358..d3dd2d5

Fast-forward

 123        | 4 ++--

 222        | 0

 dev-Readme | 0

 3 files changed, 2 insertions(+), 2 deletions(-)

 create mode 100644 222

 create mode 100644 dev-Readme

[admin@pe-jira git-test]$ ls

123  222  dev-Readme  index.html  pay.html

[admin@pe-jira git-test]$ cat 123

lalalal

from dev 修改的

ddddd

[admin@pe-jira git-test]$ git status

位于分支 master

nothing to commit, working tree clean

[admin@pe-jira git-test]$ git log --pretty=oneline

d3dd2d5f3bcbb80b360041cf56e78244e6569959 123 add

2c69cca9c37dda49e186bdc5cecf11a9ce228885 add 222,readme

cddd3589be5077dda255c708dab3dba35e45b39a 修改123文件添加lalal

8c0da95e7230b61a0cdb74c1d56d9e034025ae56 修改123文件添加456

ad14308b0030ab9b5a28b5629abd0bb1bdaea537 修改123文件

097f85f3af602919b8cc526387d8b2e9e4cd5781 pay.html

a39f4b365bca6892079f9bf5692fd74a43a3394b pay

a28c2d6a77895a9359fb8be4c205981a79b3f068 1111

[admin@pe-jira git-test]$

 

 

 

1.3.6          git branch --merge 查看已经merge的分支

 

 

1.1.7          git branch --no-merge 查看没有merge的分支

#我们创建了test分支,并且开发,但没merge

 

 

 

1.3.8          git stash命令将修改的内容保存至暂存区

https://blog.csdn.net/stone_yw/article/details/80795669

应用场景:

 

1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。

2 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。

总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。

 

git stash
能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。

git stash save
作用等同于git stash,区别是可以加一些注释,

git stash list
查看当前stash中的内容

git stash pop
将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。
注:该命令将堆栈中最近保存的内容删除(栈是先进后出)
顺序执行git stash save “test1”和git stash save “test2”命令

 
git stash apply
将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况。

git stash drop + 名称
从堆栈中移除某个指定的stash

git stash clear
清除堆栈中的所有 内容

git stash show
查看堆栈中最新保存的stash和当前目录的差异。

git stash branch
从最新的stash创建分支。
应用场景:当储藏了部分工作,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工作目录时,如果是针对同一个文件的修改(即便不是同行数据),那么可能会发生冲突,恢复失败,这里通过创建新的分支来解决。可以用于解决stash中的内容和当前目录的内容发生冲突的情景。发生冲突时,需手动解决冲突。

 

测试

[admin@pe-jira git-test]$ git status

位于分支 dev

nothing to commit, working tree clean

[admin@pe-jira git-test]$ touch stash_test

[admin@pe-jira git-test]$ echo 'lslslsl'  >> stash_test

[admin@pe-jira git-test]$ echo '112233' >> 123

[admin@pe-jira git-test]$ git status位于分支 dev

尚未暂存以备提交的变更:

  (使用 "git add <文件>..." 更新要提交的内容)

  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

 

        修改:     123

 

未跟踪的文件:

  (使用 "git add <文件>..." 以包含要提交的内容)

 

        stash_test

 

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[admin@pe-jira git-test]$ git stash stash_test

usage: git stash list [<options>]

   or: git stash show [<stash>]

   or: git stash drop [-q|--quiet] [<stash>]

   or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]

   or: git stash branch <branchname> [<stash>]

   or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet]

                       [-u|--include-untracked] [-a|--all] [<message>]]

   or: git stash clear

[admin@pe-jira git-test]$ git stash

Saved working directory and index state WIP on dev: d3dd2d5 123 add

HEAD 现在位于 d3dd2d5 123 add

[admin@pe-jira git-test]$ git status

位于分支 dev

未跟踪的文件:

  (使用 "git add <文件>..." 以包含要提交的内容)

 

        stash_test

 

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

[admin@pe-jira git-test]$ git add stash_test

[admin@pe-jira git-test]$ git stash

Saved working directory and index state WIP on dev: d3dd2d5 123 add

HEAD 现在位于 d3dd2d5 123 add

[admin@pe-jira git-test]$ git stash list

stash@{0}: WIP on dev: d3dd2d5 123 add

stash@{1}: WIP on dev: d3dd2d5 123 add

[admin@pe-jira git-test]$ echo '3333333' >> pay.html

[admin@pe-jira git-test]$ git stash save 'pay.html暂存'

Saved working directory and index state On dev: pay.html暂存

HEAD 现在位于 d3dd2d5 123 add

[admin@pe-jira git-test]$ git stash list

stash@{0}: On dev: pay.html暂存

stash@{1}: WIP on dev: d3dd2d5 123 add

stash@{2}: WIP on dev: d3dd2d5 123 add

[admin@pe-jira git-test]$ git status

位于分支 dev

nothing to commit, working tree clean

[admin@pe-jira git-test]$ git stash pop

位于分支 dev

尚未暂存以备提交的变更:

  (使用 "git add <文件>..." 更新要提交的内容)

  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

 

        修改:     pay.html

 

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

丢弃了 refs/stash@{0} (7bd48b7cd3766e39e869d221040da790c27a6a72)

[admin@pe-jira git-test]$ git commit -m 'pay修改完成'

位于分支 dev

尚未暂存以备提交的变更:

        修改:     pay.html

 

修改尚未加入提交

[admin@pe-jira git-test]$ git status

位于分支 dev

尚未暂存以备提交的变更:

  (使用 "git add <文件>..." 更新要提交的内容)

  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

 

        修改:     pay.html

 

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[admin@pe-jira git-test]$ git add pay.html

[admin@pe-jira git-test]$ git commit -m 'pay修改完成'

[dev 0bedbe0] pay修改完成

 1 file changed, 1 insertion(+)

[admin@pe-jira git-test]$ git stash list

stash@{0}: WIP on dev: d3dd2d5 123 add

stash@{1}: WIP on dev: d3dd2d5 123 add

[admin@pe-jira git-test]$ git stash pop

位于分支 dev

要提交的变更:

  (使用 "git reset HEAD <文件>..." 以取消暂存)

 

        新文件:   stash_test

 

丢弃了 refs/stash@{0} (9324dd512954caa1f084fca76f7c7c62631a5f5d)

[admin@pe-jira git-test]$ echo 'haha' >> stash_test

[admin@pe-jira git-test]$ git add stash_test

[admin@pe-jira git-test]$ git commit -m 'add stash_test文件'

[dev 3bec1a6] add stash_test文件

 1 file changed, 2 insertions(+)

 create mode 100644 stash_test

[admin@pe-jira git-test]$ git status位于分支 dev

nothing to commit, working tree clean

[admin@pe-jira git-test]$ git stash list

stash@{0}: WIP on dev: d3dd2d5 123 add

[admin@pe-jira git-test]$ git stash pop

位于分支 dev

尚未暂存以备提交的变更:

  (使用 "git add <文件>..." 更新要提交的内容)

  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

 

        修改:     123

 

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

丢弃了 refs/stash@{0} (aae9a6f64c36d96b28c5c8b9836ccb7484fb8142)

[admin@pe-jira git-test]$ git add 123

[admin@pe-jira git-test]$ git commit -m '123修改完成'

[dev 695b984] 123修改完成

 1 file changed, 1 insertion(+)

[admin@pe-jira git-test]$ git log --pretty=oneline

695b98481d1b579f9f966f134bcf5fa95a47ec35 123修改完成

3bec1a62617d720c13be4c158b74af861a521030 add stash_test文件

0bedbe0ce9a9cf80c18ef0bad04a8eaed54693c5 pay修改完成

d3dd2d5f3bcbb80b360041cf56e78244e6569959 123 add

2c69cca9c37dda49e186bdc5cecf11a9ce228885 add 222,readme

cddd3589be5077dda255c708dab3dba35e45b39a 修改123文件添加lalal

8c0da95e7230b61a0cdb74c1d56d9e034025ae56 修改123文件添加456

ad14308b0030ab9b5a28b5629abd0bb1bdaea537 修改123文件

097f85f3af602919b8cc526387d8b2e9e4cd5781 pay.html

a39f4b365bca6892079f9bf5692fd74a43a3394b pay

a28c2d6a77895a9359fb8be4c205981a79b3f068 1111

[admin@pe-jira git-test]$

 

 

[admin@pe-jira git-test]$ git stash list

stash@{0}: On dev: add stash_test

stash@{1}: WIP on dev: 695b984 123修改完成

[admin@pe-jira git-test]$ git stash apply

位于分支 dev

尚未暂存以备提交的变更:

  (使用 "git add <文件>..." 更新要提交的内容)

  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

 

        修改:     stash_test

 

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[admin@pe-jira git-test]$ vim stash_test

[admin@pe-jira git-test]$

[admin@pe-jira git-test]$: git add stash_test

[admin@pe-jira git-test]$: git commit -m '体检一下'

[dev dc7016e] 1体检一下

 1 file changed, 1 insertion(+), 1 deletion(-)

[admin@pe-jira git-test]$ git stash list

stash@{0}: On dev: add stash_test

stash@{1}: WIP on dev: 695b984 123修改完成

[admin@pe-jira git-test]$

 
git stash

 

 

 

1.3.9          git tag/show  打/查看标签

https://www.cnblogs.com/senlinyang/p/8527764.html

https://www.jianshu.com/p/cdd80dd15593

 

我们常常在代码封板时,使用git 创建一个tag ,这样一个不可修改的历史代码版本就像被我们封存起来一样,不论是运维发布拉取,或者以后的代码版本管理,都是十分方便的

git 下打标签其实有2种情况

  • 轻量级的:它其实是一个独立的分支,或者说是一个不可变的分支.指向特定提交对象的引用
  • 带附注的:实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证,电子邮件地址和日期,一般我们都建议使用含附注型的标签,以便保留相关信息

所以我们推荐使用第二种标签形式

git tag列出已有的tag ,-l过滤

 

 

git tag命令跟上tag名字,直接创建一个tag。

还可以加上-a参数来创建一个带备注的tag,备注信息由-m指定。如果你未传入-m则创建过程系统会自动为你打开编辑器让你填写备注信息。

 

git show查看tag详细信息

git show命令可以查看tag的详细信息,包括commit号等。

 

 

给指定的某个commit号加tag

打tag不必要在head之上,也可在之前的版本上打,这需要你知道某个提交对象的校验和(通过git log获取,取校验和的前几位数字即可)。

 

 

将tag同步到远程服务器

同提交代码后,使用git push来推送到远程服务器一样,tag也需要进行推送才能到远端服务器。
使用git push origin [tagName]推送单个分支。

git push origin v1.0

推送本地所有tag,使用git push origin --tags

 

切换到某个tag

跟分支一样,可以直接切换到某个tag去。这个时候不位于任何分支,处于游离状态,可以考虑基于这个tag创建一个分支。

 

删除某个tag

本地删除:    git tag -d v0.1.2

远端删除:    git tag push origin :refs/tags/<tagName>

 

posted on 2019-06-18 16:29  光阴8023  阅读(653)  评论(0编辑  收藏  举报