基本操作
- 基本操作都是在本地端個人使用 (不會弄壞 Git、遇到衝突)
建立 Git (init)
- 在目錄添加
.git 隱藏目錄
- 所以 git 指令都改動在此
.git 目錄,刪掉也等同移除 git 紀錄
- 專業稱呼是 Git Respository (版本庫)
# 建立一個新的資料夾,名稱為 GitExample
mkdir GitExample
# 移動到指定的路徑
# 路徑可以用拖拉的方式貼上
# 也可以打個 git 之後按下 tab 讓系統自動補完
cd 路徑
# 初始化一個空的 Git 版本庫
git init
- GUI 介面操作:
- File -> 找到
(create / init) Respository
新增紀錄點 (版本)
- 顧名思義就是將文件內容做紀錄,每一次紀錄都稱作一個 版本
- 各個功能與專有名詞,由編寫過程自然產生
- 跟上個版本相比,有差異的檔案 (Loacl Changes (number) 本地端變化)
- 剛開始編寫,從來沒提交過的檔案 (Untracked 未追蹤)
- 提交過一次,Git 開始能追蹤變化 (Tracked 追蹤中)
- 追蹤到有差異,但還不想提交的檔案 (Unstaged 未暫存檔案)
- 追蹤到有差異,且準備提交的檔案 (Staged 暫存檔案)
- 新增版本的相關指令,就是將檔案在各種狀態切換
- 不管過程如何,最後只有 Staged 暫存檔案 會被提交 (Commit)
修改檔案
- 就是自然地編輯文件
- 任何差異都會自動添加到 Loacl Changes (number) 本地端變化
# 如果在 MacOS 不會新增文件,可以下指令
#
# "" 裡面包含要寫入檔案的內容
# > 標準化輸出
# 把字串寫入 file1.txt ,不存在時會自動建立
echo "" > file1.txt
查看狀態 (status)
- 查看每個檔案分別處於什麼狀態 (Untracked / Tracked / Unstaged / Staged)
# 會看到 On branch name (目前在哪個分支)
# 分支預設會是 main or master (以前預設是 master,現在通常是 main)
git status
- GUI 介面操作:
- 在畫面上尋找類似
Local Changes (1) 這樣的字眼 (1 表示只有一個變化)
- 點進去就會看到 Unstaged / Staged 這樣的分隔畫面
更改狀態 (add / mv / rm / restore)
- 這些指令都用來變更檔案狀態
- 原則就是被
add or mv or rm 都會進入 Staged 暫存區
# 把 file1.txt 添加到暫存區
git add file1.txt
# 把所有變更添加到暫存區
# . 代表的是現在目錄位置
git add .
# 把檔案重新命名 or 調整位置
# file1.txt 更名成 file2.txt
git mv file1.txt file2.txt
# 把 file1.txt 從紀錄中移除
# 會進入暫存區,讓你添加一個刪除他的紀錄
git rm --cached file1.txt
# 把 file1.txt 移到未暫存區
git restore --staged file1.txt
- GUI 介面操作:
- 就在看到 Unstaged / Staged 這樣的分隔畫面做調整
提交變更 (commit)
- 把 Staged 暫存中 的檔案提交,建立新版本
- 提交說明要盡可能簡短清晰
- 這說明是尋找變化時的主要依靠
- 避免大量修改只寫個 "update"
# 建立一個紀錄點 (版本)
# -m 讓我們能為提交了什麼做說明
git commit -m "docs: added file1.txt"
忽略檔案 (ignore)
查看紀錄 (log)
# 顯示目前分支的詳細提交紀錄,查看完按 q 離開
# 例如:
#
# commit 59cef07c6cbc7cfa7d270f4363873ee79457d1b1
# Author: BR <snkp002@gmail.com>
# Date: Fri Dec 20 15:16:30 2024 +0800
#
# docs: 添加了 file1.txt
git log
# 顯示一行的簡單紀錄
# 例如:
#
# 59cef07 docs: 添加了 file1.txt
git log --oneline
暫存紀錄
- 儲物櫃會將尚未提交的變更進行保存,以便切換版本不會遺失
添加 (stash)
# 將所有變更建立一個儲物櫃
git stash
# 將所有變更建立一個儲物櫃,且自訂訊息
git stash -m "message"
查看 (stash list)
# 列出所有儲物櫃,按 q 退出
git stash list
# 查看特定儲物櫃的變更內容
git stash show stash@{0}
# 查看特定儲物櫃更詳細的變更內容
git stash show stash@{0} --patch
讀取 (stash apply /stash pop)
# 套用最新的儲物櫃 (stash@{0})
git stash apply
# 套用特定的儲物櫃
git stash apply stash@{n}
# 套用最新的儲物櫃 (套用後刪除)
git stash pop
# 套用特定的儲物櫃 (套用後刪除)
git stash pop stash@{n}
刪除 (stash drop)
# 刪除最新的儲物櫃 (stash@{0})
git stash drop
# 刪除特定的儲物櫃
git stash drop stash@{n
讀取紀錄點
- 切換版本就相當於遊戲的讀取存檔 (load)
- 切換的方法,會依需求有所變化
- 切換到指定的版本 (checkout)
- 切換到其他分支 (switch)
- HEAD 分支會指向目前所在位置
切換版本 (checkout)
# 還原到 59cef07 這個版本
# 59cef07 是提交版本的哈希值 (可以是完整或前幾位)
git checkout 59cef07
# 只有將 file1.txt 還原到 59cef07 版本
git checkout 59cef07 -- file1.txt
# 切換分支到 main 的最新提交
git checkout main
# 切換到標籤 v1.0.0
git checkout v1.0.0
- GUI 介面操作:
- 在條列式位置,對想要的版本連點兩下
- 也可以右鍵選擇 checkout
- 只還原特定檔案
- 在提交的詳細資訊的 Changes
- 對檔案右鍵 Reset File to ...
- GUI 也可能沒這功能
修正紀錄點
- 程式操作時,每次提交都要確保能正確執行
- 發現提交有問題的時候,可以有些修復手段
- 快速修復最後的提交說明 (amend)
- 提交逆向操作的恢復版本 (revert)
- 將分支重新設定到指定版本 (reset)
- 將大量提交重新修改 (rebase)
修正 (amend)
# 將最後的提交說明替換掉
git commit --amend -m "新的提交訊息"
- GUI 介面操作:
- 在發送 commit 的附近找找 Amend 選項
恢復版本 (revert)
- 會提交指定版本的逆操作,將某個版本給取消
- 不會刪除紀錄,因此多人操作下也安全
# 會依據當次提交的內容,自動產生逆操作來還原
git revert 59cef07
重設提交 (reset)
- 用於回到過去的某個版本,並且改變提交紀錄
- 通常用在 commit 忘了什麼,想重新提交
- 但是注意,任何刪除的動作,多人使用上都要小心
# 僅切換版本,但保留暫存區與檔案變更
git reset --soft HEAD~1
# 僅切換版本,並將變更移到未暫存區
git reset --mixed HEAD~1
# 切換版本,並且完全捨棄變更
git reset --hard HEAD~1
重新修改 (rebase)
- rebase 是把原本的提交 刪除,編輯之後再 覆蓋 到指定位置
- 此指令非常危險,只能在個人分支操作
- 操作後 SHA 值會改變,可能造成其他開發者的分支衝突
- 可以用在同步遠端前,在本地端做整理
- 兩件同樣事情的 commit 可以合併
- commit 訊息寫錯字做修正
- 刪除不需要的提交
- 把更動內容接枝到其他小分支
- 修改操作命令:
- pick:保留提交
- reword:修改提交訊息
- edit:修改提交內容
- squash:將此提交與前一個合併
- drop:刪除提交
# 從最新的提交,一直修改到指定的提交
# 會用到 vim 編輯器
# 按一下 i 進入編輯模式,去修改文字檔
# esc 能退出編輯模式
# shift+: 能輸入操作指令
# wq 儲存後退出,q! 不儲存直接退出
git rebase -i 59cef07
# 將目前分支的所有提交,接枝到 dev/br 分支
# 有人會用這方法接回 main,但回到 main 建議用 marge
# marge 會留下一個合併的紀錄,代表一個項目的結束
git rebase dev/br
複製紀錄點
採櫻桃 (cheey-pick)
- 來自西方國家的諺語,意思是只挑選對自己有利的
- GUI 介面操作:
- 對指定提交 (能多選) 右鍵選擇 cheey-pick
# 複製特定提交到當前分支
git cherry-pick 59cef07
# 複製一個範圍的提交,由舊的到新的
git cherry-pick 59cef07^..1fe252e
- GUI 介面操作:
- 對指定提交 (能多選) 右鍵選擇 cheey-pick
分支
- 建立新的分支就像是在遊戲開其他的存檔紀錄
- 一般會建議個人作業也建立個
dev 分支,避免直接在 main 修改
- 多人合作時會建立各自的分支降低開發衝突
- 但合併衝突始終無法完全避免
建立分支 (branch)
# 建立一個名為 dev 的分支
git branch dev
# 從指定提交建立新的分支
git branch dev 59cef07
# 建立一個名為 dev 的分支,並且切換到該分支
git branch -b dev
# 查看所有分支
# 有 * 的代表當前分支
git branch
合併分支 (merge)
- 將兩個分支合併,並且留下合併紀錄
- 多人開發時,可能遇到合併衝突
- 這種衝突來自雙方改了同個檔案,系統要確定怎麼合併才對
# 合併 dev 到當前的分支
git merge dev
- GUI 介面操作:
- 假如是合併回 main ,要先切到 main 再選擇要被合併的分支
- 一樣是右鍵 Merge 相關操作