D-19. Git中的tag 、Git flow && Array Partition I

如果单纯从学习Ruby再学习运用Rails开发网页专案,那可能还要再认识一些技能,对开发上能更有帮助。当然如果本身已经有非常多的专案开发相关经验者,可能对它们就一点都不陌生了。

**Git**版控工具。
**Github**一个由Git进行版本控制的软件原始码代管服务平台。
**SQL && noSQL**结构化查询语言 && 不同於传统的关联式资料库的资料库管理系统的统称。以及其相对应的资料库厂商们。
**前端语言**当然包括前端最热门语言(目前没有之一)javascript,以及各式由它产生的各种函式库与框架,例如RecatorVue。当然HTML, CSS也是需要一定基本认知。

试着花一点时间,来重新了解他们,以及确认自己是否真的认识他们。


What is Git and why need?

Git是一种在自己电脑上就可以运行的软件,可以追踪你对文件的修改,当文件编辑或程序码编辑到一定程度时,可以操作其为你纪录,当你有需要时,随时可以将档案恢复至你想要的版本状态。当有正常网路连线时,你可以随时上传至任何由Git进行版本控制的软件原始码代管服务平台,进行云端存档。

有认识小说家朋友吗?推荐他用Git吧,例如Re:ゼロから始める异世界生活中有许多的if线故事,有用Git写作上不是更方便?

Git的重要性在对於利用框架开发专案,或功能较多的专案上尤其重要,熟悉其使用方式者,能更快速的查找到程序码被修改或加入的日期,协助debug或修改。协作开发上能让不同开发者,在不同的分支(branch)上进行功能开发,能让开发项目同时进行,不用等到一项功能完成,才能进行下一项功能。Git在对branch合并时也可找出分支间conflict,并提醒使用者排除。

有良好版本控制的习惯,已经早是对工程师们基本要求之一,所以学习Git已经是必要且也是会对自己有所帮助的,其并不是一项程序语言,而是工具,对於已经开始踏入程序语言人而言是非常容易学的一项技能。

网路上也有非常多无偿的教学网站及资料。

龙哥的为你自己学Git
连猴子都能懂的Git入门指南:https://backlog.com/git-tutorial/tw/intro/intro2_1.html
内容都已经把这工具使用方式,讲得一清二楚,所以接下来这边只分享一些可能的面试题。


1.Git中的tag?
对一次commit加上备注,也就是加上一个标签tag
tag有分lightweightannotated,虽然实际上只是多一个备注,但利用其制作版本号是很常见的行为。

annotated
新建一个priject并完成第一次的commit後试试以下指令。(如果不是用rails记得git init)

$ git tag  #没有任何资料才是正确的,因为我们从未标记过。

$ git log --oneline #画面上应该只会有第一次的`commit`。
d93894d (HEAD -> master) 第一次commit
(END)

$ git tag -a v1.0 -m "First time use git tag"

-a是给予版本号,-m是给予要储存资讯。
执行後不会出现任何画面,但终端有装一些辅助工具的话,可以看到版本号出现了。

接着。

$ git show v1.0
tag v1.0
Tagger: nauosika <[email protected]>
Date:   Wed Sep 8 14:37:03 2021 +0800

First time use git tag

commit d93894de082fe0f6a7f072ed5b293c1610b809d3 (HEAD -> master, tag: v1.0)
Author: nauosika <[email protected]>
Date:   Wed Sep 8 14:29:47 2021 +0800

可以看到备注,以及建立版本号者较完整资讯。


lightweight
如果只是想做标签不需要任何备注的话。
(请先将资料做变动,再进行一次commit。)

$ git tag v1.1

这样就完成了,不需要-a-m

接着输入。

$ git show v1.1
commit 5ca1ebc2c32544c95651048803b8f0e169e84b44 (HEAD -> master, tag: v1.1, tag: show)
Author: nauosika <[email protected]>
Date:   Wed Sep 8 14:45:40 2021 +0800

    second commit

就只会看到commit资讯了。

也可对之前的commit加上tag
(为了测试,我已经随意commit两次了)

$ git log --pretty=oneline
$ git log --oneline

以上两种都可查询commit以一行显示,--pretty=oneline较完整。
我的画面如下,你我乱数不会相同。(相同的话请通知我,我们一起买乐透。)

893441a25d2df27d488a208a336b60440e485e5a (HEAD -> master) fourth commit
c73366c08b26bfb23fec034f638f233c8d51b999 third commit
5ca1ebc2c32544c95651048803b8f0e169e84b44 (tag: v1.1, tag: show) second commit
d93894de082fe0f6a7f072ed5b293c1610b809d3 (tag: v1.0) 第一次commit

试着将第三次commit加tag,不要用第四次,那并不是过去式。

$ git tag v1.2 c73366c08b26bfb23fec034f638f233c8d51b999
$ git show v1.2
commit c73366c08b26bfb23fec034f638f233c8d51b999 (tag: v1.2)
Author: nauosika <[email protected]>
Date:   Wed Sep 8 14:53:43 2021 +0800

    third commit

删除tag也可以git tag -d <tagname>
另外标签是不上传到Github的,需要以git push origin <tagname>或一次性上传git push origin --tags

整理:
tagGit提供的加注标签功能,常用在增加版本号,或是对某次commit再增加注解,使用tag并不是再开一个分支。tag有分lightweightannotated两种。


2.什麽是 Git flow?
开发流程,是一种规范,一种观念,若是协作中开发者都有这种观念,团队可以减少许多不协调的状况产生。
googleGit flow可以看到许多图片,另外如为你自己学git这本书中也有说明各种分支的说明以及以下这张图

我试着以自己的了解说明看看。

Master分支(main分支)

Branch的重要性。这段话是出自GitHub Flow Guide

Branching is a core concept in Git, and the entire GitHub Flow is based upon it. There's only one rule: anything in the master branch is always deployable.
分支是 Git 中的一个核心概念,整个 GitHub Flow 都基於它。只有一个规则:master 分支中的任何东西总是可部署的。

说明了除了应以master作为部署外,其他分支上会有的操作都不应该在此分支上进行。

为你自己学git也提到了。
因为是稳定版本,所以通常也会在这个分支上的 Commit 上打上版本号标签。

develop
master分支为一般流程中的主要两大分支,当需要开发新功能时,都应由此分支来开FeatureRelease分支出去进行处理。如果拥有良好的流程,通常只会有masterdevelop这个分支存在。

Hotfix
请只由master开启分支,Hotfix就只做Hotfix的事情,例如找出bug,不再做新功能的增加。若有复数bug,此分之的周期及所要做的事与Feature一样,越短越少较好。

为你自己学Git
Hotfix 分支修复完成之後,会合并回 Master 分支,也同时会合并一份到 Develop 分支。
避免错误再次出现。
等於记得有开Hotfix,都需要merge回去masterdevelop

Feature
都由develop开分支处理,为建立新功能用,刚有提到Feature分支生命周期越短越好,这也不是一定要的,但如果真的进行的功能真的对自己而言太过庞大与困难,本来就该立即反应处理,是否再拆分或是停止由别人处理。
Feature分支在外流浪迟迟不回归Develop除了管控困难,之後merge回来产生冲突机率大以外,也会对整个团队开发进度有所影响。

在分支命名上Feature也是最为重要,看过一篇文章,不想被请喝咖啡,好好命名,一定要让所有夥伴都知道你在做什麽。

Release
自己心里戏称为了masterdevelop更协调的第三者。
Develop分支将已完成的Feature都收回,会mergeRelease做上线前的测试,有些流程文章也常说,此阶段会开始决定版本号,测试完成一样会developmaster都合并一次。
Release最多只做只做debug不要增加任何新功能。

以上是流程中常见的五个分支。

其他关於Git的面试中可会被问到的大多为怎麽用,指令的意思,就不说明了。
最後关於Git,是一种觉得麻烦,但是懂了後不用使用,会让自己很不放心的存在。


今天的Leetcode561. Array Partition I
题目连结:https://leetcode.com/problems/array-partition-i/
题目重点:解答在例子1的第三个示范,还有例子2,已经告诉我们怎麽找出最佳配对。

# @param {Integer[]} nums
# @return {Integer}
def array_pair_sum(nums)

end

puts array_pair_sum([1,4,3,2])  #=> 4
puts array_pair_sum([6,2,6,5,1,2])  #=>9

直接看例子1的第三个示范

2.7.3 :058 > [1, 2].min + [3, 4].min
 => 4
2.7.3 :059 > [1, 4, 3, 2].sort
 => [1, 2, 3, 4]
2.7.3 :061 > [1, 2, 3, 4].each_with_index{|num, index| puts num if index.even?}
1
3
 => [1, 2, 3, 4]

等於是找sort後,将位置是偶数的相加。
例子2示范的最佳组合(2, 1), (2, 5), (6, 6)其实也是(1, 2), (2, 5), (6, 6)这样排列。

2.7.3 :062 > [1, 2, 3, 4].index(1)
 => 0
2.7.3 :064 > [1, 2, 3, 4].index(1).even?
 => true
2.7.3 :065 > [1, 2, 3, 4].index(3).even?
 => true

所以是双数位置的值的sum就可以了。

def array_pair_sum(nums)
  ans = 0
  nums.sort!.each_with_index{|num, index| ans += num if index.even? }
  ans
end

今日提到的
1.Git中的tag?
2.什麽是 Git flow?
3.Leetcode561. Array Partition I


<<:  不只懂 Vue 语法:Vue 的 MVVM、渐进式框架、宣告式渲染是指什麽?

>>:  Rust-Hello, World!

[Day19] Tableau 轻松学 - Data Extract

前言 每当我们修改工作表或者仪表板的时候,Tableau Desktop 会立即进行运算以显示出对应...

从架构开始重新认识Day2

MVC介绍 希望能将复杂的东西简单化 如果给我一句话我会说下面这句 Model、View、Contr...

这个赌场在玩什麽把戏 - 金融商品内容

事前提要: 本 API 系为 永丰金 PYTHON API,尚未申请的朋友们,有两个方法可以申请 洽...

那些被忽略但很好用的 Web API / RequestAnimationFrame

别再用 setTimeOut、setInterval 写动画啦! 如果你有用 js 写过动画,那通...

详解资料仓库的实施步骤,实战全解!(2)

建立资料仓库是一个解决企业资料问题应用的过程,是企业资讯化发展到一定阶段必不可少的一步,也是发展资...