git 分支+标签+别名配置管理

一、来段大白话

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。

但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

git branch  //查看分支

git branch zhdyaa    //创建分支

git checkout  zhdyaa    //切换到了zhdyaa分支下
再用git branch查看,会看到有两个分支master和zhdyaa,当前使用的分支前面会有一个*  (虽然切换到了zhdyaa,但是里面的文件是一样的。)

在zhdyaa分支下 ,编辑2.txt,并提交到新分支
echo "askdfjlksadjflk" >  2.txt

git add 2.txt

git commit -m "laksjdflksjdklfj" 

切换回master分支
git checkout master     //此时cat 2.txt发现并没有更改内容

二、分支的合并

git checkout master     //合并分支之前,先切换到目标分支 

git merge zhdyaa     //把zhdyaa分支合并到了master

[root@zhdy-01 gitroot]# ls
aa.txt  asd.txt
2.1 冲突
  • 如果master分支和zhdyaa分支都对2.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。
  • 解决冲突的方法是在master分支下,编辑2.txt,改为zhdyaa分支里面2.txt的内容。 然后提交2.txt,再合并zhdyaa分支。
  • 但是这样有一个问题,万一master分支更改的内容是我们想要的呢?
    • 可以编辑2.txt内容,改为想要的,然后提交。
    • 切换到zhdyaa分支,然后合并master分支到zhdyaa分支即可(倒着合并)。
    • 合并分支有一个原则,那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。
git commit -a   //查看提示信息
git  branch -d zhdyaa      //删除分支
  • 如果分支没有合并,删除之前会提示,那就不合并,强制删除
git branch -D zhdyaa

三、远程分支管理

3.1 分支的原则

对于分支的应用,建议大家以这样的原则来:

  • master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。
  • 创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master。
  • 开发人员应该在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支。

dev分支合并bob分支的命令是:

git checkout dev   //先切换到dev分支,然后

git merge bob
3.2 远程分支

在远程master创建一个文件:

点击下面的提交!在github上面提交文档是一个可视化的界面,比较直观的可以看出你所想看到的信息。

3.3 创建一个新的分支

在本地克隆远端的分支:

[[email protected]01 ~]# cd /data/

[[email protected]01 data]# ls
1.txt  gitroot  mongodb  mysql  redis  svnroot  wwwroot

[[email protected]01 data]# git clone git@github.com:zhangduanya/zhdya.git
正克隆到 'zhdya'...
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 9 (delta 0), reused 6 (delta 0), pack-reused 0
接收对象中: 100% (9/9), done.

[[email protected]01 data]# ls
1.txt  gitroot  mongodb  mysql  redis  svnroot  wwwroot  zhdya

[[email protected]01 data]# cd zhdya

[[email protected]01 zhdya]# ls
asd.txt  README.md  zhdya.txt

当我们再次在客户端查看的时候发现只有一个分支:

[root@zhdy-01 zhdya]# git branch 
* master
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的。
  • 查看远程分支
[[email protected]-01 zhdya]# git ls-remote origin      //可以看到所有分支
30dda46a3d3441861df8136ef486da5d22b2cc84	HEAD
30dda46a3d3441861df8136ef486da5d22b2cc84	refs/heads/dev
30dda46a3d3441861df8136ef486da5d22b2cc84	refs/heads/master
  • 当本地分支比远程分支多,默认git push 只推送本地和远程一致的分支,想要把多出来的本地分支推送到远程时,使用git push origin zhdya 如果推送失败,先用git pull抓取远程的新提交
  • git clone的时候默认只把master分支克隆下来,如果想把所有分支都克隆下来,需要手动创建,在本地创建和远程分支对应的分支,使用
[[email protected]-01 zhdya]# git checkout -b dev origin/dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
[[email protected]-01 zhdya]# git branch 
* dev
  master

本地和远程分支的名称要一致(并且也自动切换到了dev)

在新的仓库里面添加一个文件:

[root@zhdy-01 zhdya]# vim newdev.txt

[root@zhdy-01 zhdya]# git add newdev.txt

[root@zhdy-01 zhdya]# git commit -m "add newdev.txt"
[dev bc31da5] add newdev.txt
 1 file changed, 2 insertions(+)
 create mode 100644 newdev.txt

[root@zhdy-01 zhdya]# git push
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 347 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:zhangduanya/zhdya.git
   30dda46..bc31da5  dev -> dev

如上操作“git push” 会更新所有的仓库,但是有时候我们只需要更新到某个仓库,如何操作呢?(只推送dev,和master没有任何关系)

[[email protected]-01 zhdya]# git push origin dev
Everything up-to-date
3.4 本地创建分支
[root@zhdy-01 zhdya]# git branch dev2       //创建一个分支

[root@zhdy-01 zhdya]# git branch            //查看分支
* dev
  dev2
  master
  
[root@zhdy-01 zhdya]# git checkout dev2     //切换到分支
切换到分支 'dev2'

[root@zhdy-01 zhdya]# vim zzz.txt       

[root@zhdy-01 zhdya]# git add zzz.txt

[root@zhdy-01 zhdya]# git commit -m "add zzz.txt"
[dev2 26d61f8] add zzz.txt
 1 file changed, 3 insertions(+)
 create mode 100644 zzz.txt

[root@zhdy-01 zhdya]# git push origin dev2      
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 277 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To git@github.com:zhangduanya/zhdya.git
 * [new branch]      dev2 -> dev2

然后我们到服务端去查看:

四、标签管理

标签类似于快照功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态。一般用于发布一个版本,后期为了能更加清楚的去辨析所创造的!

git checkout master     先切到master分支上

git tag v1.0    给master打一个标签v1.0

git show v1.0   查看标签信息

git tag     可以查看所有的标签

tag是针对commit来打标签的,所以可以针对历史的commit来打tag
git log --pretty=oneline   //先查看历史的commit

git log --pretty=oneline --abbrev-commit  //使用简写的commit
30dda46 Create asd.txt
275c8e9 add zhdya.txt
68cb217 add README.md
    
git tag v0.9 46d3c1a    //针对历史commit打标签
 
git tag -a v0.8 -m "tag just v1.1 and so on" 5aacaf4  //可以对标签进行描述

git tag -d v0.8      //删除标签

[[email protected]01 zhdya]# git push origin v1.0    //推送指定标签到远程
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:zhangduanya/zhdya.git
 * [new tag]         v1.0 -> v1.0

git push --tag origin    //推送所有标签

如果本地删除了一个标签,远程也想要删除需要这样操作:

git tag v1.0 -d      //删除本地标签
 
git push origin :refs/tags/v1.0      //删除远程标签

五、git 别名

其实我感觉没有多大必要,任何事物都是孰能生巧,况且Linux还可以那么人性化的TAB键。对于别名其实TAB键已经足够了!

git commit 这个命令是不是有点长? 用别名可以提高我们的工作效率

git config --global alias.ci commit

git config --global alias.co  checkout

git config --global alias.br  branch

查看git别名使用命令

git config --list |grep alias

查看配置文件:

[[email protected] zhdya]# cat /root/.gitconfig 
[user]
	name = zhdya

	email = [email protected]
[push]
	default = simple
[alias]
	cc = commit

查询log小技巧:(如下图可以很清晰的显示各种信息)

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

使用 git lg

取消别名

git config --global --unset alias.br

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏『不羁阁』 | 行走少年郎专栏

Hexo 博客部署到腾讯云教程

7216
来自专栏梦里茶室

【Chromium中文文档】OS X 沙箱设计

背景 沙箱将进程视为一种恶劣的环境,因为进程任何时候都可能被一个恶意攻击者借由缓冲区溢出或者其他这样的攻击方式所影响。一旦进程被影响,我们的目标就变成了,让这个...

2320
来自专栏零基础使用Django2.0.1打造在线教育网站

利用Flask搭建微电影视频网站(四):后台页面搭建

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

6021
来自专栏owent

基于Chrome插件的开发工具链

在项目开发过程中,时不时会碰上需要使用一些工具来做一些自动操作或者附加功能。特别是有一些外部组件只会提供Web工具,或者如果产品会发布在Web上的时候,在线上的...

1322
来自专栏信安之路

Oauth协议介绍与安全隐患

OAuth 是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。目前,...

2130
来自专栏小怪聊职场

爬虫课程(三)|Python2和Python3的比较及安装

3106
来自专栏GreenLeaves

Oracle 基础系列之1.1 oracle的安装

一、 1、以下是安装Oracle的一些硬件上的条件: (1)、操作系统最后是windows2000(也就是服务器版的操作系统) (2)、内存最好在1G以上,当然...

24110
来自专栏macOS 开发学习

Mac开发基础练习:制作一个状态栏(NSStatusBar)上的App(二)

1.1 选中ViewController.m文件,添加鼠标左键点击事件监听,实现代码如下图:

1123
来自专栏信安之路

bWAPP 玩法总结

bWAPP(buggy web Application)是一个集成了了常见漏洞的 web 应用程序,目的是作为漏洞测试的演练场(靶机),为 web 安全爱好者和...

6.7K1
来自专栏技术墨客

React由0到1

    本文记录了本人以及目前团队从无到有使用React的过程,我们将从webpack开始说起,一步一步展现React最基本的开发生态。在这里并不会介绍任何js...

1173

扫码关注云+社区

领取腾讯云代金券