2022年11月17日 星期四

Git 參考資料 - 好用指令

Git 好用指令

----------------------- 與 Log 相關 --------------------
# 用指定的 format 印出 從 <commit id> (包含) 到 <commit id2> 的所有 commit
# <commit id>...<commit id2> 可代表 <commit id> 後一個 commit 到 <commit id2> 的所有 commit (不包括  <commit id>),所以
<commit id>^...<commit id2> 代表 <commit id> 的 parent 的後一個 commit ,也就是 <commit id> 自己,到 <commit id2> 的所有 commit
git log --pretty=format:"%H %s" <commit id>^...<commit id2>
----------------------- 與 Remote Repository 相關 --------------------
# 在空的資料夾將 <git repository> 的 git project 抓下來
git clone <git repository>

-----------------------------------------------------------------------------------------------------
# 上傳分支,-u 表示並且追蹤遠端的分支,之後就不用再加 -u
git push <remote name> <branch name> 
git push -u <remote name> <branch name> 

# 只把 remote 的版控抓下來,但沒有要 merge 到 local branch 上, --all 表示抓取所有的 remote
git fetch
git fetch --all 

# 等同 git fetch 和 git merge 的結合,把 remote 的版控抓下來,並 merge 到 local branch 上
git pull
如果想再產生一個 merge commit,建議可加 --rebase 參數,行為會變成
等同 git fetch 和 git rebase 的結合
git pull --rebase

----------------------- 與 Local Repository 相關 --------------------
# 移動 HEAD 到 <commit id> 的 patch
git checkout <commit id>

# 將 <file path> 檔案還原成 <commit id> patch 的內容 (不小心被自己刪掉的檔案也可以),
# <file path> 可以是資料夾路徑或檔案路徑,路徑是從 cmd 指令所在位置開始算
git checkout <commit id> -- <file path>
Ex.: git checkout <commit id> -- *

# 刪除工作區中所有沒有被 tracked 的檔案,參考
git clean
# -n 參數:只顯示執行 git clean 後會被刪除的檔案,不會真得刪除檔案,只是做一次演習,告訴你真得執行 git clean 後會被刪除的檔案
git clean -n
# 刪除指定 <path> 路徑下的沒有被 track 過的檔案
git clean -f <path>
# 刪除當前目錄下沒有被 track 過的檔案和資料夾
git clean -df
# 刪除當前目錄下所有沒有track過的檔案. 不管他是否是.gitignore檔案裡面指定的資料夾和檔案
git clean -xf

# 捨棄 <commit id> 之後的 patch (即等於放棄之前的 commit),並且將 HEAD 移至 <commit id> patch
git reset <commit id>
(工作區檔案內容不被影響)
git reset --hard <commit id>
(工作區檔案內容會被影響而被更新)

# 直接 reset 成指定的 patch,注意: 會捨棄 <commit id> 之後的 commit,
# 不要在 <commit id> 之後的 commit 已 push 至 remote 的情況下使用!!避免影響到同仁,除非此 branch 只有你在用
git reset --hard <commit id> 

# 把 <commit id> 的 patch 複製一份 (原來的 patch 還是會留著) 到目前位置的後面 (一樣會產生新的 commit id),
加 --edit 參數可以用指定的編輯器輸入 message,
加 -x 參數可以自動地加入 (cherry-pick from <xxxCommitId>) 的 message
git cherry-pick <commit id> 
# cherry pick commitB 之前但不包括 commitA 的所有 commit
git cherry-pick <commitA id>...<commitB id>
# cherry pick commitB 之前但不包括 commitA的parent 的所有 commit,
等同於 cherry pick commitA 到 commitB的所有 commit
git cherry-pick <commitA id>^...<commitB id>

#將現在的 patch 接到 <branch> 的後面
git rebase <branch>

#互動式 git rebase
git rebase -i <after this commit>
更改 <after this commit> 之後(不包含 <after this commit>)的 patch,
會使用互動介面(可能是文字編輯器或 console,看你設定),
可改變 patch 順序、合併 patch (squash)、刪除 patch、修改 patch 註解、修改 patch 檔案內容等

git rm <file> --cached
移除 <file> 檔案將之不再被 git 控管 (在本機上不會被刪除),相當於在 repository 中移除檔案,
可以用 .gitignore 檔配合 cmd 指令來從 patch 中清除不想被 git 控管的檔案
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
可用以下指令查看會清除哪些檔案
Linux/MacOS:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

Windows (PowerShell):
git ls-files -ci --exclude-standard | % { git rm --cached "$_" }

# stash 暫存操作,將在工作區的檔案暫存
git stash
git stash pop
----------------------- 與 Git 設定 相關 --------------------
git config --global core.editor "'D:\notePad++\notepad++.exe' -multiInst -nosession"
指定 notePad 為 git 互動模式時用的編輯器

----------------------- 關於 commit, merge 等 message 中同時要輸入雙引號或單引號的方法  -----------
如果 git commit 或 merge 的 message 同時想要輸入雙引號或單引號的話,
可以用單引號圍住 message,然後
用三個雙引號表示一個雙引號,例如: """
用兩個單引號表示一個單引號,例如: ''
範例:
如果 message 是
this is double quote: " and this is single quote: '
可以如下輸入:
git merge xxxBranch -m 'this is double quote: """ and this is single quote: '''

----------------------- 關於 commit, merge 等 message 中要輸入換行的方法  -----------
如果 message 是(aaa 換行再 bbb):
aaa
bbb
可以如下輸入:
git commit -m 'aaa
bbb'
git commit -m "aaa
bbb"

----------------------- git-svn 的指令 (git 跟 svn 共同合做)  -----------
# 從 svn 上把 commit 抓下來,跟 git pull --rebase 功能一樣,只是是從 svn 上抓
git svn rebase
# 將 commit push 至 svn,跟 git push 功能一樣,只是是 push 至 svn
git svn dcommit

參考資料:

  1. SVN Migrate to Git

沒有留言 :

張貼留言