iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
自我挑戰組

初級紅寶石魔法師心得分享。系列 第 11

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 <----------@gmail.com>
Date:   Wed Sep 8 14:37:03 2021 +0800

First time use git tag

commit d93894de082fe0f6a7f072ed5b293c1610b809d3 (HEAD -> master, tag: v1.0)
Author: nauosika <-----------@gmail.com>
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 <nauosikaforwork@gmail.com>
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 <nauosikaforwork@gmail.com>
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


上一篇
D-20. 預設更改DBMS 、bundle指令 、Gemfile && Reverse String II && III
下一篇
D-18. SQL & NoSQL、SQL injection、primary key & foreign key
系列文
初級紅寶石魔法師心得分享。30

尚未有邦友留言

立即登入留言