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


沒有留言:

張貼留言