顯示具有 Git 標籤的文章。 顯示所有文章
顯示具有 Git 標籤的文章。 顯示所有文章

Git rebase 實戰演練

自從使用Git之後,因為開始變得我天不怕地不怕
有時候上個廁所也好,出門覓個食也罷
毋忘隨時來個commit,想說養成save的好習慣
所以以下的事情是家常便飯XD

久而久之一個專案內不小心就充滿了凌亂的commits
 
Git會記錄我們coding的一舉一動
我們已經知道藉由使用branch可以方便的讓我們切換版本
但是魔鬼藏在細節裡
真正紀錄我們細節的,其實就是那些年,無時無刻盯著我們
吃飯、睡覺、打code的commits

當我們每次進行commit的時候,都會有相對應的SHA碼
(SHA是一種演算法,在這邊就當成它是經由複雜的運算,來達到讓每次進行commit的時候,都不會有重複的狀況而採取的一種紀錄方法)
就好像我們每個人都有自己的身分證字號一樣
你可以在這邊找到你的commit他們的身分證字號

Github(網頁版)


Github(桌面版)


很棒吧,他們都已經排排站了喔
紅色框框的地方是你點一下就可以作一個複製的動作。
那今天就是要來示範如何將多餘的commit進行一個整理的動作
讓本來凌亂的紀錄,連小明都看得懂。

首先呢
請移駕到你的command line,我用的是Github提供的那個工具
先cd到你專案的資料夾
git rebase -i [SHA/commit版本號碼]
我這邊直接開最舊的起來改,中途會彈出一個文字檔,你的看起來應該也和下面的差不多:
pick e466349 Loading files
pick 8af9b37 Create README.md
pick 161534d small revision
pick d992172 small revision
pick 2cf85cd easy connected
pick 4769884 Nov 20
pick 92b4484 Nov 21
pick 30d9919 Nov 21 noon
pick bc92c4a Nov evening
pick 4771349 Nov 22
pick 266f43b Nov 23
pick a1990a4 Nov 24
pick 2100e46 Nov 24 v2
pick 196b0dc Nov 25

...

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
在這邊你可以自己一個一個commit慢慢玩
你會發現最舊commit它保管了最多的pick
換句話說,越舊的commit提供你更大的調整範圍
你可以根據自己的需求來進行pick reowrd edit squash fixup exec等動作
這些動作我想以後再介紹,今天重點就在使用squash

pick和squash最主要的不同是
當你用rebase指令開啟了一個commit
你會看到很多個pick(如果它不是最新的commit)
而當你把其中幾個pick註解掉或是刪掉的話
沒錯,它們就會像變了心的女朋友一樣
頭也不回的走了,永遠都回不來了!

那如果你是用squash的話,就很像是吾皇擁有後宮三千佳麗
卻無奈於經濟不景氣,本來一張鈔票可以買一碗牛肉麵
現在只能買一碗滷肉飯......所以把三千砍到剩千五的道理一樣
squash是向前融合(meld into),所以它的前一個動作不可為squash
(拜託不要呀~千五已經很少了......)

以我自己的專案為例,我只挑了最重要的幾條沒有squash
剩下的都向前融合(這邊用#會讓Git跳過不讀,等於註解):
#一開始的檔案
pick e466349 Loading files
squash 8af9b37 Create README.md
squash 161534d small revision
squash d992172 small revision
squash 2cf85cd easy connected
#建立主機伺服器連線
pick 4769884 Nov 20
squash 92b4484 Nov 21
squash 30d9919 Nov 21 noon
#動畫完成
pick bc92c4a Nov evening
squash 4771349 Nov 22
squash 266f43b Nov 23
squash a1990a4 Nov 24
squash 2100e46 Nov 24 v2
squash 196b0dc Nov 25
squash 2e6cbcd Nov 25 v2
squash bebe100 Nov 25 v3
...
接著請儲存後關掉記事本
沒有意外的話等一會又會有記事本彈出來和你報告:
# This is a combination of 5 commits.
# The first commit's message is:

Loading files

# This is the 2nd commit message:

Create README.md

# This is the 3rd commit message:

small revision

# This is the 4th commit message:

small revision

shake new activity

# This is the 5th commit message:

easy connected

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# rebase in progress; onto 4f12ce8
# You are currently editing a commit while rebasing branch 'ManualEntry-v2' on '4f12ce8'.
#
意思就是
「稟告皇上,在下已經把舊的幾個宮女fire掉了
然後請了一個最新的代替那些位置,您要為她取一個新的名字嗎?」
其實你可以把他們全部砍掉,留一個名稱就好。
「朕,覺der可以叫做Basic Settings。」
「喳!」
Basic settings

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# rebase in progress; onto 4f12ce8
# You are currently editing a commit while rebasing branch 'ManualEntry-v2' on '4f12ce8'.
#

一樣儲存後關掉記事本
中途你可能會遇到重複的現象,一直叫你取名幹嘛的
不過照著範例走,應該不會有問題。

Finally,我們就完成了整理commits的動作。
來ㄧ張selfie~


References


Reflection on using Git

這篇將依照目前使用Git的心得,簡單的對Git與提供保存Git與原始碼在雲端的網路服務Github進行介紹。

Git是什麼? 為什麼要用Git?
Git是一種版本控制的系統。
換句話說,Git可以提供你整個專案版本的監控
藉由使用版本控制系統,你可以自由地在每個版本之間切換
你可以測試不同的版本並且備份你的版本。

Git的備份功能和傳統我們認知的備份有很大的不同。
依照傳統的作法,我們在進行一個專案時,若遇到不同的想法想測試,
我們可能會先將檔案(或整個專案)複製一份,並且用複製出來的新版本進行修改
原版就先進行保存。所以這時候你可能會遇到這種情況:



之後當我們的每個版本都有一定程度的發展,你可能會遇到這種情況:



這種情況我認為是各有優缺啦:
Pros
Cons
  1. 無腦,直覺,不須傷腦筋。在當下可以快速的分離出各種版本,並確定未來的發展。

  1. 檔案一多管理起來將會很傷腦筋,並且很難依照命名來推測出每個版本之間細微的差異。 
  2. 重複的檔案佔額外的容量。

依照傳統的方式,若本來要發展的版本分岐不大,確實可以使用這種方法,因為若沒有進入後續維護的階段,其實非常的省時省力。但一旦踏入了維護的階段,看到那排山倒海而來的檔案......你可能會全身無力......

那使用Git呢? 由於Git是一個工具,我們在學習一樣工具如何使用的過程中多多少少會耗費一些學習的時間,但就我用到目前為止而言,覺得經濟效益確實比傳統的作法好上太多。使用Git需要使用命令工具列(也就是按壓鍵盤Windows+R後,輸入cmd會出現的東西)輸入一些命令,但有了Github提供的圖形化介面之後,其實已經好用很多。
使用Git的優缺點:
Pros
Cons
  1. 自由自在的切換版本(註1)。(尤其在開發Android常常會有同時會牽涉到程式碼與外觀的部分,這時候可以很快的切換版本並執行)
  2. 自由自在的查看版本內每個紀錄的細節(註2)。(像是這次又加了什麼新功能,把什麼東西改掉了)
  3. 備份的方式很像是幫你建立一個還原點,而沒有複製重複的檔案。
  1. Git的使用方式需要學習,且Github與Github提供的圖形化介面軟體目前沒有中文版本。

以前我用傳統的備份方式,有時候常常在不同版本的專案資料夾內把檔案拉來拉去,後來也忘記這些名字一樣的檔案到底哪個是有改過哪個是沒有改過的;或是說有時候不小心在系統詢問要不要取代時不小心按了取代,然後心血便付諸流水。

至少現在我用了Git,我能很肯定地說我可以很大膽的coding,我可以肆無忌憚的對程式碼大興土木,只要在每個關鍵點記得做一個記錄的動作,之後就算我改壞了,一行指令就回來啦。這時候你真的可以體會什麼叫作天無絕人之路、什麼叫作浪子回頭金不換XD

學習使用Git可以參考:
  1. 歐萊禮出版的版本控制使用Git(第二版),內文平易近人。
  2. 繁體中文的官方Git使用手冊,圖文並茂好消化。
註1:Git的checkout
註2:Git的commit

延伸閱讀:我的Git常用指令(準備中)