軟體:Git
說明文件
練習網站:Learn Git Branching
簡介:指令應用方法
Git rebase 將 HEAD 之後所有 commit(含 HEAD) 接到其他 commit 上(接支),若有重覆會忽略之
Git Config (default --local)
說明文件
練習網站:Learn Git Branching
簡介:指令應用方法
Git status 看目前的狀態
- git status
# 目前的狀態 - git status -s
#--short 目前的狀態精簡版
Git 初始化
- git init
# 初始化 - git init --bare
# Git Server 用 - git clone <A>
# 從 A 複製
Git 新增檔案
- git add .
# 全部加入(不含刪除檔案) - git add -u
# --update 只加入修改過的檔案,新增的檔案不加入 - git add -A
# 全部加入 = git add . + git add -u - git add <fileA>
# 加入 fileA
Git 刪除檔案
- git rm <fileA>
# 移除 fileA
Git 修改檔名、搬移目錄
- git mv <fileA> <fileB>
# 將 A 改為 B
Git Commit
- git commit
# 提交 - git commit -m 'commit message'
# 快速提交 - git commit -a
# 所有修改的檔案都 commit,但是 untracked file 還是得要先 add - git commit -v
# 加入比對結果 - git commit --amend
# 修改前一次提交
Git 檔案
- git ls-files
# 目前控管的檔案 - git ls-files -u
# --unmerged 列出未 merge 的檔案 - git ls-files -d
# 查看已刪除的檔案 - git ls-files -d | xargs git checkout --
# 將已刪除的檔案還原
Git 產生新的 branch
- git branch
# 列出目前有多少 branch - git branch -r
# 列出所有 Repository branch - git branch -a
# 列出所有 branch
- git branch <new-branch>
# 產生新的 branch (名稱: new-branch) - git branch <new-branch> 'Any commit'
# 由 Any commit 產生新的 branch(new-branch) - git checkout -b <new-branch>
# 產生新的 branch, 並同時切換過去 new-branch
- git branch -d <new-branch>
# 刪除 new-branch,需執行過 merge 的分支 - git branch -D <new-branch>
# 強制刪除 new-branch
- git branch -f <branch-name> <A>
# 強制移動 branch 指向 A
Git checkout 切換 branch
- git checkout <branch-name>
# 切換到 branch-name - git checkout -b <branch-name> --track <remote>/<branch-name>
# 等同於 git checkout <branch-name>,若 remote 存在,會自動建立本地分支
Git diff (未指定的話,以工作目錄為主)
- git diff
# 比較 目前位置 與 staging area - git diff <A>
# 與 A 有哪些資料不同 - git diff --cached
# --staged 比較 staging area 跟本來的 Repository - git diff <A> <B>
# 比較 A 跟 B 差異,從 A -> B - git diff <A>:file1 <B>:file2
# A 的 file1 跟 B 的 file2 的 diff - git diff --stat
# 統計 diff - git diff -M
# 檢測有無更名
Git Tag
- git tag
# 列出所有 tag - git tag <tagA> <A>
# 將 A 標記為 tagA - git tag -d <tagA>
# 將 tagA 刪掉
Git log (用工具觀看較為方便,例:gitk)
- git log
# 列出版本紀錄 - git log -10
# 列出前十筆 - git log --decorate
# 列出所有 log 含別名(tag) - git log --all
# 列出所有的 log (含合併) - git log -p
# 列出修改過的檔案內容 - git log <A>
# A 的所有 log - git log -p <A>
# 將 A 的內容差異列出 - git log --name-only
# 列出此次 log 有哪些檔案被修改 - git log --stat --summary
# 查每個版本間的更動檔案和行數 - git log -S'foo()'
# log 裡面有 foo() 這字串的 - git log --graph
# 圖形化表示 - git log --oneline
# 一行顯示
Git Ref log
- git reflog
# 列出版本歷史紀錄
# 修改任何參照( ref )的內容,或變更任何分支的 HEAD 參照內容,就會建立歷史紀錄 - git log -g
# reflog 的完整 commit 內容 - git reflog delete HEAD@{id}
# 刪除特定歷史紀錄,不影響任何儲存庫(repository)的任何內容 - git reflog expire --expire=now --all
# 清除所有歷史紀錄
Git show
- git show <A>
# 查 A 的內容
Git reset 重置
- git reset --hard <commit>
# 還原到特定 commit,不保留檔案 - git reset --soft <commit>
# 還原到特定 commit,保留檔案 - git reset HEAD <A>
# A 從 staging area 狀態回到 untracked (檔案內容並不會改變)
Git revert 反向還原變更
- git revert <commit>
# 反向做 <commit>,並提交 - git revert <commit> -n
# --no-commit 反向做 commit,但不提交,後續提交使用 git revert --continue - git revert --continue
# 完成操作,並提交 - git revert --abort
# 放棄反向,回到原始狀態
Git cherry-pick 挑選多個 commit,接在 HEAD 之後進行變更
- git cherry-pick <commit>
# 重覆做 <commit>的動作並提交,版本訊息與原本的一致 - git cherry-pick <commit> -x
# 同上,但自動加上 (cherry picked from commit) - git cherry-pick <commit> -e
# --edit 編輯訊息 - git cherry-pick <commit> -n
# --no-commit,不提交,後續提交使用 git commit
Git rebase 將 HEAD 之後所有 commit(含 HEAD) 接到其他 commit 上(接支),若有重覆會忽略之
可能會導致無法上傳遠端
o---a---o---o---o---o---o---o---o A
\
o---o---o---o---o B
\
o---o---o *C
- git rebase <branchA>
# 基礎版本設為 branchA,並執行本分支上的所有變更 (開頭接到 branchA)
# 目前在 C,執行 git rebase A,會從 a 到 C 接到 A 的最後面o---a---o---o---o---o---o---o---o A \ \ o---o---o---o---o B o'---o'---o'---o'---o' \ o'---o'---o' *C
- git rebase [--onto <newbase>] [<upstream> [<branch>]]
# 找出 upstream 與 branch 的共同袓先,branch 由此之後的變化到終點這段,接在 newbase(新分支點) 上
# git rebase --onto A B Co---o---o---o---o---o---o---o---o A | \ | o'--o'--o' *C \ o---o---o---o---o B
- git rebase <commitA> -i
# 互動式編輯從目前 commit 到 commitA(不含) 的所有 commit- 調換順序 => 直接調換即可
- 修正 commit 訊息 => reword or r
- 編輯,拆解,新增 commit => edit or e
- 與上一個 commit 合併,並合併訊息進行編輯 => squash
- 與上一個 commit 合併,但只保留上一個 commit 的訊息 => fixup
- 刪除 commit => 直接移除
Git stash 暫存
- git stash
# 同 git stash save 丟進暫存區(不含 untracked) - git stash save
# 丟進暫存區,並加入註解 - git stash -u
# --include-untracked 丟進暫存區(包括 untracked) - git stash list
# 列出所有暫存區的資料 - git stash pop
# 取出最新的一筆, 並移除. - git stash apply
# 取出最新的一筆 stash 暫存資料. 但是 stash 資料不移除 - git stash apply "stash@{id}"
# 取出特定暫存版 - git stash clear
# 把 stash 都清掉 - git stash drop "stash@{id}"
# 刪除特定暫存版
Git merge 合併
- git merge <A> <B> <C> ...
# 將 A, B, C ... 合併進來
Git blame
- git blame <fileA>
# 關於 fileA的所有 commit 紀錄
Git Config (default --local)
(套用順序 system -> global -> local),前者會被後者覆蓋
- git config --list
# 列出目前設定 - git config --list --system
# 列出目前 System-level 設定,儲存在 C:\Program Files (x86)\Git\etc\gitconfig - git config --list --global
# 列出目前 User-level設定,儲存在 C:\Users\<使用者帳號>\.gitconfig - git config --list --local
# 列出目前 Repository-level 設定,儲存在 .git\config - git config [config_section.config_name]
# 取得特定選項值 - git config [config_section.config_name] [config_value]
# 設定特定選項值 - git config --global core.editor "\"C:\Program Files (x86)\Notepad++\notepad++.exe\""
# 指定預設文字編輯器 - git config --edit --system | --global | --local
#直接編輯設定檔 - git config --global help.autocorrect 1
# 自動訂正打錯的參數 - git config --local commit.template "G:\git-commit-template.txt"
# 自訂 commit 訊息範本 - git config --global alias.<別名> <指令>
# 加入別名執行指令 - git config --global gc.reflogExpire "never"|"7 days"
# 設定歷史紀錄的過期時間 - git config --global gc.reflogExpireUnreachable "never"|"7 days"
# 設定歷史紀錄的過期時間 - git config --local gc.master.reflogExpire "14 days"
# 設定特定分支歷史紀錄的過期時間 - git config --local gc.master.reflogExpireUnreachable "14 days"
# 設定特定分支歷史紀錄的過期時間
Git 維護
- git gc
# 指垃圾收集 (garbage collect)
# 此命令會做很多工作:
# 收集所有鬆散對象並存入 packfile
# 合併 packfile 進一個大的 packfile
# 將不被任何 commit 引用並已存在一段時間 (數月) 的對象刪除
# 整理前和整理後的差異, 可由: git count-objects 看到
Git remote 維護遠端檔案
- git remote
#列出所有 remote - git remote add <A> <Web>
# 加入遠端 Repository 命名為 A - git remote rm <A>
# 移除 A - git remote update
# 更新所有 Repository branch - git remote set-url <A> <Web>
# 更改 A 的遠端位址 - git ls-remote
# 列出遠端所有分支
抓取遠端 Repository
- git fetch
# 預設為 origin - git fetch <A>
# 抓取 A,但不影響 local - git fetch --tags
# 抓取 tags - git fetch --all
# 抓取所有 remotes
下載遠端 Repository
- git pull
# 預設為 origin - git pull <A>
# 抓取 A,直接更新 local
提交遠端 Repository
- git push
# 預設為 origin - git push <A>
# 提交 A - git push <A> --force
# 強制提交 A,可用在上傳錯誤,強制更正 GitHub - git push <A> <branchB>
# 指定分支 branchB 提交 A - git push --tags
# 提交 tags - git push --all
# 提交所有 branches
留言
張貼留言