git
git 是什麼? (from ChatGPT)
Git 是一種分散式版本控制系統(Distributed Version Control System,DVCS)。它是一個用於追蹤代碼更改的工具,使多人協作在同一項目上變得更加順暢。以下是一些 Git 的主要特點:
- 版本控制: Git 可以記錄項目的每一個版本。這意味著你可以輕鬆地回溯到以前的版本,查看變更歷史,或在需要時還原到先前的狀態。
- 分散式: Git 是一個分散式版本控制系統,每個使用者都有一個完整的存儲庫(包含完整歷史記錄)。這使得協作變得更加靈活,不依賴於中央服務器。
- 分支管理: Git 鼓勵使用分支(Branches)來開發新功能或進行修復,而不會影響主要的代碼庫。這使得同時進行多個功能的開發變得更加容易。
- 高效性能: Git 在處理大型項目時表現出色,因為它使用了一些高效的算法。
- 開源: Git 是一個開源項目,任何人都可以查看其源代碼、提出改進建議,並在符合許可條款的情況下自由使用。
- 廣泛應用: Git 已經成為許多項目和組織的標準版本控制系統,包括開源項目和企業應用。
Git 是由林納斯·托瓦茲(Linus Torvalds)創建的,最初是為了更好地管理 Linux 內核的代碼。它現在已經成為許多軟體開發項目不可或缺的工具。
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 並完成好相關設定
實用的 Ubuntu 套件
- zsh (sudo apt install zsh)
- stow (sudo apt install stow)
- pipx (sudo apt install pipx)
- tree (sudo apt install tree)
- eza (sudo apt install eza)
- batcat (sudo apt install bat)
- ripgrep (sudo apt install ripgrep)
- fzf (sudo apt install fzf)
- zoxide (https://github.com/ajeetdsouza/zoxide?tab=readme-ov-file#installation)