Git学习之旅 - Branching and Merging(分支和合并)篇

前言

其实git里面的很多命令参数都是重复的,虽然功能不同,但大致意思可以举一反三,所以文章只讲解常用的的命令。

branch

罗列,创建或删除分支
参考https://git-scm.com/docs/git-branch

  • [--delete | -d]
    删除分支
    git branch <分支名>

  • [--move | -m]
    移动/重命名分支和相应的reflog。

  • [--remotes | -r]
    列出或删除(如果与-d一起使用)远程分支跟踪信息。

    注意,这里并不会删掉远程的分支,这里删除的只是远程分支跟踪信息,比如在远程创建了一个新的分支,先在本地切换到该分支,通过git branch -a列出本地和远程分支,发现并没有创建的分支,执行git fetch可以同步远程仓库的分支信息等,执行后,新建的分支还是在远程分支的跟踪信息列表中(红色部分的分支),当checkout到本地后,就会在本地分支的跟踪信息列表中,执行git branch -d -r <分支名>只是从远程分支跟踪信息里删除该分支。同理,git branch -d <分支名>删除本地分支。

  • [--add | -a]
    列出远程跟踪分支和本地分支。

  • [--verbose | --v | -vv]
    更加详细列出分支信息,可以自己试一试,看看有什么不同。

  • [--quiet | -q]
    在创建或删除分支时更安静,禁止出现非错误消息。

  • [--contains [<commit>]]
    仅列出包含指定提交的分支(如果未指定,则为HEAD)

  • git branch [<branchname>]

  • git branch (-m | -M) [<oldbranch>] <newbranch>

  • git branch (-c | -C) [<oldbranch>] <newbranch>

  • git branch (-d | -D) [-r] <branchname>…​

  • git branch --edit-description [<branchname>]
    分支的创建,删除,重命名

checkout

切换分支或恢复工作树文件
这个命令,平时使用也比较简单的功能,更多用法,参考 https://git-scm.com/docs/git-checkout

merge

  1. git merge --abort
    执行merge进行合并时,突然想放弃这次合并,可以使用,git merge --abort
  2. git merge --continue
    当解决合并冲突后,你想要继续下一步来commit合并后的文件,可以执行这个命令。其它用法请参考 https://git-scm.com/docs/git-merge

log

  • --follow
    用于单个文件的提交信息的(包括该文件被重命名前的信息)展示

    git log --follow lib/main.dart
    

    这里注意后面的文件路径要正确。

  • [--no-decorate] , [--decorate[=short|full|auto|no]]
    打印出所有提交的引用名称,自己执行一下命令,看一下打印日志就知道了。

  • --source
    输出每个提交有哪些引用能够访问到,其实就是哪些分支合并了这些代码,可以访问到。

  • <revision range>
    打印特定访问内的日志信息,默认HEAD
    例如:git log origin..HEAD
    指定从当前提交(即HEAD)可到达的所有提交,但不包含origin。

  • Commit Limiting
    请参考上面的连接,这里面的大多命令都是限制日志的输出,比如输出多少条日志,输出什么时候的日志等等。

  • [--patch | -p]
    展示分支之间的不同
    例如:

    比较本地的master分支和origin/master分支的差别
    git log -p master  ..origin/master 
    

git log -p master ..origin/master

stash

储藏区,将未提交的文件(不包括被忽略的文件和不在工作树里的文件),暂时储藏起来,以便我们进行其它操作。

  • git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。

  • git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多 个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。

  • git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。

  • git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

  • git stash list [<options>]
    列出您当前储藏区拥有的存储条目,(例如,stash@{0}是最新条目,stash@{1}是前一个)。

  • git stash show [<stash>]
    显示特定存储条目记录信息

  • git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
    从存储列表中删除单个存储条目并将其应用于当前工作树状态之上,即执行git stash push的反向操作。工作目录必须与索引匹配。

如果存在冲突,将导致移除失败;在这种情况下,它不会从隐藏列表中删除。您需要手动解决冲突并随后手动调用git stash drop

  • git stash branch <branchname> [<stash>]
    创建新新分支,并应用储藏区的[<stash>]条目到新分支
  • drop [-q|--quiet] [<stash>]
    清理储藏区单个记录
  • git stash create [<message>]
    配合git stash store使用,创建一个储藏区记录,并用git stash store存储信息到这个记录里。

tag

创建(git tag ),列出(git tag -l),删除(git tag -d <tagname>…​)或验证(git tag -v)使用GPG签名的标记对象

  • 创建tag
    参考:Git 基础 - 打标签

    含附注的标签:创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可:

    $ git tag -a v1.4 -m 'my version 1.4'
    $ git tag v0.1 v1.3 v1.4
    

    而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。

    可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。

签署标签:如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即可:

轻量级标签:轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s或 -m 选项都不用,直接给出标签名字即可:

$ git tag v1.4-lw
$ git tag v0.1 v1.3 v1.4 v1.4-lw v1.5

验证标签:

可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证:

后期加注标签:
你甚至可以在后期对早先的某次提交加注标签。比如在下面展示的提交历史中:

$ git log --pretty=oneline

我们忘了在提交 “updated rakefile” 后为此项目打上版本号 v1.2,没关系,现在也能做。只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)即可:

$ git tag -a v1.2 9fceb02

分享标签

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:

如果要一次推送所有本地新增的标签上去,可以使用 --tags 选项:

$ git push origin --tags

worktree

作用就是在同一个仓库下,新建工作树,是工作树直接的操作互不影响。具体用法,
参考:https://git-scm.com/docs/git-worktree

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,649评论 9 163
  • 远程仓库 到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题...
    归云丶阅读 1,960评论 0 5
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,950评论 3 27
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,827评论 0 9
  • Git教程 一、Git简介 1.1. Git的诞生1.2.集中式的vs分布式 二、安装Git 三、创建版本库 四、...
    曹渊说创业阅读 942评论 0 2