從自己做版控來學 Git

假設要你做一個版本控制,你會怎麼做?

跟著這個文章一起做,做完後你就會發現 Git 的概念其實很簡單,沒有你想的那麼複雜!

動手做一做

假設你有一些檔案長這樣:

1
2
code_v1
note_v1

假設 code_v1 有更新時,你應該會這樣做:

1
2
3
code_v2
code_v1
note_v1

隨著更新越來越多時,最後可能變成這樣:

1
2
3
4
5
6
code_v9
code_v2
code_v3
note_v1
note_v4
note_v5

當檔案變成這樣子時,會有一個問題:你怎麼知道哪一個 code 是對應到哪一個 note?

如果這些檔案是一個程式的話,那麻煩就會很大。如果你沒有用對應的 code 去搭對應的 note,你的程式可能就會出錯。

那有沒有什麼更好的做法呢?

有阿,每次只要一更新,我就開一個「新的資料夾」來儲存所有最新的檔案不就 OK 了嗎:

1
2
3
-- v1(資料夾)
--code
--note

很多次的更新後…

1
2
3
4
5
6
7
8
9
-- v1(資料夾)
--code
--note

-- v2(資料夾)
--code
--note

...

這樣就解決了「相依性」的問題。現在不管是哪一個資料夾內的 code 跟 note,我們都能確保他一定可以正常運作。

現在另外一個問題來了,如果有些檔案我不想要加入版控呢?

也不用想得太複雜啦,既然我們會把要做版控的檔案都放到一個資料夾中,那只要反過來思考就好,我們不想要做版控的檔案,就「不要放到資料夾」中:

1
2
3
4
-- v1(資料夾)
--code
--note
--abc(不要做版控的檔案)

很多次的更新後…

1
2
3
4
5
6
7
8
9
-- v1(資料夾)
-- v2(資料夾)

...

-- v10(資料夾)
--code
--note
--abc(不要做版控的檔案)

所以 abc 永遠就只會是 abc,不管做了幾次更新,他都與我們的版控沒有關係。

修但幾勒!

在你準備洗洗睡之前,還有最後一個問題又蹦出來了:如果多人協作的話要怎麼辦?

沒錯,我們的精心製作的版控在「只有一個人的情況下」,可以說是完美於缺的;但如果不是呢?

想一下這個情境:

1
2
3
-- v1
--code
--note

PeaNu 對 v1 做了一點更新,所以建立了一個新的資料夾。

1
2
3
-- v2
--code
--note

PPB 對 v1 做了一點更新,所以建立了一個新的資料夾。

1
2
3
-- v2
--code
--note

聰明的你知道這個時候就會有問題了,因為 PeaNu 跟 PPB 的檔案名稱都是 v2,會有重複命名的問題。

聰明的你又知道,既然這樣會有重複命名的問題,那我每一次都用「亂數」來幫資料夾命名就好了呀!

1
2
3
-- kjdanskdqwwe
--code
--note

PeaNu 對 kjdanskdqwwe 做了一點更新,所以建立了一個新的資料夾。

1
2
3
-- njkdnkngwf
--code
--note

PPB 對 kjdanskdqwwe 做了一點更新,所以建立了一個新的資料夾。

1
2
3
-- 4oy904ue9tjwr
--code
--note

所以最後的情況會是這樣:

1
2
3
-- kjdanskdqwwe
-- 4oy904ue9tjwr
-- njkdnkngwf

好啦,現在確實解決了重複命名的問題,但我現在是要怎麼知道哪個是最新的版本,還有每個版本的順序?

別急,我們在開一個檔案用來做記錄不就好了嗎:

1
2
3
4
5
6
-- kjdanskdqwwe
-- 4oy904ue9tjwr
-- njkdnkngwf

--order(儲存版本的順序:kjdanskdqwwe -> ... -> njkdnkngwf)
--newest(儲存最新的版本:4oy904ue9tjwr)

恭喜你,現在你的版控不論是單人或多人協作都能平平安安,而且還可以選擇那些東西要做版控,哪些不要。

總結

最後來複習一下整個流程吧:

  1. 每當發生更新,就建立一個新的資料夾
  2. 不要做版控的檔案,就不要放到資料夾
  3. 為了避免命名衝突,每一個資料夾都會用亂數來命名
  4. 為了知道哪個版本最新?版本的順序?我們建立了兩個檔案來做紀錄

不知道你有沒有發現,其實這就是「Git」在幫你做的事情!

雖然背後的原理不完全是這樣子,但只要用這種方式下去思考,我保證你不再覺得 Git 有什麼困難的。

從資料夾來理解分支的概念 在學版本控制前,先理解三件事
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×