這裡簡單記錄一些常用的 git 指令

[設定帳號及信箱]

git config --global user.name "yourname"
git config --global user.email "yourmail@xxx.com"

檢查設定是否完成

git config --global user.name
git config --global user.email

[資料夾初始化 git]

git init

[連線現有 Repo]

git remote add origin http://urlnamexxx.xxxx/filenamexxx.git

remote 進階: Git - 在新的 repository 保留過去歷史 commit log 紀錄,及同時連結多個 remote 作法

[複製現有專案至本地]

git clone http://urlnamexxx.xxxx/filenamexxx.git

[查看或修改 GIT設定]

vim .git/config

[抓取同步線上檔案]

git pull

git pull = git fetch + git merge

目前普遍建議要透過 fetch 方式來同步檔案

git fetch
git merge

參考 https://gitbook.tw/chapters/github/pull-from-github.html

[檢查git狀態]

git status 

[檢查git歷史紀錄]

以下三種方式都可以列出歷史紀錄,可依照習慣的介面來使用

git log 

git log --pretty=oneline

git log --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit --date=relative

或者只列出基本資訊

git reflog

小寫q 退出

[檢查差異]

從 git log 可以查看過去推送的git 歷程

可以再透過 diff 來檢查指定兩個版本的差異

會以 git diff 舊版本 新版本 的方式來比對

例如,git log 可以取得紀錄及 commit id

git log
commit 597e39474e12b475f4awqerwe8d18dd874255d1 (HEAD -> master)
Author: ----
Date:   Fri Sep 21 09:48:56 2018 +0800

    docs: readme 描述

commit 1d41d27161955282048ewerwerf76843c0a29fd8 (origin/master, origin/HEAD)
Author: ----
Date:   Thu Sep 20 18:02:05 2018 +0800

    test: ajust readme

比對差異時,只要輸入id前幾碼,就可以進行比較

git diff 1d41 597d

結果

diff --git a/readme.md b/readme.md
index ecc216e..19c99c5 100755
--- a/readme.md
+++ b/readme.md
@@ -1,3 +1,5 @@
-## Project
+## 說明

-CMS-Production
+此專案為 GCP cms-production 版控
+
+程式修改推送後,請到 GCP 將最新代碼進行 PULL

也可以透過以下參數協助,快速查看 -p 可以顯示每個更新差異的內容 -2 則是顯示最新的兩筆

git log -p -2

查看準備要push 項目與線上指定 branch 差異

要查看目前準備上傳的commit 與線上版本差異,可以執行

git diff –stat –cached [remote/branch]

例如:

git diff --stat --cached origin/master

查看程式碼差異

git diff [remote repo/branch]

查看完整的資料及變更內容

git diff --numstat [remote repo/branch]

[將檔案加入版控]

//單一檔案
git add yourfile.txt

//資料夾
git add --all foldername/

//全部資料夾及檔案
git add -A

[提供版本註解]

git commit -m"your commit txt"

[上傳 master]

git push origin master

[版本回溯]

git reset 有三個參數可以使用

–mixed、–soft 及 –hard

–mixed : 預設參數,會把暫存區的檔案刪掉,但工作目錄檔案不變動 –soft : 單純移動HEAD,不會刪除暫存區檔案及工作目錄檔案 –hard : 移動HEAD,並強制刪除暫存區以及工作目錄檔案

退回指定版本

git reset --soft 版本ID

回到最新版本

git reset --soft HEAD

回到上一版

git reset --soft HEAD~1

退回前一版本也可以用這樣表示

git reset --soft HEAD^

[還原刪除檔案]

git checkout --檔案名稱.檔名

分支

這裡分支名稱用 debug1 表示

[檢查目前所在的分支]

git branch

[查看目前相關的所有分支]

git branch -r

[建立分支]

(1) 一次建立分支及切換到分支

git checkout -b debug1

(2) 分步驟建立及切換到分支 建立分支

git branch debug1

[切換分支/Master]

從 master 切換到分支

git checkout debug1

[分支切換]

前往 master

git checkout master

前往 debug1

git checkout debug1

[發布修改到分支]

git checkout debug1
//修改檔案後
git add -A
git commit -m"修改debug1"
git push origin debug1

[合併分支到主體]

先從分支切換回 master 從master下指令合併 debug1 分支內容 刪除 debug1 分支

git checkout master
git merge debug1
git branch -d debug1

[.gitignore]

.gitignore

# 忽略指定檔案
myfile.txt

# 忽略目錄(包含內部所有檔案)
foldername/
mypath/foldername/

# 忽略 txt 檔案,或目錄下所有檔名為 txt 的檔案
*.txt
mypath/*.txt

[清除.gitignore 檔案]

強制清除.gitignore設定忽略的檔案(-f 是強制刪除)

git clean -fX

[修改 .gitignore 後,如何更新到repository 且不刪除本地ignore檔案]

當我們將一些設定檔加入 .gitignore 之後,希望 remote repository 會忽略且刪除這些檔案,但本地要保留,可以這樣做

首先,先查看排除列表(exclude lists)

git ls-files -ci --exclude-standard

接著執行下方指令,讓 remote repository 執行刪除,且保留本地檔案

git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

執行完畢,可以再次檢查排除列表

git ls-files -ci --exclude-standard

[ LINUX authentication helper]

快取900秒 (15分鐘)

git config --global credential.helper cache

指定快取秒數,例如這裡設定為1小時

git config --global credential.helper 'cache --timeout 3600'

永久記憶密碼則使用下方指令:

git config --global credential.helper store

[子模塊]

將外部專案定義為子模塊

git submodule add git://github.com/xxxxx.x.x.x

查看目前所有子模塊

git submodule

一般 clone 的專案若包含子模塊,子模塊並不會在第一次就被包含在內

必須透過 init 初始化本地子模塊專案,並且用 update 將子模塊資料拉下來,並且checkout 上層 初始化子模塊

git submodule init
git submodule update

將所有子模塊切換到 master

git submodule foreach git checkout master

對所有子模塊下 pull 指令

git submodule foreach git pull

[git alias 指令別名]

git alias 可以將長串的指令,指定到一個別名

只要執行別名,就可以等同於執行該長串指令

例如,原本要取得 LOG 及套用指定樣式,需要執行這麼多指令

log --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit --date=relative

現在可以將這些指令指定到一個別名 lg

git config --global alias.lg "log --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit --date=relative"

只要執行 git lg 及等同於執行長串 log套用樣式指令

你也可以將常用的指令,例如 status 取一個 st 別名

git config --global alias.st status

[git stash 暫存]

https://adon988.logdown.com/posts/7815239-git-stash-staging-instructions

[git flow ]

https://adon988.logdown.com/posts/7810988-git-flow-prcis-writers

[git 提交樣式建議]

https://adon988.logdown.com/posts/7810954-git-submit-message-style-suggestions

[Github 設定 SSH Deploy key 流程教學]

https://adon988.logdown.com/posts/7809789-github-ssh-key

[Git 的好幫手 - Tig 讓你在cli將版控可視化]

https://adon988.logdown.com/posts/7815837-gits-good-helper-tig-introduction

[Windows 認證管理]

Git Credential Manager for Windows https://github.com/Microsoft/Git-Credential-Manager-for-Windows/releases/latest

或者可以手動方式管理憑證

在windows選單輸入 > 認證管理員 > 點擊 Windows 認證

[Git 解決出現 warning: LF will be replaced by CRLF … The file will have its original line endings in your working directory.]

https://adon988.logdown.com/posts/7642074-git-resolves-to-appear-warninglfll-be-replaced-by-crlf-the-file-would-have-its-original-line-endings-in-your-working-directory