0%

git筆記

git 學習心得

1. 什麼是 git

git 是「分散式」版本控制

那什麼是版本?

  • 每次更新的檔案
  • 每一次的更改
  • 每次更新的紀錄

2. 安裝 git

  1. 先到 git 網站
  2. 右下點選 download for Windows 就會進到另一個網址並自動下載
  3. 安裝 git.exe(好像一直下一步就好)
    提示: 安裝路徑中不要有中文字,容易出錯。
    (可以參考這部五倍紅寶石的影片)
  4. 左下角的開始找尋 Git Bash

確認電腦裡是否有安裝過 git:

1
git --version

3. 設定環境變數

目的:告訴 git 這台電腦的使用者是誰,牽涉到後面使用 github。

1
2
3
4
5
6
7
8
9
# 設定環境變數
$ git config --global user.name "DanLu"
$ git config --global user.email "dandesign0818@gmail.com"

# 確認設定的內容
$ git config --list

# 其實設定檔是存在 ~/.gitconfig 這個檔案 也可以在裡面修改
cat ~/.gitconfig

4. 建立 repo

repository (儲存庫) –> repo

不可能整個電腦都給 git 管,這樣範圍會太大。
所以每一個專案的進度(版本)都是獨立控管

在要被控管的專案(ex: hello-git 資料夾)底下,輸入這個指令

1
2
# init 是 initial的縮寫
$ git init

會在這個 hello-git 內建立了 .git 檔案夾,之後所有關於 git 管理的資訊都會存在這個檔案夾。

Q: 如果 hello-git 這個檔案夾(專案) 不想再被 git 管理了?

A: 直接把整個 .git 檔案夾刪掉 rm -r .git

暫存區域: 放準備要提交的檔案 (這一次要 commit 的)


5. 在 repo 中新增、修改、刪除檔案

檔案狀態

下面示意圖說明了透過指令改變狀態的生命週期,事實上,這些改變的過程,都是在更新「索引檔」的過程。

  • untracked (未追蹤的,代表尚未被加入 Git 儲存庫的檔案狀態)
  • unmodified (未修改的,代表檔案第一次被加入,或是檔案內容與 HEAD 內容一致的狀態)
  • modified (已修改的,代表檔案已經被編輯過,或是檔案內容與 HEAD 內容不一致的狀態)
  • staged (等待被 commit 的,代表下次執行 git commit 會將這些檔案全部送入版本庫)
    圖片參考網址

查看 git 的狀態

1
$ git status

把檔案加入

1
$ git add <file>

提交這次的修改

1
$ git commit -m "正確填寫這次 commit 的資訊"

檢視這次修改的差異
工作目錄與暫存區域的比較

1
$ git diff <file>

暫存區域與儲存庫的比較

1
$ git diff --cached <file>

已經加入過的檔案,又有修改的話,一樣要再 add 一次,才可以 commit

1
2
$ git add <file>
$ git commit -m "xxxx"

針對已經加入過的檔案,可以直接用以下指令提交
這邊的 -a 代表 add

1
$ git commit -am "xxxxx"

可以「反悔」加入暫存區

1
$ git restore --staged <file>

反悔剛剛的修改
以前的指令是 checkout
連刪除檔案也可以反悔

1
$ git restore <file>

將刪除狀態加入暫存區
rm 跟 add 都可以,因為 git 是更新狀態

1
$ git rm/add <file>

讓檔案回到某個特定版本
<commit> 通常是複製 6~7 碼,重複的機率很低

1
$ git checkout <commit> test.txt

讓檔案回復到前兩個版本

1
$ git checkout HEAD~2 test.txt

回到現在版本

1
$ git checkout HEAD
  • Untracked files: 代表還沒加入給 git 管的檔案(不是每個檔案都要給 git 管)
  • git 的單位不是檔案,而是每次的修改。

git log 相關指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看提交紀錄
$ git log

# 查看特定檔案的紀錄
$ git log <file>

# 查看檔案修改細節
$ git log -p <file>

# 可以搜尋關鍵字
$ git log --grep="delete"

# 查看內容是誰編寫的
$ git blame test.txt

git 運作流程

圖中的 git checkout (舊寫法) 應該為 git switch (新寫法)

圖片參考網址


6. 建立分支(branch)與合併(merge)

分支模擬工具

預設分支: master / main

Github 預設為 main,所以用 main 比較好

把 git 預設分支改成 main

進入 .gitconfig

1
$ nano ~/.gitconfig

加入下面這段

1
2
[init]
defaultBranch = main

如果 hello-git 已經是 master 的話可以執行以下指令把主分支改成 main

1
$ git branch -m master main

branch

1
2
3
4
5
6
7
8
9
10
# 檢視分支
$ git branch

# * 是標注當前所在的分支

# 建立分支
$ git branch <branch-name>

# 切換分支
$ git switch <branch-name>

merge

情境:
分支 main: 主分支
分支 login: 這是用開發 login 功能的

當我們把 login 功能完成後,必須把這個 login 分支「merge」回主分支去

1
2
3
4
5
# 先切回main分支
$ git switch main

# merge main 跟 login
$ git merge login

如果兩個分支有提交過同一個檔案的修改,那就有可能發生衝突 conflict,此時就需要解衝突
ex: main 有增加 h1,login 有增加 input
只能人工修改,需要跟同事討論
解完衝突之後,就要再 commit 一次 (bash 有提示)

當發 pull request 的時候,有衝突,要求開發的人回到自己的電腦,
把 main merge 進去 login 一次,再 push 一次這個 login。

git hub 教學

7. 建立 github repo

  1. 在 repositories 畫面按右邊綠色的 new 按鈕
  2. 輸入專案名稱
  3. public: 大家都看的到 private: 可以決定誰看的到
  4. 可以選用 HTTPS 或 SSH,目前我們是使用 HTTPS

在 github 上建立一個 github repo

1
git remote add origin https://github.com/Danniel-Lu/hello-git.git
1
2
#通常第一次push要加 -u (-u:做紀錄的意思,upstream)
git push -u origin main
  • push: 推送程式碼到遠端去,而且是推到 origin 這個遠端,要推送的分支是 main

任務 8: 撰寫 readme

像是 github 專案下面會出現的文字說明就是 README.md 檔

README.md 通常都是大寫表示

https://markdown.tw/

使用 Markdown 語法撰寫 readme 檔案

  • 介紹專案
  • 解釋專案怎麼安裝
  • 解釋專案怎麼使用

任務 9: 了解 git flow

要合併分支,會在 github 發 pull request,再請另外一個同事幫忙做 code review。

  • 測試看看要合併的這個分支功能是否正常
    • 測試哪些情境?
    • 開發工程師的產出是程式碼
  • coding style 有沒有符合我們團隊的規範
  • 看看這次的程式有沒有什麼可能的問題,例如效能問題

0. 常用的終端機指令

Windows MacOS/Linux 說明
cd cd 切換目錄 change directory
cd pwd 顯示目前所在路徑 print working directory
dir ls 列出目前檔案夾的檔案列表 list
mkdir mkdir 建立新的檔案夾 make dir
copy cp 複製檔案 copy
move mv 移動檔案 move
del rm 刪除檔案 remove
cls clear 清除畫面上的內容
cat cat 印出檔案內容

windows 的 Git Bash 可以用 Mac 的指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 建立 hello-git 檔案夾
mkdir hello-git

# 進入 hello-git 檔案夾
cd hello-git

# 建立檔案 test.txt
touch test.txt

# 在Git Bash修改檔案
nano <fileName>

1. 修改完按 ctrl+x
2. Save modified buffer?(有沒有要存檔) 按 y
3. File Name to Write [DOS Format]: <fileName>(有沒有要改檔名) 按 enter

# 檢視檔案內容
cat test.txt

# 列出檔案
ls

# 列出全部檔案(列出隱藏檔)
ls -a

# 以完整格式列出檔案
ls -l

# 以完整格式列出所有的檔案
ls -al

# 顯示人類比較看得懂的單位 ex.KB,MB,GB...
# ex. ls-alh 原本會顯示2112 bytes 加了 -h 會變成 2.1K
ls -h

參數可以使用多個

參數的意義,不同指令會不一樣,但通常會是這樣

-a => all 全部——–ex: ls -a 列出全部檔案(列出隱藏檔

-r => recursive ->可以刪除每一層資料夾

-f => force 強制 * => 全部

/ => 根目錄

ex: rm -rf /* =>電腦會變磚塊,不能亂下

1
2
3
4
5
6
7
8
9
10
. 目前的檔案夾位置
.. 上一層檔案夾
~ 我的目錄,就是目前這個「使用者的目錄」,像是 /Users/aaa 之類的

# 回到使用者目錄或是 home 目錄
cd ~
# 回到上一層
cd ..
# 回到上兩層
cd ../..