Skip to main content

Git 版本控制

實驗室Git帳號 recovery code​

NAS->Public->事務->共用->GitRecoveryKey

基本知識​

Git 是一個專門設計給程式碼使用的版本控制工具。

使用 Git 可以幫助你在編寫程式時更方便地控制程式碼的修改及變化,即使不小心改錯東西了,也可以輕鬆地恢復,並在不同的版本間切換。

Git 的概念是它會自動偵測一個 Repository(程式庫,簡稱 Repo)內的檔案及內容變化。如果它發現有檔案或其內容改變了,就會將此檔案加到 Unstaged 區域。你可以在 Unstaged 區域中選擇數個檔案,再將其 Stage 到 Staged 區域。當有檔案在 Staged 區域時,你就可以爲它們加上一段訊息(Summary)並送出一個 Commit。一個 Commit 就如同一個版本節點,你可以在不同的 Commit 間切換。

有使用 Git 的話,如果你修改程式後發現改錯東西了,你就可以不用一直 Ctrl+Z Undo,而可以透過 Git 來恢復到上一個功能正常的 Commit。而且 Git 會記錄所有的變化,你可以很清楚地看到每個 Commit 修改了哪些檔案的哪些內容。例如本 Repository 的 其中一個 Commit。

// Git 會記錄修改的內容。
// 此處展示了將「Hello!」改成「Hello! World!\n」的 Commit。
#include <stdio.h>

void main(void)
{
- printf("Hello!");
+ printf("Hello! World!\n");
}

當你的工作告一段落,例如完成了一個功能或一天結束了,可能已經累積了好幾個 Commit,這時你可以將這些 Commit Push 到 Remote Repository(遠端程式庫,例如 GitHub),這樣你做的這些變更就會隨著你送出的 Commit 一起儲存在 Remote Repository。當 Remote Repository 上有變化時,例如其他人 Push 了一些 Commit,你可以從 Remote Repository 上 Pull 這些變化到你電腦上的 Local Repository。

另外你可以爲一個特定的 Commit 加上 Tag(標籤),但通常此功能只會用來當作管理發行版(Release)用。

而 Branch(分支)的用法請見 Git-Flow、GitHub-Flow。

軟體工具​

原始的 Git 只能使用指令(CLI)來操作,但現在也有很多圖形介面的 Git 軟體可以使用。以下列出一些比較常見的軟體:

此外,現在多數的 IDE 也有內建 Git 功能。例如 Visual Studio。

好的 Commit​

一個好的 Commit 應該只包含了最小部分的變更,修改了一部分就送一次 Commit,而不是改了一大堆彼此沒太多關係的東西後才送一個 Commit。

而且好的 Commit 的 Summary 應該要可以清楚地表達此 Commit 究竟改了些什麼,而不是只有些籠統又不夠明確的訊息。不能清楚表達的 Summary 沒有意義。

好的 Summary不好的 Summary
增加自動記錄 Log 的功能更新程式
增加處理 Log 檔案路徑時的例外處理,來修正目標路徑不存在時會中斷程式的 bug修 bug

移動檔案或重新命名​

當一個檔案或資料夾在 Git 的控制下時,如果你想要移動它或對它重新命名,不應該直接透過檔案總管來做這些動作,而是應該使用 git mv 指令來完成,否則 Git 會將移動或重新命名的檔案及資料夾視爲不同的全新檔案,進而遺失以往的所有 Commit 記錄。使用時可以搭配 ls 指令來查看目前工作路徑內的檔案及資料夾、使用 cd 指令來移動工作路徑。

  • 例如你想將「Test.txt」移動到資料夾「Test」底下時,應該執行指令:git mv Test.txt Test/
  • 或是你想將「Test.txt」重新命名成「Doc.txt」時,應該執行指令:git mv Test.txt Doc.txt

參考資料​

push或是clone repo時,發生Permission denied​

  • 找到電腦裡的「認證管理員」
  • 將有關git的所有認證刪除
  • 再重新push一次,經過網站上的github認證就可以了

git 指令參考​

cd '填入你要追蹤的資料夾的路徑'

git init(初始化並開始追蹤)

git --version(查看目前git版本)

git config --global user.email <信箱>

git config --global user.name <名字>

git config --list(查看輸入了哪些個人資訊)

git status(查看git目前狀態)

git add .(將改的所有東西打包到索引區)

git add '你要打包到索引的檔案名稱'

git reset --<要退回所引的檔案名稱>

git clone <那串代碼的網址>

git commit -m"你這次更新的內容" :qw儲存並退出Vim

git push -u <遠端數據庫名稱(通常是origin)><遠端的哪條分支> (-u也可以不打,打了是預設下次如果只打git push 會預設上傳到-u後面那個數據庫)

git push <遠端數據庫名稱(通常是origin)> <本地的哪條分支>:<在遠端產生一個對應的分支>(遠端版)

git push <遠端數據庫名稱(通常是origin)> <本地的哪條分支> 從本地分支丟上去遠端

git remote add <origin> <一串網址> 在遠端數據庫開新分支

git remote -v (確認此專案會push到哪個remote網址)

git remote set-url origin <git://new.url.here> (修改 remote 位置(URL))

git remote remove origin (刪除原本的remote)

git checkout (查看git 目前狀態)

git merge '要合併的分支'(將分支合併,通常是舊的合併到新的) ⨳⨳⨳'要合併的分支'merge到 HEAD指的分支

git merge '要合併的分支'--no-ff(--no-f:不產生快轉,就是會分支出來給你看到兩個東西合併,不會整條直線直接覆蓋)

git reset --soft HEAD~<數字>(還原到上個版本,數字決定要還原幾個版本)

git reset <commit點位置>

git reflog 查看你每個commit的紀錄

git log --oneline -<數字> 查看你有幾筆commit(數字內代表只顯示幾個)

fsutil file createnew <file-name> <file-size-in-KB>(新增檔案)

md <file-name>..\ (新增資料夾)

git log --all --decorate --oneline --graph