###### tags: `Plus` `Git` `GitHub` # Git指令筆記 ## Git設定指令: >| 命令 | 說明 | | >| --- | --- | --- | >| git config user.name &#0034;Git1&#0034;| 設定個別識別資料簽名為 `` Git1 `` | | >| git config user.email &#0034;git@g.com&#0034;| 設定個別識別資料E-Mail為 `` git@g.com `` | | >| git config --global user.name &#0034;Git1&#0034;| 設定預設識別資料簽名為 `` Git1 `` | | >| git config --global user.email &#0034;git@g.com&#0034;| 設定預設識別資料E-Mail為 `` git@g.com `` | | > ## Git工作目錄: >| 命令 | 說明 | | >| --- | --- | --- | >| git init | 初始化當前工作目錄(為該目錄設置Git) | | >| git add . | 將工作目內所有檔案置入暫存區(stage) | | >| git add &#0034;filename&#0034; | 將 `` filename `` 置入暫存區(stage) | | >| git rm --cached &#0034;filename&#0034; | 將 `` filename `` 從暫存區(stage)中移除 | | >| git commit -a | 已變更的檔案提交至本地庫(local repoistry) | | >| git commit -m &#0034;測試編輯評論&#0034; &#0034;filename&#0034; | 將 `` filename `` 提交至本地庫(local repoistry),並註記 `測試編輯評論` | | >| git status | 檢查本地庫(local repoistry)與暫存區(stage)的狀態| ## Git查詢指令: >| 命令 | 說明 | | >| --- | --- | --- | >| git log | 顯示Git版本紀錄 | `q`| >| git log --pretty=oneline | 顯示Git版本紀錄(簡化顯示:無上傳者、時間) | | >| git log --oneline | 顯示Git版本紀錄(簡化顯示:sh1) | | >| git reflog | 顯示Git版控操作紀錄 | | >| git diff | 比較目前檔案與最新版的差異 | | >| git diff HEAD^ &#0034;filename&#0034; | 比較檔案 `filename` 與上一版的差異 | | ## Git版控指令: >| 命令 | 說明 | | >| --- | --- | --- | >| git reset --hard &#0034;sh1&#0034; | Git還原至 `sh1` 版本 | | >| git reset --hard HEAD^ | Git還原至前一版本 | | >| git reset --hard HEAD^^^ | Git還原至前三版本 | | >| git reset --hard HEAD~3 | Git還原至前三版本 | | >| git checkout . | Git還原至沒有commit前的版本 | | >| git checkout &#0034;sh1&#0034; &#0034;filename&#0034; | 將檔案 `filename` 還原至指定版本 | | ## Git分支指令: >| 命令 | 說明 | | >| --- | --- | --- | >| git branch -v | 查詢本地庫的分支 | >| git branch -a | 查詢本地庫與遠端庫的分支 | >| git branch &#0034;vername&#0034; | 創建新分支並命名為 `vername` | >| git branch -d &#0034;vername&#0034; | 刪除分支名稱 `vername` | >| git branch -D &#0034;vername&#0034; | 創建新分支並命名為 `vername` | >| git branch -m &#0034;vername&#0034; &#0034;newname&#0034; | 將分支 `vername` 更名為 `newname` | >| git checkout &#0034;vername&#0034; | 切換分支名稱 `vername` | >| git checkout -b &#0034;vername&#0034; | 新增並切換分支名稱 `vername` | >| git merge &#0034;vername&#0034; | 將目前版本與分支 `vername` 合併 | >| git rebase &#0034;vername&#0034; | 以 `vername` 為基底衍合當前分支 | >| git checkout --ours &#0034;filename&#0034; | 切換檔案 `filename` 使用切換前版本分支 | >| git checkout --theirs &#0034;filename&#0034; | 切換檔案 `filename` 使用切換後版本分支 | ## Git遠端指令: > | 命令˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰| 說明 || > | --- | --- | --- | > | git clone &#0034;URL&#0034;| 將該遠端儲存庫 `URL` 下載到當前工作目錄 | | > | git remote| 顯示所有遠端儲存庫版本 | | > | git remote -v| 顯示所有遠端儲存庫版本與URL | | > | git remote add &#0034;remote_name&#0034; &#0034;URL&#0034; | 將該遠端儲存庫 `URL` 命名為 `remote_name` | | > | git remote rename &#0034;remote_name&#0034; &#0034;newname&#0034; | 將該遠端儲存庫名稱 `remote_name` 更名為 `newname` | | > | git remote rm &#0034;remote_name&#0034; | 移除遠端儲存庫名稱 `remote_name` 與該URL | > | git push | 將現在分支上傳至遠端儲存庫 | | > | git push -f | 將現在分支強制上傳並覆蓋至遠端儲存庫(慎用) | | > | git push &#0034;remote_name&#0034; &#0034;vername&#0034; | 將分支名稱 `vername` 上傳至遠端儲存庫 `remote_name` | | > | git pull &#0034;remote_name&#0034; &#0034;vername&#0034; | 將遠端儲存庫 `remote_name` 合併至分支名稱 `vername` | | > | git fetch | 擷取所有遠端儲存庫 | > | git fetch <branch_name> | 擷取遠端儲存庫的 `varname` 分支 | ## Git標籤指令: > | 命令˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰| 說明 || > | --- | --- | --- | > | git tag &#0034;輕量標籤&#0034;| 為目前的版本添加 `輕量標籤` 作為標籤 | | > | git tag -am &#0034;標籤名稱&#0034; &#0034;註解xxx&#0034;| 為目前的版本添加 `標籤名稱` 並以 `註解xxx` 作為註解 | | > | git tag -d &#0034;輕量標籤&#0034;| 為目前的版本刪除名稱為 `輕量標籤` 的標籤 | | --- ## Git 常用指令: ```bash git log --oneline --graph # log 精簡化紀錄 git log -S "ss" # log 搜尋commit的檔案內容中包含"ss"的紀錄 git log -p "filename" # log 搜尋filename檔案commit紀錄 git blame "filename" # log 搜尋filename檔案commit紀錄(單行) git log --author="aa" # log 搜尋作者為"aa"的commit紀錄 git log --grep="cc" # log 搜尋commit文字中包含"cc"的紀錄 git log --after="2001-02-03 04:56" --before="2099-09-09 23:23" # log 搜尋此時區間的commit紀錄(參數至少包含年月日) git commit --amend -m "xxxx" #重新修改本次commit備註 ``` ## 將某檔案從Git紀錄中完全移除: ```bash git filter-branch -f --tree-filter "rm -f XXXX/XXXX.ext" # filter-branch 指令把檔案XXXX/XXXX.ext從工作目錄裡移掉 rm .git/refs/original/refs/heads/master # 刪除Git管理目錄中的 filter-branch 備份點 git reflog expire --all --expire=now # Reflog 立刻過期(不然預設要等 30 天) git gc --prune=now # 啟動 Git 的資源回收機制,請垃圾車來立刻把它們載走 git fsck # 檢查 ``` ## 隱藏部份檔案,不上傳至遠端庫Repository: git所管理資料夾內創建 ==.gitignore== 隱藏檔案,在編輯內容: ```bash # 檔案名稱 .gitignore # 忽略 secret.yml 檔案 secret.yml # 忽略 config 目錄下的 database.yml 檔案 config/database.yml # 忽略所有 db 目錄下附檔名是 .sqlite3 的檔案 /db/*.sqlite3 # 忽略所有附檔名是 .tmp 的檔案 *.tmp # 當然你要忽略自己也可以,只是通常不會這麼做 # .gitignore ``` ## 上傳至遠端儲存庫失敗(error: failed to push some refs to): 上傳至遠端儲存庫失敗訊息: `error: failed to push some refs to` 最常見的原因為遠端庫資料與本地庫資料有所差異,必須先將遠端庫更新到本地庫中(pull),`git pull` 指令會更新本地庫資料至最新,過程會自動判斷是否有衝突(conflict),若有須另外藉由 `git merge` 解決問題,若本地庫更新完成後,即可再次 `git push`。 以下是未有衝突發生的成功案例: > ```sass > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git commit -a -m "測試衝突" > [master f8c17be] 測試衝突 > 1 file changed, 2 insertions(+), 1 deletion(-) > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git push "初始版" "master" > To https://github.com/DukeHuang/GitStudy.git > ! [rejected] master -> master (fetch first) > error: failed to push some refs to 'https://github.com/DukeHuang/GitStudy.git' > hint: Updates were rejected because the remote contains work that you do > hint: not have locally. This is usually caused by another repository pushing > hint: to the same ref. You may want to first integrate the remote changes > hint: (e.g., 'git pull ...') before pushing again. > hint: See the 'Note about fast-forwards' in 'git push --help' for details. > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git pull "初始版" "master" > remote: Enumerating objects: 5, done. > remote: Counting objects: 100% (5/5), done. > remote: Compressing objects: 100% (2/2), done. > remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 > Unpacking objects: 100% (3/3), done. > From https://github.com/DukeHuang/GitStudy > * branch master -> FETCH_HEAD > ccdd6b7..87f9ee8 master -> 初始版/master > Merge made by the 'recursive' strategy. > A.txt | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > nothing to commit, working tree clean > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git push "初始版" "master" > Enumerating objects: 9, done. > Counting objects: 100% (8/8), done. > Delta compression using up to 4 threads > Compressing objects: 100% (4/4), done. > Writing objects: 100% (5/5), 664 bytes | 664.00 KiB/s, done. > Total 5 (delta 0), reused 0 (delta 0) > To https://github.com/DukeHuang/GitStudy.git > 87f9ee8..ea840d5 master -> master > > ``` 以下是衝突發生並利用 `git checkout --ours` 解決案例: > ```sass > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git commit -a -m "合併衝突" > [master da68b1b] 合併衝突 > 2 files changed, 3 insertions(+), 3 deletions(-) > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git push "初始版" "master" > To https://github.com/DukeHuang/GitStudy.git > ! [rejected] master -> master (fetch first) > error: failed to push some refs to 'https://github.com/DukeHuang/GitStudy.git' > hint: Updates were rejected because the remote contains work that you do > hint: not have locally. This is usually caused by another repository pushing > hint: to the same ref. You may want to first integrate the remote changes > hint: (e.g., 'git pull ...') before pushing again. > hint: See the 'Note about fast-forwards' in 'git push --help' for details. > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git pull "初始版" "master" > remote: Enumerating objects: 5, done. > remote: Counting objects: 100% (5/5), done. > remote: Compressing objects: 100% (2/2), done. > remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 > Unpacking objects: 100% (3/3), done. > From https://github.com/DukeHuang/GitStudy > * branch master -> FETCH_HEAD > ea840d5..27c107b master -> 初始版/master > Auto-merging A.txt > CONFLICT (content): Merge conflict in A.txt > Automatic merge failed; fix conflicts and then commit the result. > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git checkout --ours "A.txt" > Updated 1 path from the index > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git commit -a -m "解決衝突" > [master a5b653b] 解決衝突 > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git push "初始版" "master" > Enumerating objects: 11, done. > Counting objects: 100% (10/10), done. > Delta compression using up to 4 threads > Compressing objects: 100% (3/3), done. > Writing objects: 100% (5/5), 489 bytes | 489.00 KiB/s, done. > Total 5 (delta 1), reused 0 (delta 0) > remote: Resolving deltas: 100% (1/1), done. > To https://github.com/DukeHuang/GitStudy.git > 27c107b..a5b653b master -> master > ``` ## 解決合併衝突(merge & conflict): 將遠端庫更新到本地庫中(pull),`git pull` 指令會更新本地庫資料,合併時易容易發生衝突(conflict),若使用手動處理衝突可利用編輯器的比較工具分析,修改完成後再使用 `git add` 指令將檔案新增至暫存庫,再 `git commit` 成為一個新版本。 以下是手動處理合併衝突(conflict)的過程: > ```sass > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git pull "初始版" "master" > remote: Enumerating objects: 9, done. > remote: Counting objects: 100% (9/9), done. > remote: Compressing objects: 100% (4/4), done. > remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0 > Unpacking objects: 100% (6/6), done. > From https://github.com/DukeHuang/GitStudy > * branch master -> FETCH_HEAD > b837896..7a868fc master -> 初始版/master > Auto-merging B.txt > CONFLICT (content): Merge conflict in B.txt > Auto-merging A.txt > CONFLICT (content): Merge conflict in A.txt > Automatic merge failed; fix conflicts and then commit the result. > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git status > On branch master > Your branch is ahead of 'origin/master' by 11 commits. > (use "git push" to publish your local commits) > > You have unmerged paths. > (fix conflicts and run "git commit") > (use "git merge --abort" to abort the merge) > > Unmerged paths: > (use "git add <file>..." to mark resolution) > > both modified: A.txt > both modified: B.txt > > no changes added to commit (use "git add" and/or "git commit -a") > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git add . > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git commit -a -m "解決合併衝突" > [master 08d01de] 解決合併衝突 > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git push "初始版" "master" > Enumerating objects: 13, done. > Counting objects: 100% (13/13), done. > Delta compression using up to 4 threads > Compressing objects: 100% (4/4), done. > Writing objects: 100% (7/7), 721 bytes | 721.00 KiB/s, done. > Total 7 (delta 0), reused 0 (delta 0) > To https://github.com/DukeHuang/GitStudy.git > 7a868fc..08d01de master -> master > > ``` 若想還原pull所造成的衝突,可利用 `git reset --hard HEAD@{0}` 指令還原操作: > ```sass > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git pull "初始版" "master" > remote: Enumerating objects: 9, done. > remote: Counting objects: 100% (9/9), done. > remote: Compressing objects: 100% (4/4), done. > remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0 > Unpacking objects: 100% (6/6), done. > From https://github.com/DukeHuang/GitStudy > * branch master -> FETCH_HEAD > b837896..7a868fc master -> 初始版/master > Auto-merging B.txt > CONFLICT (content): Merge conflict in B.txt > Auto-merging A.txt > CONFLICT (content): Merge conflict in A.txt > Automatic merge failed; fix conflicts and then commit the result. > > d:\Personal File\Desktop\GOLang\GitStudy (master -> origin) > λ git status > On branch master > Your branch is ahead of 'origin/master' by 11 commits. > (use "git push" to publish your local commits) > > You have unmerged paths. > (fix conflicts and run "git commit") > (use "git merge --abort" to abort the merge) > > Unmerged paths: > (use "git add <file>..." to mark resolution) > > both modified: A.txt > both modified: B.txt > > no changes added to commit (use "git add" and/or "git commit -a") > > d:\Personal File\Desktop\GOLang\GitStudy (XTest -> origin) > λ git reflog > d70266d (HEAD -> XTest) HEAD@{0}: commit: Xtest Ver > b837896 HEAD@{1}: checkout: moving from master to XTest > 08d01de (初始版/master, master) HEAD@{2}: commit (merge): 解決合併衝突 > d7dfe6c HEAD@{3}: commit: X修改版 > b837896 HEAD@{4}: commit: 合併版本 > a5b653b HEAD@{5}: commit (merge): 解決衝突 > da68b1b HEAD@{6}: commit: 合併衝突2 > ea840d5 HEAD@{7}: pull 初始版 master: Merge made by the 'recursive' strategy. > f8c17be HEAD@{8}: commit: 測試衝突 > ccdd6b7 HEAD@{9}: commit: 修改初始注解 > 948d58b HEAD@{10}: commit: 修改初始注解 > e183b37 HEAD@{11}: commit: 初始版 > 0c14f3d (origin/master, origin/HEAD) HEAD@{12}: clone: from https://github.com/DukeHuang/GitStudy.git > > d:\Personal File\Desktop\GOLang\GitStudy (XTest -> origin) > λ git reset --hard HEAD@{0} > HEAD is now at d70266d Xtest Ver > ``` ## Gitlab 搬遷: Gitlab方式先將舊專案 git 鏡像clone,在另外push。 > ```sass > git clone --mirror https://git.xxx1/old-poject.git > git remote rename origin old-poject > git remote add origin https://oauth2:PersonalAccessToken@xxx2/new-poject.git/ > git push -u origin --all > git push -u origin --tags > ```