大家一起來Git!

謝佳瑋
10 min readOct 22, 2017

--

我的備份三份的故事

說到git就要說起我的備份三份的故事了,首先我有個Project,第一次備份長這樣。

第一次備份

這樣才備份一份,那另外兩份在哪裡?

答案:一份在隨身碟,另一份在雲端硬碟。笑稱“異地備援”

照這個備份法,久而久之就變成這樣。

目前進度與歷史版本備份
V1.0備份

雖然這樣看起來每個階段的檔案跟備份都有,連版本都有,好像這樣管理起來不錯,可是呢?有一天我需要找回某一天被我刪除的程式碼或是檔案我就不知道從何找起了,我忘記是在哪一天、哪個版本被我刪除了。而且這樣的備份會越來越多,佔儲存空間就會越來越大,甚至儲存空間不夠使用,要另外在放到其他地方,之後要找出某個歷史紀錄又更加的費工了。

剛開始使用Git

第一次知道git這東西看到學長在使用GitHub Desktop在做專題的版本控管,後來是因為團隊需要才開始學使用git,只是剛開始學只用簡單幾個功能,Add、Commit、Push、Pull。

就是功能列上面那ㄧ排

遇到任何錯誤時我連Google出來的答案也看不懂,只能一直拜託人幫我解,就這樣一邊踩地雷一邊學習git,但是還是不清楚我使用這些功能發生什麼事,直到現在課堂上教git我才對git的處理細節有比較深入的理解。

來安裝Git在電腦吧!

  1. 下載Git並安裝
  2. Git GUI Clients

3. 設定Git

$ git config --global user.name "<Username>"$ git config --global user.email "<User Email>"

其他設定:

顯示顏色(方便檢視):

$ git config --global color.ui true
  • 設定 lg 為個人化指令(美化 log 顯示):
$ git config --global alias.lg "log --color --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --"
  • 設定git預設編輯器:
$ git config --global core.editor <編輯器名稱>

認識Git

開始使用Git

雖然我現在比較常在使用Git GUI( GitKraken ),但有時侯還是會需要使用指令的,所以我兩種方式都會在下面使用。

  • 建立git版控(指令)

首先先到要進行版本控制的資料夾裡面

檔案管理(左)、終端機(右)
$ git init

使用GitKraken則File → Init Repo → Init → Browse<選擇資料夾> → Create Repository

指令下完之後,資料夾裡面會出現一個.git的隱藏檔,這是git的本地端版空資料庫,如果是使用GitKraken會自動建立一個初始化版本跟一個README.md文件

.git
GitKraken init

然後現在我看見資料夾有個.DS_Store的隱藏檔,在目前它是可以哪入版控的,可是我並不想把他納入版控,git很好的給我們一個讓我們可以忽略掉那些不想納入版控的機密文件、不需要版控的檔案可以設定的地方,那東西就叫做gitignore ,作法是建立一個叫.gitignore的檔案,把要忽略的檔案、副檔名、資料夾等寫進裡面。

gitignore

這個樣子.DS_Store就不會在版控中了。

開始版本控制

首先介紹git中的三個區塊,工作區、暫存區、儲存區。

https://kingofamani.gitbooks.io/git-teach/content/chapter_2/repo.html

平常檔案會在會在工作區,當我們想把檔案進行版控時會將檔案加進暫存區

git add
  • 檔案加進暫存區的指令
$ git add <full file name>
// 加進一個檔案
$ git add .
// 加進全部檔案
$ git status
// 顯示目前暫存區狀態

GitKraken則是在Unstaged Files點檔案旁邊的stage file,全部檔案則點stage all changes

建立一個新版本

  • 指令
$ git commit -m “<commit message>”

GitKraken則是在Commit Message的Summary打入訊息,點下方綠色按鈕。

git commit

查看目前所有版本

  • 指令
$ git log$ git lg
// 美化過的個人log指令

GitKraken正中間區域就是了

git log
美化過的Log

上面是以前剛學git會的基本,下面是上課之後比較理解的部分。

建立分支(branch)

$ git branch
// 查看目前所有分支
TEST
* master
// * HEAD所指向的分支,也就是目前所在的分支
$ git branch <branch name>$ git checkout <branch name>
// 切換分支
$ git checkout <version SHA-1 value>
// ex: git checkout 87ea257e6921256fb04e50280fb3ec71d8d35458
// 其實只需要前6碼就夠了,git checkout 87ea25

GitKraken只要在目前的分支上面點右鍵 → create branch here → 打入名稱 →按下Enter 就可以建立分支。

GitKraken要切換到某個分支只要雙擊那個分支就可以了。

當我的TEST分支跟master分支版本越差越多,想要進行合併怎麼辦。

第一種方法merge

假如我想要把TEST所有異動都給master,首先切到master。

$ git merge <branch name>
//<branch name>合併到目前所在的分支
git merge TEST

GitKraken:把TEST的標籤拉到master標籤上 →Merge TEST into master

使用merge會產生新節點。

第二種方法rebase

這種方式是看起來不會產生新節點的方法,只用大挪移把某分支所有節點移動到某參考分支,不適合用在已經推到遠端的commit

假如我想要把TEST所有異動都給master,首先切到TEST。

$ git rebase <基準參考分支名稱>git rebase master

GitKraken:把TEST的標籤拉到master標籤上,選Rebase TEST onto master

回到過去版本

  • Reset
$ git reset <version SHA-1值>
--mixed -> working directory
--soft -> staging area
--hard -> X直接刪除指定版本之後才出現的檔案

$ git reset HEAD^ --hard <version SHA-1值>
# 回到前一個(^),回到上兩個(^^)

$ git reset HEAD~5 <version SHA-1值>
# 回到上5個

$ git reset SHA-1值 --hard <version SHA-1值>
  • Rebase

rebase 把整條分支移動合併

(將Aㄧ個個節點從temp加進B,在把A貼到rebase後的B)

$ git rebase <分支>$ git rebase -i <version SHA-1值>
# 互動模式,可以修改commit,SHA-1會改變
# 建議在有push之前才使用
  • Revert
$ git revert <version SHA-1值>
// 回到指定版本並產生新節點

GitKraken:只要在某個版本節點上按右鍵就可以Reset或Revert

設定遠端版本控制

例如我在GitHub上面Create a new repository,我要將它跟本機端整合一起管理。

  • 將遠端版本控制拉回本地端(clone)
$ git clone <remote path>
// ex: git clone https://github.com/xxxnamexxx/xxxrepositoryxxx.git
  • 將本地端設置遠端(remote)
$ git remote add <custom name> <remote path>
// <custom name>預設是origin
  • 將遠端更新拉回本地端
$ git fetch
  • 將遠端更新拉回本地端並且合併
$ git pull
// git fetch + git merge
  • 將本地端更新推上遠端
$ git push <remote branch> <local branch>
// -u 設為預設值, ex:git push -u <remote branch> <local branch>
//之後只要下 git push就會推到預設
$ git push

GitKraken:

GitKraken

心得:

雖然git剛學得時候覺得很困難,又到處碰壁,現在在完整學一次git之後,對我之前有所不清楚的地方有比較理解,也比較搞得清楚git的運作原理,以前以為git像是樹狀結構。在團隊開發上用git真的比用複製貼上再加上壓縮要輕鬆許多。

參考:

--

--