三、Git 分支操作

上一节操作中每次提交都要手动输入用户名和密码,若想避免这些麻烦,可以在系统中创建 SSH 公私钥,并将公钥放到 GitHub 指定位置。如此操作即可生成 GitHub 账户对于当前系统中的 Git 授权。

终端执行 ssh-keygen 命令按几次回车生成公私钥,公私钥存放在家目录下的隐藏目录 .ssh 中的两个文件下:

301.png

~/.ssh/id_rsa.pub 文件中的公钥内容复制出来,实验环境中可用使用右侧工具栏中的剪切板复制:

302.png
303.png
304.png

Title 自定义,把剪切板中的内容粘贴到 Key 中,点击绿色按钮添加 SSH Key 即可:

305.png

回到仓库主目录,点击下图所示的绿色按钮,点击紫色框中的 “Use SSH”,然后复制这个链接,在实验环境里删除原仓库,使用此链接重新克隆仓库。克隆仓库是需要确认连接,输入 yes 即可:

307.png

重要的一点:只有使用这种 git 开头的地址克隆仓库,SSH 关联才会起作用。

使用 SSH 的好处主要有两点:1、免密码推送,执行 git push 时不再需要输入用户名和密码了;2、提高数据传输速度。它不是必须的,比如在实验楼的课程中挑战环境是不可保存的,一次性的,这种环境就没有必要创建 SSH 了,因为相较好处来说,还是太麻烦了。

上一节课程中的操作,有些命令的重复度极高,比如 git statusgit branch -avv 等,Git 可以对这些命令设置别名,以便简化对它们的使用,设置别名的命令是 git config --global alias.[别名] [原命令],如果原命令中有选项,需要加引号。别名是自定义的,可以随意命名,设置后,原命令和别名具有同等作用。操作如下:

308.png

自己设置的别名要记住,也可以使用 git config -f 命令查看或者查看配置文件。下面的命令将使用这些别名。

在介绍分支前,先讲解另一个命令 git fetch,它的作用是将远程仓库的分支信息拉取到本地仓库,注意,仅仅是更新了本地的远程分支信息,也就是执行 git branch -avv 命令时,查看到的 remotes 开头的行的分支信息。举例说明一下,首先,我们在 GitHub 页面上对 one.txt 文件进行修改并增加一次提交。

提交完成后,提交数变成 3 个,点下图紫色框中的链接可以看到提交记录:

309.png
310.png

在实验环境中执行 git fetch 命令,然后执行 git branch -avv 查看分支信息:

311.png
312.png

可以看到,本地分支 master 的版本号无变化,而远程分支已经更新。所以,fetch 命令的作用是刷新保存在本地仓库的远程分支信息,此命令需要联网。此时若想使本地 master 分支的提交版本为最新,可以执行 git pull 命令来拉取远程分支到本地,pull 是拉取远程仓库的数据到本地,需要联网,而由于前面执行过 git fetch 命令,所以也可以执行 git rebase origin/master 命令来实现 “使本地 master 分支基于本地 origin/master 分支”,rebase 命令在后面还会经常用到,这里只需按部就班操作即可:

313.png
314.png

可以看到,远程仓库 master 分支、本地仓库的 origin/master 分支、本地仓库的 master 分支已经一致。

下面介绍 Git 作为分布式版本控制器最强大的功能:分支管理。

分支在项目开发中作用重大,多人协作时尤其不可或缺。例如一个项目上线了 1.0 版本,研发部门需要开发 1.1、1.2 两个测试版,增加不同的新功能,测试版的代码显然不能在正式版所在的分支上,此时需要新的分支来存放不同版次的代码。再例如实验楼的课程团队在维护课程仓库时,每个人都有各自的分支,在自己的分支上进行修改,然后向 master 分支提 PR(pull request),最后从 master 分支推送到线上。

首先,克隆远程仓库到本地,进入仓库主目录,执行 git br 查看分支信息:

320.png

执行 git branch [分支名] 可以创建新的分支:

321.png
322.png

此命令创建新分支后并未切换到新分支,还是在 master 分支上,执行 git checkout [分支名] 切换分支,checkout 也是常用命令,先给它设置别名,然后切换分支:

323.png

创建新分支还要手动切换太麻烦,介绍另一个常用的命令 git checkout -b [分支名] 创建分支并切换到新分支:

324.png
325.png

如上图所示的分支信息,前两行是新建的本地分支信息,它们的版本号与主分支 master 一致,这是因为在哪个分支上创建新分支,新分支的提交记录就与哪个分支一致。新建分支并无跟踪任何远程分支,所以没有 master 分支中的中括号和括号内的蓝色远程分支名。

假设我们要在当前分支 dev1 上开发一个新的功能,需要增加一个文件 new_func,然后生成一个新的提交:

326.png
327.png

好,新功能已经写好并提交到了版本区,现在要推送了,推送到哪里呢?正常逻辑当然要推送到远程仓库的同名分支,不过现在远程仓库里只有一个分支:

328.png

上图紫色框中是一个下拉按钮,点击后显示仓库中的全部分支,按钮上显示的是当前所在分支。

执行 git push [主机名] [本地分支名]:[远程分支名] 即可将本地分支推送到远程仓库的分支中,通常冒号前后的分支名是相同的,如果是相同的,可以省略 :[远程分支名],如果远程分支不存在,会自动创建:

329.png

上图命令可以简写为 git push origin dev1 。注意哦,这是我们创建 SSH 关联后第一次执行 push 命令,可以看到传输速度有明显的提高,更重要的是,不再需要重复输入用户名和密码了,另外打印信息的第一行是警告信息,因为是这个分支的第一次推送嘛,下次执行推送就不会再出现了。现在执行 git br 查看一下分支情况:

330.png

可以看到,远程分支 origin/dev1 的信息已经在本地存在,且与本地同名分支一致。再看下 GitHub 页面的情况:

331.png

很好,与预期毫无二致。

现在有个问题,当我们再次在 dev1 分支上修改并提交,推送到远程仓库时还是要输入上面的那个长长的命令,好不方便。如果能和 master 分支一样跟踪远程同名分支,就可以直接使用 git push 命令推送了。有办法的,执行这个命令 git branch -u [主机名/远程分支名] [本地分支名] 将本地分支与远程分支关联,或者说使本地分支跟踪远程分支。如果是设置当前所在分支跟踪远程分支,最后一个参数本地分支名可以省略不写:

332.png
333.png

这个命令的 -u 选项是 --set-upstream 的缩写。可不可以让本地分支跟踪远程非同名分支呢?可以的,尽管几乎遇不到这种自找麻烦的需求。可不可以撤销本地分支对远程分支的跟踪呢?也是可以的,执行 git branch --unset-upstream [分支名] 即可撤销该分支对远程分支的跟踪,同样地,如果撤销当前所在的分支的跟踪,分支名可以省略不写:

334.png
335.png

问题又来了,前面的操作是先将本地分支推送到远程仓库,使远程仓库创建新分支,然后再执行命令使本地分支跟踪远程分支,有没有办法在推送时就自动跟踪远程分支呢?有的,在推送的时候,加个 --set-upstream 或其简写 -u 选项即可,现在切换到 dev 分支试一下这个命令:

336.png
337.png

接下来,介绍一下删除分支的方法。

首先,删除远程分支,使用 git push [主机名] :[远程分支名] ,如果一次性删除多个,可以这样:git push [主机名] :[远程分支名] :[远程分支名] :[远程分支名] 。此命令的原理是将空分支推送到远程分支,结果自然就是远程分支被删除。另一个删除远程分支的命令:git push [主机名] --delete [远程分支名]。删除远程分支的命令可以在任意本地分支中执行。两个命令分别试一下:

338.png
339.png

可以看到本地仓库已经没有远程分支 dev 和 dev1 的分支信息。查看 GitHub 仓库页面:

340.png

也只剩 master 一个分支。操作成功。

回到实验环境,使用 git branch -D [分支名] 删除本地分支,同样地,此命令也可以一次删除多个,将需要删除的分支名罗列在命令后面即可。在此之前,先介绍一个极少用到的命令:给本地分支改名 git branch -m [原分支名] [新分支名] ,若修改当前所在分支的名字,原分支名可以省略不写:

341.png

好,现在要一次性删除本地分支 ved 和 dev1。需要注意的一点:当前所在的分支不能被删除。切换到 master 分支,然后执行 git branch -D ved dev1 命令:

342.png

执行 git branch -avv 查看当前仓库分支状态:

343.png

很好,一切都回到了课程开始时的样子,就像什么都没有发生。本节课程就到这里。

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

推荐阅读更多精彩内容