Git 的常规操作

前言

记录作者在日常工作中使用 Git 进行的一系列常规的操作;

查看远程服务器 git 版本

如何查看远程 git server 所使用的版本信息;通过 http(s)://<git address&gt/info/refs\?service=git-upload-pack 的方式查看

1
2
3
4
> curl https://xxx:yyyy@bitbucket.org/ozms/hrx.git/info/refs\?service=git-upload-pack
001e# service=git-upload-pack
000000dcf506c6b9a54901a35431fcc3b44b1133d92ca915 HEADmulti_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.7.4.1.g5468f9e
003ff506c6b9a54901a35431fcc3b44b1133d92ca915 refs/heads/master

从 gent=git/2.7.4.1.g5468f9e 我们可以知道,bitbucket 远程 git 服务器使用的 git 版本是 2.7…

Tag 标签相关操作

Tag 相关的操作解释:https://git-scm.com/book/en/v2/Git-Basics-Tagging

基本操作

查看标签

查看本地标签

  1. 查看所有的标签

    1
    git tag
  2. 查看正则表达式指定标签

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ git tag -l "v1.8.5*"
    v1.8.5
    v1.8.5-rc0
    v1.8.5-rc1
    v1.8.5-rc2
    v1.8.5-rc3
    v1.8.5.1
    v1.8.5.2
    v1.8.5.3
    v1.8.5.4
    v1.8.5.5
  3. 查看某一个标签的详细信息

    1
    git show v0.1

查看远程标签

查看所有远程标签,

1
> git ls-remote --tags

创建标签

创建本地标签

  1. 创建带注释的标签 Annotated tag

    1
    git tag -a <tag name> -m "annotate"
  2. 创建轻量级的标签 Lightweight

    1
    git tag <tag name>
  • 补充:轻量级标签和注解标签的异同

    Lightweight tag vs Annotated Tag

    Tag 原理上都是相同的,就是对某一次 commit 打上标签;Lightweight 是快速打上标签,不添加任何其它的信息,而 Annotated Tag 允许添加额外的包括添加者,注解等等信息;

将标签推送到远程

  1. 将特定标签推送到远程 Git 服务器

    1
    $ git push origin v0.1.1

    相当于执行命令 git push origin refs/tags/<source tag name:>refs/tags/<target tag name>,所以上述命令等价于

    1
    $ git push origin refs/tags/v0.1.1:refs/tags/v0.1.1
  2. 推送所有标签到远程服务器

    1
    > git push --tags

删除标签

删除本地标签

1
git tag -d <tag name>

删除远程标签

  1. 在 Git V1.7.0 之前,推送一个空的标签到远程,既是删除
    首先删除本地分支

    1
    git tag -d <tag name>

    然后推送一个空的分支到远程,

    1
    $ git push origin :refs/tags/<tag name>
  2. 在 Git V1.7.0 之后,可以显示的使用 –delete 命令

    1
    > git push origin --delete tag <tagname>

    或者

    1
    > git push origin --delete tag <hashid>

切换至某一个标签

1
$ git checkout tagName

实践

下面是我实际操作过程中使用到的例子,使用 Annotated Tag 对我当前

1
$ git tag -a v0.1.1 -m "basic with OAuth, Feign, Eureka, ZUUL, Resource Server"

当我查看这个 annotated tag 的详情的时候,会返回非常详细的信息

1
$ git show v0.1.1

显示如下信息,

1
2
3
4
5
6
7
8
9
10
11
12
tag v0.1
Tagger: shangyang <comedshang@163.com>
Date: Thu Jun 1 15:47:46 2017 +0800

basic with OAuth, Feign, Eureka, ZUUL, Resource Server

commit 06395869ea9a834673dfe6a104a5c0ccdea38445
Author: shangyang <comedshang@163.com>
Date: Tue May 30 21:13:28 2017 +0800

spring cloud with OAuth Server, Resource Server, ZUUL, Eureka and Feign,
first case with token authenticated.

将本地创建的 tag 推送到 Server,

1
2
3
4
5
6
7
8
$ git push origin v0.1.1
Username for 'https://github.com\': comedsh

Counting objects: 1, done.
Writing objects: 100% (1/1), 196 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/comedsh/spirngcloud-demo.git
* [new tag] v0.1.1 -> v0.1.1

至此,我们就可以在 Github 上查看到该 tag 了;

不过,细心的你会发现,其实这个推送过来的 Tag 也就是一个 Releases 版本了,但注意,其实这还是一个 Tag,如何真正的 Releases,参考下面一小节;

那,如果我们要删除这个远程标签呢?直接使用如下命令,参考删除远程标签

1
$ git push origin :refs/tags/v0.1.0

创建 Github Releases

创建 Github Releases 有两种方式

  1. 本地提交
    从上面的实践小节,我们看到了,如果通过创建本地的 tags 来实现 Github 的 releases,
  2. Github 上创建
    参考步骤,https://help.github.com/articles/creating-releases/

实际上,通过前面针对 Tag 的实践,当把本地的 tag 推送到 Git 服务器以后,在 Git 上回创建 Tag 同时也显示为 Release;只是那不是 Github 上的 offical 的 Release

  1. 切换到 Tags 标签页面
  2. 选择某一个 Tag,点击 Edit release notes
  3. 输入 release 的注解,点击 release
  4. 这样,一个 Github Release 才算是真正的创建好了

Branch 相关操作

删除分支

  1. 删除本地分支

    1
    > git -d <branch name>
  2. 删除远程分支

    1. Git V1.7.0 之前,推送一个空的分支到远程,既是删除

      1
      > git push origin :<branch name>
    2. Git V1.7.0 之后,可以显示的使用命令 –delete

      1
      > git push origin --delete <branch name>

set upstream

有时候代码 pull 下来以后,但是并没有指定 branch 的 upstream,那么当在执行一些状态检查的时候,比如

1
$ git cherry -v

上述命令用来查询本地与远程 git 之间的 commit 版本的变化,但是它默认是必须要设置 upstream 以后才能进行比对的,设置 upstream 有两种方式,

1
$ git branch --set-upstream-to origin/my_branch

  • 注意当你执行如下命令过后,

    1
    $ git push -u origin my_branch

    初始化 orgin 的时候,默认相当于执行了 –set-upstream-to;

不过,Git 官网建议使用

1
$ git branch -u origin/my_branch