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]$
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>