[筆記] Git 超新手入門


Posted by yuhantaiwan on 2020-06-28

前言

此篇筆記為參加程式導師實驗計畫中,整理在 Lidemy [Git101] Git 超新手入門 的課程筆記。

簡介

What 什麼是 Git 和版本控制?

Git 就是一種版本控制的系統。版本控制簡單來說就是進階版的檔案管理。我們平常管理資料夾與檔案的操作,包含最常見的複製、命名等。例如:HW1, HW2...; Work1-1, Work1-2...

Why 為什麼要版本控制?

版本控制不只是基本的新增、複製與刪除檔案,還能詳細紀錄檔案內容是誰以及什麼時候寫的,保留所有歷史紀錄。在不小心刪掉檔案後,還能找回來!不管是個人或團隊開發上使用 Git 進行版本控制,都相當方便!

How 如何使用 Git 版本控制?

可以使用 CLI (命令列介面) 或 GUI (圖形化介面),進行操作。著名的 GUI 例如:SourceTree, GitKraken 等。本篇筆記以 CLI 進行 Git 指令的介紹。

Git 工作區域

  1. 工作目錄 (Working Directory): 就是你電腦裡的工作區,現在正在編輯檔案的地方。
  2. 暫存區 (Staging Area): 在你要把檔案交給 Git 留下記錄前,先把檔案暫時存放的地方。
  3. 儲存庫 (Repository): 就是正式把檔案存放在 Git 的地方。放在這裡,才會在 Git 裡留有記錄喔!

情境

你有一個叫做菜哥的朋友,他有一個煩惱。因為他的笑話太多了,所以他目前都用文字檔記錄在電腦裡,可是變得越來越多之後很難紀錄,而且他的笑話是會演進的。會有版本一、版本二甚至到版本十,這樣他就要建立好多個不同的檔案,弄得他頭很痛。他希望你能教他用 Git 來做版本控制。
好心的你就要來教他 Git 的基本概念以及基礎的使用囉!

基本操作

1. 安裝

官網下載 Git。
下載後,打開終端機,輸入 git --version ,若有出現下載版本資訊,就代表你安裝成功了。

$ git --version
git version 2.24.3 (Apple Git-128)

2. 移動位置

在開始使用 Git 前,先移動目前的位置到要進行版本控制的目標資料夾

$ pwd  # 目前所在位置 
/Users/tsai

$ ls  # 列出目前所在位置底下的所有資料夾與檔案
Applications Documents    Library      Music        Pictures     Public       hello-world
Desktop      Downloads    Movies

$ cd Documents/jokesAll  # 移動到 jokesAll 這個資料夾

3. 初始化

使用 git init 才能讓 Git 對這個資料夾進行版本控制。

$ git init
Initialized empty Git repository in /Users/tsai/Documents/jokesAll/.git/

這時你會發現在你的 jokesAll 這個資料夾內,多了一個 .git 的隱藏檔。有了這個隱藏檔,就表示你的 Git 初始化成功啦!

4. 知道目前 Git 的狀態

使用 git status 這個好用的指令,他可以呈現目前所有檔案的 Git 狀態。告訴你許多有用的資訊喔!

$ git status
On branch master
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    joke1
nothing added to commit but untracked files present (use "git add" to track)

5. 把檔案放到暫存區

使用 git add 可以把檔案從本地端移到 Git 的暫存區

$ git add joke1  #或是
$ git add .
  • git add 檔案名稱 : 一次移動一個檔案
  • git add . : 一次移動全部檔案

6. 把檔案正式提交到 Git 的儲存庫

使用 git commit 把檔案從暫存區移動到儲存庫,並留下這次提交的一些訊息內容,例如:"This is my first joke!"
唯有把檔案放到儲存庫中,才能在 Git 中留下紀錄!

$ git commit -m "訊息內容"

在這之後,若想到什麼新的點子想放進 joke1,或是想到另一個全新的笑話,寫在 joke2,都可以用 git add, git commit,把檔案提交給 Git。

7. 檢視 commit 的紀錄

使用 git log 指令就能查看你 commit 的所有歷史紀錄。包含:版本號碼、是誰以及什麼時間提交等資訊。

$ git log
commit fb6232b78f5db742e2da3a7e2e4a00d96fa65e43 (HEAD -> master)
Author: XX <xxxxxx@gmail.com>
Date:   Sun Jun 21 00:57:23 2020 +0800

    create joke2

commit 8794f2c6b534156f0672ffc319a3546ef764aa18
Author: XX <xxxxxx@gmail.com>
Date:   Sun Jun 21 00:24:15 2020 +0800

    first commit
(END)
  • git log --oneline --graph : 獲得較簡短的歷史紀錄資訊

8. 回到某個版本

有了 commit 留下的紀錄,我們就能用 git checkout 加上其獨特的識別碼,讓我們的工作區回復到某個特定的版本。

$ git checkout {版本號}

假設今天你覺得第二次 commit 的內容不喜歡,想回到第一個版本時,就可以利用 git checkout 加上第一次的版本號,就能回到過去了。

9. 開分支開發新功能

$ git branch {分支名稱}

如果今天你想找你的朋友 h0w 哥一起幫你想更好笑的笑話。那就可以另開分支,意思就是複製一份現在的工作區域內容。這樣你們可以分頭進行而不會相互影響了。

10. 合併分支

$ git merge {new-feature}

今天 h0w 哥想出了不錯的點子,記錄在他分支上。你想把他的檔案合併進來,就可以使用 git merge 加上他的分支名稱,就能讓你的工作區包含他寫的新內容了。

而目前這些版本控制都是放在電腦內,若你想要讓更多人看見你的笑話。就可以使用 GitHub。

GitHub 簡言之就是雲端的 Git repository。

11. 推上 GitHub

$ git remote add origin {網址}   # 建立遠端的連線
$ git push -u origin master

利用 git push 指令,就可以把電腦裡的檔案上傳到 GitHub

12. 獲得最新異動

$ git pull origin master

假設今天跟你一起合作工作的 h0w 哥,修改了一份檔案並上傳到 GitHub,若你想要獲得這份新的更動資料,就可以使用 git pull 指令,把遠端 master 分支的檔案拉下來到你的電腦裡。

以上就是基本的 Git 操作,多練習就能得心應手,做好檔案的版本控制囉!

GitHub 補充

Git 跟 GitHub 的差別

  • Git : 工具
  • GitHub : 網站。使用 Ruby on Rails 開發,是一個 Git Server

GitHub Flow

在 GitHub 上管理分支的方法

Create a branch -> Add commits -> Open a Pull Request -> Discuss and review your code -> Deploy -> Merge

詳細資訊請參考:Understanding the GitHub flow

狀況劇

我 commit 了但是想改 commit message

  • 修改最後一次 commit message:
$ git commit --amend -m "{訊息}"
  • 修改之前歷史紀錄的 commit message:
1. $ git log --oneline
2. $ git rebase -i {要回去的版本號}
3. 把 pick 改成 reword
4. 修改訊息內容,存檔離開

我 commit 了可是我又不想 commit 了

git reset HEAD^ --hard, --soft
  • hard : 上一個修正的檔案與commit都移除了
  • soft : 上一個修正的檔案還在,但commit移除了

詳細資料請參考:Git reset 的三種模式( soft mixed hard )比較

我還沒 commit,但我改的東西我不想要了

  • 回到特定檔案未修改之前:
git checkout -- <file>
  • 全部檔案返回未修改之前:
git checkout .

我想改 branch 的名字

git branch -m <new brach name>

想摘下遠端的 branch 給你

git checkout <遠端branch名稱>

參考資料


#Lidemy #Git #w3HexSchool







Related Posts

一起來玩 OSRF 的 TensorFlow Object Detector

一起來玩 OSRF 的 TensorFlow Object Detector

# JavaScript Immutable ( 不可變 ) 概念

# JavaScript Immutable ( 不可變 ) 概念

在Gatsby GraphQL中組合出完美資料

在Gatsby GraphQL中組合出完美資料



Comments