Day 15:Git

前言


git 是一种版本控制软件 (Version Control Software, VCS),VCS 有很多种,现今最主流的就是 git,而这些 VCS 主要都是针对程序领域的,
git 可以监测任何档案是否有编辑过,只要有编辑,他就会保留新旧版本,
厉害的是,只要是文字档案(只有文字没有格式,可以直接用记事本开启),就能像这样指出改了哪些。

此图使用软件呈现。

这对於我们昨天写完,今天就忘的程序码,有很大的帮助,可以用 GUI 的方式看到来龙去脉,也不用怕把程序改坏,我们也还能随时到好几年前,最重要的是,连上远端後,我们能够跟其他人协同编辑同一个专案。

基本概念


  • Repository(简称 repo):可以说这就是指专案,大部分的情况都是一个 repo 都是一个专案,但并没有限制。
  • Branch:branch 存活在 repo 中,是一个时空的概念,如果要放 code 进去,一定要有 branch,就像我们现在活着的时空就是一个 branch,也许没有其他时空,但可能也有许多个平行时空,平常大家都在不同的平行时空做事,只有完成任务了,才会把成品都带到主要的 branch 中。
  • Commit:这个字是名词也是动词,git 可以帮我们记忆不同改动,而 commit(名词)就是记忆点,假设我写了一颗按钮,然後 commit(动词),这样就可以随时决定是否要回到某个 commit。对了,git 很聪明,commit 记录的是 diff(有差异的部分),而不是整个专案再复制一份,所以可以大量 commit,不需要担心。
  • Push、Pull:我们刚 commit 完是存在本机的,还没有送到我们事先约定好的远端服务器,push 指的就是上传到远端,pull 则是把远端的拉下来。
  • Merge:每个 branch 都是一个时空,总不能永远平行吧,当一个 branch 上的程序码完善了,就会 merge 到比较主要的 branch,之後发布产品的时候,就会从最完善的 branch 编译出 app。
  • Conflict:如果 A 同事跟 B 同事,在自己的 branch 都改动了同一行,当这两个 branch 要 merge 的时候就冲突了,这就叫 conflict,那该听谁的呢?git 无法擅自做决定,所以工具会让我们暂停 merge 的流程,处理完冲突的部分再继续走完 merge 的流程。
  • Pull Request(Merge Request):这个功能会在存放 repo 的平台上,当我们要 merge 到比较主要的 branch 时,我们会需要请其他协作的同事一起来看自己写的这些程序码会不会有问题,这时候还没有真正 merge,如果没问题,看完的人就会点击 merge,如果有问题,就返回修改直到修正。

工具选择


Android Studio

很幸运的,我们的 Android Studio(或 IntelliJ IDEA 系列 IDE)就有 git,而且还很强大,完全不输主流 Git GUI(可以按 ⌘+9 打开界面)。

Sourcetree、Fork

既然 Android Studio 已经内建工具,为什麽还要用其他 GUI 呢?

因为如果有多个 repo,可能是写不同程序语言,用 Android Studio 来管理就太笨重了,不管是什麽 GUI,都只是在帮忙输入 git 的指令并呈现结果,所以并不需要重学,只要知道这个工具的功能放在哪里就好,市面上的工具不少,选顺手的就好,建议都玩玩看,当工程师後每天都要用。

CLI

比较 hardcore 的做法,要会很多指令,界面也比较不友善,会多花许多时间,也有些人觉得下指令就是工程师的浪漫,如果你相信自己比相信 GUI 多,那就用吧。

要会的指令


git 的指令非常多,如果使用的是 GUI,会用到的指令就少了很多,指令的参数也不需要记忆,但如果要使用 GUI,必须清楚了解每个按钮按下去会有什麽结果,另外,其实有些指令并不是必须,而是可以用其他指令组合起来达到相同的目的,这边列举一些常用、必须会的指令:

  • commit
  • add
  • rm
  • reset
  • revert
  • checkout
  • rebase
  • pull、fetch
  • push
  • stash
  • branch
  • merge
  • cherry-pick
  • reflog

比较特别的东西


Android Studio before commit

Android Studio 在 git 方面有多一些其他 Git GUI 都没有的功能,其中一个很好用的,是在 commit 前还能帮忙检查、做些事。

Android Studio 中显示 Git Blame

在行数的地方按右键开启。


会显示出谁在什麽时候 commit,点击後会开启该 commit 编辑过的所有档案,再点击档案可以看当时的 diff。

Android Studio 内建 GitHub plugin

这个内建的 plugin 可以做到 create 新的 PR,也可以 review PR。

甚至还能直接 create gist。

流程


每个协作的团队都有其节奏,什麽时候要在哪一个 branch 上开发、什麽时候 merge、pull 等。

我们要时刻注意流程、自己在哪个 branch 开发,否则会遇到一直在改别人已经改好的东西、改坏别人的东西、难以让人协同开发等问题。

注意


commit 大小

这是个哲学问题,切 commit 可以有很多理由:

  • 按架构,比方说 View、xml。
  • 素材、文案。
  • 改版号加上版号的 commit message 方便加 tag 及搜寻。
  • 风险高,可能会被 revert。
  • 还有很多理由。

但不管是什麽理由,不应该该动太多档案、行数,
但如果是 rename,又会改到一堆档案,但这却没关系,
重点是切开的目的,比方说 PR 容易看、可以容易合并、拔除等。

force push

尽量不要在跟其他人一起协作的 branch 上做 force push,如果对方刚 push 上去就遇到 force push,那他 push 的那些 commit 就会消失,所以要切好 branch,不要共用。

reflog

如果发生 commit 或 stash 被砍掉的事件,可以用 reflog 来挽救,
要注意的是,如果没有 commit 或 stash 过,就没办法找回来。

结语


当工程师每天几乎都要用 git,难以想象在还没有 git 的时候,工程师是怎麽做版本控制,我甚至觉得,其他行业也该引入 git 来管理公司的文档资产。


<<:  JS 15 - this 关键字

>>:  Day18 - 建立追踪清单画面

[Day 20] Sass - Using @extend

哈罗~今天来聊聊跟@mixin的兄弟 @extend 我们平常在写css时,时常会把class们相同...

NIST SP 800-88 R1媒体消毒准则(Guidelines for Media Sanitization)

NIST SP 800-88 R1引入了三种消毒方法:清除(clear),清除(Purge)和销毁(...

html 档案间的串连

如果我们今天写了两个网页,要如何将他们串联在一起呢?那就要用到a href这个语法了 假设我写了一个...

Day 13 - OOP 初探 (3) - 实战地图游戏

前言 跟 FP 一样,OOP 到目前已经第三天了,我们来点实战吧! 今天的实战很特别啊,基本上是工作...

.Net Core Web Api_笔记24_api结合EFCore资料库操作part2_产品分类资料新增_资料查询呈现(带入非同步API修饰)

接续上一篇 在Startup.cs中启用静态资源 於专案新增目录命名为wwwroot(会自动变成地球...