git

git 是什麼? (from ChatGPT)

Git 是一種分散式版本控制系統(Distributed Version Control System,DVCS)。它是一個用於追蹤代碼更改的工具,使多人協作在同一項目上變得更加順暢。以下是一些 Git 的主要特點:

  1. 版本控制: Git 可以記錄項目的每一個版本。這意味著你可以輕鬆地回溯到以前的版本,查看變更歷史,或在需要時還原到先前的狀態。
  2. 分散式: Git 是一個分散式版本控制系統,每個使用者都有一個完整的存儲庫(包含完整歷史記錄)。這使得協作變得更加靈活,不依賴於中央服務器。
  3. 分支管理: Git 鼓勵使用分支(Branches)來開發新功能或進行修復,而不會影響主要的代碼庫。這使得同時進行多個功能的開發變得更加容易。
  4. 高效性能: Git 在處理大型項目時表現出色,因為它使用了一些高效的算法。
  5. 開源: Git 是一個開源項目,任何人都可以查看其源代碼、提出改進建議,並在符合許可條款的情況下自由使用。
  6. 廣泛應用: Git 已經成為許多項目和組織的標準版本控制系統,包括開源項目和企業應用。

Git 是由林納斯·托瓦茲(Linus Torvalds)創建的,最初是為了更好地管理 Linux 內核的代碼。它現在已經成為許多軟體開發項目不可或缺的工具。

git 官方文件

git

id 可用 HEAD 代替

HEAD^ = HEAD 的前一個(與 HEAD^1 相等)

HEAD^^ = HEAD 的前兩個,但 HEAD^2 不是 HEAD^^ ,他是 HEAD^1 的另一條路線

HEAD~1 = HEAD 的前一個 、 HEAD~2 = HEAD 的前兩個

工作區 = workspace

暫存區 = staged

某些指令在檔案路徑之前可以加入 -- ,但非必要。 因為某些特殊情況(例如檔案剛好以--開頭),可以明確告知git這個--之後出現的--filename是檔名的一部分,而不是指令

version & update

git version  # 查看 git 版號

# for windows
git update-git-for-windows

# for ubuntu
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git

congif

git config --global user.email "your email"
git config --global user.name "your name"
git config --global core.autocrlf input  # linux/mac 環境下設定
git config --global core.autocrlf true  # windows 環境下設定
git config --global core.editor "code --wait"
git config --global init.defaultBranch main

cloone

git clone <url>  # 拉取特定儲存庫到該儲存庫相同名稱的資料夾下
git clone <url> <dir-name>  # 拉取特定儲存庫,並將其存在特定資料夾下

init

git init  # 初始化一個 git

status

git status  # 查看 git 狀態

add

git add .  # 將所有改動的檔案從工作區加入暫存區
git add <files>  # 只將特定檔案加入暫存區

commit

git commit -m "initial commit"
git commit -am "add and commit"  # add 並 commit  但對新檔案無效
git commit --amend  # 開啟編輯器修改上一個commit 的訊息 或 檔案內容
git commit --amend --no-edit  # 修改上一個commit的檔案內容,但不開啟編輯器修改 commit 訊息
git commit --amend --date="YYYY-MM-DDThh:mm:ss"  # 修改上次提交日期 前面需加上類似 GIT_COMMITTER_DATE=2024-02-10T06:16:11 的訊息

log

git log  # 顯示詳細 log
git log --oneline  # 顯示單行 log
git log --graph  # 顯示 log 分支路線圖

diff

git diff  # 比較還沒 add 的檔案與工作區的差異
git diff --cached  # 比較暫存區的檔案(git add 後的)與工作區的差異
git diff <id>  # 比較特定 commit 與 HEAD 的差異
git diff <id1> <id2>  # 比較特定兩個 commit 之間的差異

tag

git tag <tag-name>  # 添加標籤到 HEAD
git tag <tag-name> <id> # 將標籤加到特定 commit
git tag <tag-name> <id> -a -m <message>  # 有附註 message 的標籤
git tag -d <tag-name>  # 刪除特定標籤

push

git push  # 如果有設定好上游分支則會自動推送
git push -f  # 強制推送覆蓋遠端儲存庫
git push origin main  # 推到指定儲存庫的特定分支
git push --set-upstream origin main  # 設定上游分支

git push origin <tag-name>  # 推送單一標籤
git push --tags  # 單純推送所有 tag
git push --follow-tags  # 推送所有已經被上標籤的 commit 和 tag
git push --all --tags  # 推送所有的 commit 和 tag

git push origin --delete <branch>  # 刪除遠端分支
git push --delete origin <tag-name>  # 刪除遠端標籤

fetch

git fetch  # 從遠端下載最新的 commit,但不會自動合併到現在的工作區內

pull

git pull  # pull = fetch + merge。 會先使用 fetch 從遠端下載最新的 commit,然後自動合併到目前的工作區內
git pull --no-ff  # 下載遠端並合併時候不要使用快轉合併
git pull --rebase  # 下載後使用 rebase 進行合併

branch

git branch  # 查看所有本地分支
git branch -vv  # 查看本地極其對應的上游分支
git branch -r  # 查看所有遠端分支
git branch <new-branch>  # 從現在分支創建出一個新分支
git branch -m <old-branch> <new-branch>  # 分支改名
git branch -f <branch> <branch/id>  # 移動分支貼紙
git branch -d <branch>  # 刪除本地分支 (已合併分支可用 -d)
git branch -D branch-to-delete  # 刪除未合併分支必須用 -D
git branch -u origin/feature-branch feature-branch # 設定上游分支

checkout

git checkout <id>  # 切換 HEAD 到某個指定地方
git checkout <id> <file>  # 將指定檔案恢復到特定 commit 時間點的狀態

# 以下不推薦使用,可以用其他指令代替
g  # 切換分支 (git switch)
git checkout -b <new-branch>  # 創建並切換分支 (git switch -c)
git checkout <file>  # 將未加入到暫存區的檔案恢復到指定到最新 commit 的檔案狀態 (git restore)

switch

git switch <branch>  # 切換分支
git switch -c <new-branch>  # 創建並切換分支

revert

git revert <id>  # 撤銷該點之後的提交並提交成一個新的 commit

reset

git reset # 取消目前所有暫存區的檔案 (git reset --mixed) (git restore --staged .)
git reset HEAD <file>  # 只重置單一檔案
git reset --soft <id>  # 重置到某個 commit,但不會將檔案移出暫存區,也不會影響工作區的檔案
git reset --hard <id>  # 重置到某個時間點的 commit (會一併取消該commit之後的提交,及工作區的檔案)

restore

git restore --staged <files>  # 將指定檔案移除 staged 範圍 (git add 的準備 commit區)
git restore <files>  # 將指定且未放到暫存區的檔案恢復修改 (恢復到已經提交的最新commit的狀態)。相當於 git checkout HEAD <files>

merge

git merge <merge-branch-name>
git add <conflicted-file>
git merge --continue
git merge --abort
git merge --no-ff
git merge --no-commit

rebase

git rebase <branch>
git rebase --abort

git rebase -i <id>  # 允許你擠壓、編輯過去commit訊息等操作

reflog

git reflog
git reset --hard ORIG_HEAD  # 危險操作,建議先使用下面指令檢查
git log ORIG_HEAD..HEAD

cherry-pick

git cherry-pick <id>  # 指合併部分 commit 內容,接到目前分支後面
git cherry-pick <id> --no-commit  # 先加入暫存區,而不是直接 commit

stash

git stash  # stash 目前工作區到 commit之間的改動
git stash pop  # 彈出最新的 stash 並刪除
git stash list  # 列出目前的 stash
git stash apply <stash@{0}> # 恢復特定 stash,但不會刪除
git stash drop <stash@{1}> # 刪除特定 stash
git stash clear  # 刪除所有 stash

remote

git remote  # 列出本地存儲庫中已經設定的所有遠端存儲庫的名字(通常是 origin)
git remote -v  # 列出遠端處存庫的詳細訊息
git remote add <remote-name> <remote-url>  # 添加遠端儲存庫
git remote remove <remote-name>  # 刪除遠端儲存庫
git remote rename <old-name> <new-name>  # 重命名遠端儲存庫
git remote set-url <remote-name> <new-url>  # 重設遠端儲存庫 URL
git remote get-url <remote-name>  # 查看特定遠端儲存庫的 URL

額外資源

linux commands

basic

command
command arguments
command -options
command -options arguments
command --long_form_options
cd <path>
ls
ls -alh  # -a 顯示隱藏黨 -l 使用長格式 -h 檔案大小使用人類可讀
ls -l --sort=time  # 以時間做排序
ls -l --sort=size  # 以大小做排序
ls -lc  # 顯示修改時間
ls -lu  # 顯示訪問時間
pwd
touch <file>  # 創建檔案/更新檔案時間
file <file>  # 可以查看檔案的實際類型
mkdir <directory>
mkdir -p <directory>  # 多層式創建資料夾
rm <file>  # 移除檔案
rm -d  <dir>  # 刪除空資料夾(或者用rmdir <dir>)
rm -r  <dir>  # 遞迴刪除
rm -i  # 互動式
rm -rf  # 遞迴強制刪除

mv <source> <destination>  # 移動或重命名檔案或資料夾,移動可一次移動多個

cp mv <source> <destination>  #複製文件
cp -r mv <source> <destination>  # 複製整個資料夾
clear  # 清除畫面輸出 (也可以使用 ctrl + L)

histroy  # 列出歷史紀錄命令
!<number>  # 使用 history 的某個指令

快捷(Shortcuts)

ctrl + L  # 相當於執行了 clear
ctrl + A  # 游標移動到最前面
ctrl + E  # 游標移動到最後面
ctrl + T  # 交換前後'字母或單字'的位置 (依游標位置決定)
ctrl + U  # 刪除前面所有字
ctrl + K  # 刪除後面所有字
ctrl + W  # 向前刪除一個單字
alt  + D  # 向後刪除一個單字
ctrl + Y  # 任何上面刪除的字都會被暫時存放到另一個剪貼簿,都可由此指令貼上

查看指令類型(type)

type <arguments>
type clear  # An executable program (is heahed)
type mkdir
type cd  # A built-in shell command
type cow  # An alias

手冊(man)

man arguments  # 查詢某指令的手冊
man -k <arguments>  # 查詢特定關鍵字
man <number> <arguments>  # 查詢特定指令的第一章節

幫助(help)

help arguments  # 如果一個指令是 built-in,則必須使用 help 查看  (例如 cd pwd export)

查詢指令位置(which)

which <arguments>
which clear

顯示日期(data/cal/ncal)

date

cal

ncal
ncal 2024
ncal july 2024
ncal -A 1 -B 2
ncal -A1 -B2

迴響(echo)

echo <arguments>  # 列印

env  # 顯示環境變數 (需要加 $)
prinenv  # 顯示環境變數 (不用加 $)

whoami  # 顯示當前用戶名

環境變數

export PORT=8080 # 新增環境變數(範例: PORT=8080)

排序(sort)

sort <file>
sort -r -u <file>
sort -ru <file>
sort --reverse --unique <file>
sort -n <file>  # 可以對數字大小做排序
sort -n -k <number> <file>  # 針對特定欄位排序

以 GUI 方式開啟目錄(xdg-open)

xdg-open ~

編輯檔案(nano)

nano <file>  # 如果檔案不存在會創建

檢視檔案

cat <file>  # 檢視檔案  # -n 顯示行號
tac <file>  # 反轉 cat
less <file>  # 分頁檢視檔案 F 下一頁, B 上一頁, / 搜尋
head -n 10 <file>  # 顯示頭10行資料 (n預設就是10,也可以直接 -5n 或 -5 顯示前5行)
tail -f <file>  # 除了與 head 類似功能之外,還可即時顯示最新輸出
ls <path> -lh | sort -k5h  # 依照檔案大小排序  # 加上 -r 可以反轉

重導向(redirecting)

command > <filename>  # 新增/覆寫檔案
command >> <filename>  # 覆加到檔案

command < <filename>  # 讀取檔案並傳入到 command

command 2> <filename>  # standard error
command 2>> <filename>  # 附加standard error

command > <filename> 2> <filename2>  # 將 standard output 和 standard error 寫入到不同檔案
command > <filename> 2>&1  # 同時將 standard output 和 standard error 寫入到同一個檔案
command &> <filename>  # 同上

command | less  # 將 command 的輸出傳入到 less 做為輸入

尋找(find)

locate <string>  # 快速搜尋檔案
find <path> -type f  # 搜尋檔案
find <path> -type d  # 搜尋資料夾
find <path> -name <filename>  # 搜尋檔案
find <path> -iname <filename>  # 不區分大小寫
find <path> -size +10M  # 搜尋大於10M的檔案
find <path> -empty -type d  # 搜尋空資料夾

不常用

wc  # 計算行數、字數、字元數
tr  # replace or remove specific characters
rev  # 反轉字元
tee  # 重導向到檔案並且輸出到標準輸出

Wildcards

*(asterisk): 0 or more characters
?(question): 1 character
[ ](Range): range of characters
[^](Negating Range): not in the range

在 Windows 上安裝 Ubuntu 並完成好相關設定

  1. 安裝 WSL2 和 Ubuntu

  2. 安裝 Docker Desktop

  3. 安裝 微軟開發人員首頁(預覽)

  4. 安裝 stow (教學)

  5. 安裝 MesloLGS NF 字型

  6. 安裝 zsh

  7. 安裝 oh-my-zsh

  8. 安裝 powerlevel10k

  9. 安裝 zsh-autosuggestions

  10. 安裝 zsh-syntax-highlighting

  11. 安裝 fast-syntax-highlighting

  12. 升級 git

  13. 安裝 GitKraken Desktop on WSL2

  14. python 安裝和升級

  15. 安裝 pyenv -OpenSSL lib

  16. 安裝 pipx

  17. 安裝 pre-commit

  18. 用 pip 安裝 commitizen

  19. 用 pip 安裝 cz-conventional-gitmoji

  20. 安裝 ruff

  21. 安裝 poetry

  22. 安裝 uv

  23. 安裝 Rust

  24. Taplo

實用的 Ubuntu 套件