Git版本控制 筆記

安裝 Git

  • Windows
進入官網 http://git-scm.com/

Windows Terminal 美化 (oh-my-posh3)

有鑑於Windows Terminal真的是醜到無法言喻,雙系統都有用的我更加難以忍受,於是美化它變成了必備的課題,共勉之。

  1. 直接在微軟商店搜索oh my posh下載安裝(沒有Windows Terminal的可以安装一下Windows Terminal)
    • Windows Terminal
    • oh my posh
    • 字體-MesloLGM NF
    • 安裝完成後,打開Windows Terminal,按Ctrl+Shift+, 開啟settings.json更改字型避免亂碼
    • 回到Windows Terminal -> notepad $profile 第一次會顯示找不到文件檔,創建新文件並且輸入"oh-my-posh init pwsh | Invoke-Expression"並且保存
// Windows Terminal -> Ctrl + Shift + , -> settings.json
profiles:
{
    "defaults": {},
}

// 改成
profiles:
{
    "defaults": 
    {
        "font":
            {
                "face": "MesloLGM NF"
            }
    },
}

// Windows Terminal ->  notepad $profile
第一次會顯示找不到文件檔,創建新文件並且輸入"oh-my-posh init pwsh | Invoke-Expression"並且保存

// Error 出現無法載入Windows Powershell XXXX.ps1檔案
如果出現無法載入Windows Powershell XXXX.ps1檔案,先開啟Powershell並且輸入"Set-ExecutionPolicy RemoteSigned",然後改為Y即可變更執行原則

// 更改主題配置
輸入"Get-PoshThemes",複製喜歡的主題樣式檔案路徑,重新輸入"notepad $profile"開啟文件檔,將內容改為"oh-my-posh init pwsh --config "C:\Program Files (x86)\oh-my-posh\themes\dracula.omp.json" | Invoke-Expression"

git 概念

  • 目的:有效管理多位工程師所寫的程式,達到多人協作開發
  • .git 資料夾
    • 用途:管理該repository中的Git版本控制的所有資訊
    • 常見的Git管理工具
      • Intellij(JetBrains 旗下IDE)
      • 終端機指令
      • SourceTree
  • .gitignore
    • 用途:設定要忽略哪些檔案,符合條件的檔案,不會被加入版本控制系統
      • 需要提前設定
    • 用法:
      • intellij創建Spring Boot專案時會自動產生
// if no files
$ touch .gitignore

// example
index.html
css/
*.html

git 常用指令以及名詞

master:本地端master
origin/master:雲端倉庫master

git pull
git push -u origin [branch]
git checkout -b [branch]

創建Repository

更換https / ssh

在電腦上設定ssh金鑰

打開 Terminal 輸入

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

輸入後就會出現下面這幾行:

Generating public/private rsa key pair.
Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]

Generating public/private rsa key pair.
此行的意思就是會根據提供的 email 創建一個新的 SSH 金鑰。

Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
這一行是確認儲存的位置,可以直接按下 Enter 就好。

Enter passphrase (empty for no passphrase): [Type a passphrase] Enter same passphrase again: [Type passphrase again]
這兩行是要輸入密碼與確認密碼,如果不輸入就空白即可。

加入 SSH-Agent
- 確認 ssh-agent 啟動
$ eval $(ssh-agent -s)

將 SSH Key 加入 GitHub 帳號中
- 輸入以下指令,複製 SSH Key 至剪貼簿
- windows : cat ~/.ssh/id_rsa.pub
- mac : cat ~/.ssh/id_rsa.pub | pbcopy
接著去GitHub設定SSH and GPG keys貼上即可


測試 SSH Key 聯繫
- 開啟 命令提示字元 或是 Git Bash
- ssh -T git@github.com

出現以下訊息就是成功了~
Hi username! You've successfully authenticated, but GitHub does not
provide shell access.

每次push / pull 不用輸入密碼的方式

// Start ssh-agent if not started:
$ eval `ssh-agent -s`

// Add your private key using ssh-add
$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /home/user/.ssh/id_rsa:  
Identity added: /home/user/.ssh/id_rsa  
(/home/user/.ssh/id_rsa)

// Check if the key is added (parameter is a lowercase L):
$ ssh-add -l  
2048 55:96:1a:b1:31:f6:f0:6f:d8:a7:49:1a:e5:4c:94:6f  
/home/user/.ssh/id_rsa (RSA)

// Try to connect to your Git server:
$ ssh git.example.com

Git Branch概念

  • 每一個branch就是一個平行世界,不會互相影響
  • 透過git checkout指令去切換branch

合併分支

  • 使用Git的merge指令(非常少用)
將branch內的commit合併到master裡面
接著將包含新的commit的master push到雲端上

tips:更改了什麼,其他工程師很難知道,而且直接合併到master容易影響系統
  • 提交Pull Request(最常用,目前主流)
將分支push到雲端上後
在雲端上提交Pull Request

tips:其他工程師可以查看你在branch中進行的改動(一般稱為code review)

處理branch的合併衝突(Merge Conflict)

  • 一般發生在多位工程師,同時去修改同份檔案的情況下
  • 最容易出錯的地方,要特別注意

Git指令 - Stash

  • 用途:暫存程式的改動
  • 使用情境:
    • 在切換Branch之前,如果程式寫到一半,可以先Stash暫存
git stash

// 查看有哪些暫存
git stash list

// 復原暫存
git stash pop

// 清除最新暫存
git stash drop

// 清除全部暫存
git stash clear

Git指令 - Merge、Rebase、Squash

  • 用途:皆可以用來合併branch,差別在Git線圖以及Commit紀錄

修改Commit Message

  • 用途:當發現舊有Commit註解,去修改為正確的註解方便日後維護可讀性
  • 基本上一開始註解照著規範去走,避免日後出現要修改的情況出現,修改message建議只在一人開發時使用
// 使用git rebase -i HEAD~5確定要修改哪些commit
// 其中,HEAD~5表示最近的5個,後面的5可以改成其他數字。
git rebase -i HEAD~5

----------------------

// 接著會列出最近五筆commit
pick 1d316b0 message01
pick f429786 message02
pick 880cfbc message03
pick c55cf56 message04
pick d10fd07 message05

左邊第一列表示命令(command)
中間一列表示commit id
最右邊一列是我們之前提交的message

這裡的展示順序
是按事件順序排列的
就是說第一行是最早提交的資訊

----------------------

// tips: 按i進入編輯模式、esc離開編輯模式、:wq儲存離開
假設我們需要修改第2條和第4條commit的message
則需要將它們的命令(command)
由pick修改為edit
刪除則是改為drop
其它地方保持不變(此時還不用修改message)

----------------------

pick 1d316b0 message01
edit f429786 message02 <- 注意本行第一列的pick改為edit了
pick 880cfbc message03
edit c55cf56 message04 <- 注意本行第一列的pick改為edit了
pick d10fd07 message05

修改完成之後,儲存修改。

----------------------

儲存完了之後
git的分支就會發生改變
從原來的master改成了我們第一個edit的commit id

test-rebase git:(master) >
test-rebase git:(f429786) >

// 修改message
// tips: 按i進入編輯模式、esc離開編輯模式、:wq儲存離開
git commit --amend

// 對修改進行儲存
git rebase --continue

// 標記了幾個edit就重複幾次以上修改與儲存
Successfully rebased and updated refs/heads/master.

// 使用git push -f強制更新遠端伺服器
git push -f