Git 是一個分散式版本控制系統,它能有效追蹤程式碼的變更,方便團隊協作。從初始化倉函式庫、新增檔案、提交修改到分支管理、合併衝突等,Git 提供了一套完整的版本控制解決方案。瞭解 Git 的基本操作對於提升開發效率至關重要,尤其在團隊協作中,能有效避免程式碼衝突和版本混亂。熟練運用 Git 的各種功能,例如分支管理、重置、還原等,能更好地管理程式碼版本,提升開發流程的靈活性。

選項

git init命令有一些選項可以用來定製倉函式庫的建立。

  • --bare:建立一個裸倉函式庫(bare repository),即沒有工作目錄的倉函式庫。這種倉函式庫通常用作中央協作點,多個開發者可以從中推播和提取程式碼。
  • --shared:設定群組所有權、檔案許可權和選項,以支援多個Unix賬戶推播到非裸倉函式庫中。

Git儲存函式庫結構

Git儲存函式庫通常儲存在名為.git的目錄中,這個目錄包含了倉函式庫的所有資料結構和歷史記錄。然而,也可以使用git --git-dir directory命令或設定GIT_DIR環境變數來指定倉函式庫的位置。

內容解密:

上述程式碼展示瞭如何建立一個新Git儲存函式庫,並介紹了git init命令的選項和安全性。透過這個命令,可以建立一個新的Git儲存函式庫,並開始跟蹤和管理程式碼變化。

  flowchart TD
    A[開始] --> B[建立新倉函式庫]
    B --> C[設定倉函式庫選項]
    C --> D[初始化倉函式庫]
    D --> E[跟蹤程式碼變化]

圖表翻譯:

此圖表展示了建立新Git儲存函式庫的流程。首先,建立一個新倉函式庫,然後設定倉函式庫選項,接著初始化倉函式庫,最後開始跟蹤程式碼變化。這個流程可以幫助開發者們更好地理解和使用Git版本控制系統。

匯入現有專案

當您想要將現有的專案匯入 Git 版本控制系統時,可以使用以下命令建立一個新的倉函式庫並新增當前目錄下的所有內容:

$ git init
$ git add.
$ git commit -m '開始專案 Foo!'

讓我們來看看具體的步驟:

  1. 切換到您想要匯入的專案目錄:$ cd hello
  2. 列出目錄下的檔案:$ ls -l
  3. 初始化 Git 倉函式庫:$ git init
  4. 新增當前目錄下的所有內容到索引中:$ git add.
  5. 提交變更並新增提交訊息:$ git commit -m '開始專案 Foo!'

這些命令會建立一個新的 Git 倉函式庫,並將當前目錄下的所有內容新增到倉函式庫中作為初始提交。您可以使用 git branch 命令檢視目前的分支,使用 git log --stat 命令檢視提交記錄。

詳細解釋

  • git add. 新增當前目錄下的所有內容到索引中,包括檔案和目錄。
  • git commit 建立一個新的樹物件,捕捉索引中的當前狀態,並建立一個提交物件,包含您的提交訊息、個人身份、當前時間等資訊。
  • git commit 將這些資訊記錄在物件資料函式庫中,並設定 master 分支指向新的提交 ID。

圖表翻譯:

  flowchart TD
    A[初始化 Git 倉函式庫] --> B[新增當前目錄下的所有內容]
    B --> C[提交變更]
    C --> D[設定 master 分支]

這個圖表展示了匯入現有專案的步驟,從初始化 Git 倉函式庫開始,然後新增當前目錄下的所有內容,提交變更,最後設定 master 分支。

Git 忽略檔案

在開發專案時,可能會有不想被 Git 追蹤的檔案,例如編譯後的程式碼、自動生成的檔案等。Git 提供了幾種方法來忽略這些檔案。

忽略檔案的型別

以下是一些常見的忽略檔案型別:

  • 編譯後的程式碼:.o.so.a.dll.exe
  • bytecode:.jar(Java)、.elc(Emacs Lisp)、.pyc(Python)
  • 工具鏈生成的檔案:config.logconfig.statusaclocal.m4Makefile.inconfig.h

Git 忽略檔案的方法

Git 有三種方法來忽略檔案:

  1. .gitignore 檔案:在工作目錄中建立一個名為 .gitignore 的檔案,列出要忽略的檔案模式。這個檔案也可以提交到版本函式庫中,以便其他開發者也能忽略相同的檔案。
  2. .git/info/exclude 檔案:這個檔案是版本函式庫組態的一部分,但不會被提交到版本函式庫中。它可以用來設定專屬於該版本函式庫的忽略規則。
  3. core.excludesfile 組態:可以設定一個全域性的忽略檔案,使用 git config --global core.excludesfile ~/.gitignore 命令。這個檔案可以包含要忽略的檔案模式。

忽略模式語法

忽略模式使用 Shell 的 glob 模式,支援以下語法:

  • # 開頭的行是註解
  • ! 開頭的行是否定模式,覆寫之前的模式
  • * 代表任意字元
  • ? 代表任意單個字元
  • [abc] 代表字元集

例如:

# 忽略 conf/config.h 檔案
conf/config.h

# 忽略當前目錄下的 config.h 檔案
/config.h

# 忽略所有.o 檔案,但不包括 foo.o
*.o
!foo.o

Git 會讀取所有忽略模式來決定是否忽略某個檔案,而不是停止在第一個匹配的模式上。最後一個匹配的模式將被應用。

Git 忽略檔案模式

Git 的忽略檔案模式允許您指定哪些檔案或目錄不應該被版本控制系統追蹤。這些模式可以在 .gitignore 檔案中定義,也可以在 core.excludesfile 中設定。

模式語法

Git 的忽略檔案模式使用 Shell 的 glob 語法,該語法簡單且不如正規表示式強大。以下是幾個基本的 glob 語法規則:

  • * 匹配任意不包含 / 的字元序列
  • ? 匹配任意單個字元(不包括 /
  • [abc] 匹配任意一個指定的字元(例如 abc

忽略檔案範例

以下是一些常見的忽略檔案模式範例:

  • *.o*.a:忽略以 .o.a 結尾的檔案,通常是編譯器產生的物件檔案和歸檔檔案
  • *.so:忽略分享物件檔案
  • !my.so:除外 my.so 檔案,不忽略它
  • temp/:忽略名為 temp 的目錄,但仍然追蹤名為 temp 的檔案和符號連結

設定忽略檔案模式

您可以在 .gitignore 檔案中設定忽略檔案模式,該檔案應該放在 Git 工作目錄的根目錄下。另外,您也可以在 core.excludesfile 中設定全域性的忽略檔案模式。

注意事項

請注意,忽略檔案模式只適用於未追蹤的檔案。如果您想要忽略已經被 Git 追蹤的檔案變化,您需要使用 git update-index --assume-unchanged 命令。

Git 忽略檔案模式檔案

Git 的忽略檔案模式檔案可以在 fnmatch(3)glob(3) 手冊頁中找到。這些手冊頁提供了有關 Git 忽略檔案模式語法的詳細資訊。

Git版本控制:修改和提交

Git是一種強大的版本控制系統,允許您管理和跟蹤程式碼變化。這章節將介紹如何使用Git修改和提交您的程式碼。

修改索引

當您執行git commit時,Git會將索引中的內容新增為新的提交到當前分支。因此,在提交之前,您需要將想要提交的變化新增到索引中。這可以跳過一些您尚未準備提交的變化。

git commit <檔案名稱>

給定一個特定的檔案名稱,git commit會忽略索引,並只提交該檔案的變化。

新增新檔案

git add 檔案名稱

這個命令會將檔案新增到Git的物件資料函式庫中,並更新索引。

新增現有檔案的變化

git add 檔案名稱

與新增新檔案相同,這個命令會將檔案的變化新增到Git的物件資料函式庫中,並更新索引。

新增部分變化

git add -p

這個命令會啟動一個互動式迴圈,允許您選擇要新增的變化部分。當您完成時,Git會將選擇的變化新增到索引中。

刪除檔案

git rm 檔案名稱

這個命令會刪除檔案的索引條目,並將其排程為下一次提交時刪除。它也會刪除工作目錄中的檔案。

快速方式

  • git add -u:包括所有在索引中的檔案,包括變化和刪除的檔案,但不包括新檔案。
  • git add -A:包括所有在索引和工作目錄中的檔案,包括新檔案、變化和刪除的檔案。

圖表翻譯:

  flowchart TD
    A[開始] --> B[修改索引]
    B --> C[新增新檔案]
    C --> D[新增現有檔案的變化]
    D --> E[新增部分變化]
    E --> F[刪除檔案]
    F --> G[提交變化]

這個流程圖展示了Git版本控制的基本流程,從修改索引開始,到提交變化為止。每一步驟都對應著一個特定的Git命令或動作。

Git 中的檔案重新命名與移動

Git 中的檔案重新命名與移動可以使用 git mv 命令來完成。這個命令實際上是對工作目錄中檔案進行重新命名或移動,然後使用 git add 將新的檔案名稱加入索引。

$ git mv foo bar

這等同於以下兩個步驟:

$ mv foo bar
$ git add bar

重新命名檔案在版本控制系統中是一個複雜的話題,因為它涉及到檔案的內容和名稱的變化。Git 並不明確地追蹤檔案重新命名,但它可以根據檔案內容和名稱的變化推斷出檔案是否被重新命名。

Git 中的重新命名推斷

Git 會根據檔案的內容和名稱的變化來推斷檔案是否被重新命名。如果一個檔案被刪除,然後一個新檔案出現,且兩個檔案的內容相同,Git 會將其視為檔案重新命名。

$ git status
renamed: foo -> bar

這種推斷方式很簡單,但它需要使用者瞭解 Git 的工作原理。例如,如果你編輯了一個檔案並重新命名它,然後提交變更,Git 可能不會將其視為檔案重新命名。

取消暫存變更

如果你想要取消暫存變更,可以使用 git reset 命令。這個命令會重置索引,使其與當前提交相匹配,並取消任何已經暫存的變更。

$ git reset
Unstaged changes after reset:
M old-and-busted.c
M new-hotness.hs

你也可以指定特定的檔案或目錄來重置索引,而不影響其他檔案的暫存變更。

提交變更

當你準備好提交變更時,可以使用 git commit 命令。這個命令會將索引中的變更提交為一個新的提交。

$ git commit -m "an interesting commit message"

提交訊息是用來描述提交中變更的自由格式文字。你可以在命令列中指定提交訊息,或者讓 Git 啟動一個文字編輯器來輸入提交訊息。

良好的提交實踐

一個良好的提交應該包含一個明確的提交訊息,描述了提交中所做的變更。提交訊息應該簡潔明瞭,第一行不應該超過 50-60 個字元。若需要更多行,則應該在第一行後面加上一個空行,然後將剩下的段落包裹在 72 個字元以內。

良好的提交實踐還包括確保提交中只包含相關的變更,不包含無關的修改。這樣可以使得提交更加有意義,易於理解和管理。

Git 中的提交訊息格式

Git 中的提交訊息格式通常如下:

  • 第一行:提交主題,簡潔明瞭,不超過 50-60 個字元。
  • 第二行:空行,用於分隔主題和正文。
  • 第三行及以後:提交正文,描述了提交中所做的變更。

這種格式可以使得提交訊息更加清晰易讀,也方便了其他工具和軟體對提交訊息的解析和顯示。

良好的提交訊息範例

Implement new feature

This commit implements a new feature that allows users to...

在這個範例中,第一行是提交主題,簡潔明瞭,描述了提交中所做的變更。第二行是空行,用於分隔主題和正文。第三行及以後是提交正文,描述了提交中所做的變更。

Git版本控制系統:提交與修改

提交

在使用Git進行版本控制時,提交是一個重要的步驟。提交不僅可以儲存修改,也可以讓其他開發人員瞭解變更。以下是一些提交的最佳實踐:

  • 提交前,應確保所有修改都已經儲存並新增到索引中。
  • 提交時,應提供一個明確的提交訊息,描述所做的修改。
  • 可以使用 git commit -a 命令提交所有已經追蹤的修改檔案,但要小心不要意外提交未完成的修改。

Git提交工作流程

以下是一個多次提交的工作流程:

  1. 使用 git add 命令選擇性地暫存一部分修改。
  2. 執行 git stash --keep-index 命令,儲存並復原未暫存的修改,並重置工作目錄以匹配索引。
  3. 檢查工作目錄狀態,以確保選擇的修改有意義;例如,編譯和測試軟體。
  4. 執行 git commit 命令提交暫存的修改。
  5. 使用 git stash pop 命令還原剩餘的未暫存修改,並傳回步驟1,直到所有修改都已提交。

復原和編輯提交

Git提供了工具來復原或更正已經提交的修改。與集中式版本控制系統不同,Git允許您在本地私有倉函式庫中自由地刪除或更改提交。以下是復原和編輯提交的一些方法:

  • 使用 git reset 命令復原提交。
  • 使用 git commit --amend 命令編輯最近一次提交。
  • 使用 git rebase 命令重新排列提交歷史。

Git Stash命令

git stash 命令是一個非常有用的工具,可以用來儲存和還原未提交的修改。以下是 git stash 命令的一些用法:

  • git stash:儲存未提交的修改,並重置工作目錄。
  • git stash list:列出所有儲存的修改。
  • git stash apply:還原最近一次儲存的修改。
  • git stash pop:還原最近一次儲存的修改,並刪除它。
  flowchart TD
    A[開始] --> B[選擇性暫存修改]
    B --> C[儲存並復原未暫存修改]
    C --> D[檢查工作目錄狀態]
    D --> E[提交暫存修改]
    E --> F[還原剩餘未暫存修改]
    F --> G[重複步驟直到所有修改都已提交]

圖表翻譯:

此圖表描述了一個Git提交工作流程。首先,選擇性地暫存一部分修改。然後,儲存並復原未暫存的修改,並重置工作目錄以匹配索引。接下來,檢查工作目錄狀態,以確保選擇的修改有意義。然後,提交暫存的修改。最後,還原剩餘的未暫存修改,並傳回步驟1,直到所有修改都已提交。

  flowchart TD
    A[開始] --> B[選擇性暫存修改]
    B --> C[儲存並復原未暫存修改]
    C --> D[檢查工作目錄狀態]
    D --> E[提交暫存修改]
    E --> F[還原剩餘未暫存修改]
    F --> G[重複步驟直到所有修改都已提交]
    style A fill:#bbf,stroke:#f66,stroke-width:2px
    style B fill:#bbf,stroke:#f66,stroke-width:2px
    style C fill:#bbf,stroke:#f66,stroke-width:2px
    style D fill:#bbf,stroke:#f66,stroke-width:2px
    style E fill:#bbf,stroke:#f66,stroke-width:2px
    style F fill:#bbf,stroke:#f66,stroke-width:2px
    style G fill:#bbf,stroke:#f66,stroke-width:2px

Git版本控制系統中的提交修改

Git是一種強大的版本控制系統,允許使用者修改提交的內容。這篇文章將介紹如何修改最後一次提交的內容。

修改最後一次提交

如果您想要修改最後一次提交的內容,可以使用以下命令:

$ git commit --amend

這個命令會將最後一次提交的內容修改為新的內容,並且會提示您編輯提交訊息。如果您想要重複使用最後一次提交的訊息,可以新增 -C HEAD 選項。

修改提交訊息

如果您只想要修改提交訊息,可以使用以下命令:

$ git commit --amend -m "新的提交訊息"

這個命令會將最後一次提交的訊息修改為新的訊息。

Reflog

如果您不小心修改了提交的內容,然後又想要還原原來的內容,可以使用Reflog功能。Reflog是一種記錄Git操作的日誌,可以用來還原原來的提交內容。

$ git log -g

這個命令會顯示Reflog的內容,您可以找到原來的提交內容並還原它。

內容解密:

上述命令和功能可以幫助您管理Git版本控制系統中的提交內容。瞭解這些功能可以幫助您更好地使用Git版本控制系統。

圖表翻譯:

  graph LR
    A[Git Commit] --> B[Git Amend]
    B --> C[Reflog]
    C --> D[還原原來的提交內容]

這個圖表顯示了Git版本控制系統中的提交修改流程。從左到右,分別是Git Commit、Git Amend、Reflog和還原原來的提交內容。

Git 重置與刪除提交

Git是一個強大的版本控制系統,提供了多種工具來管理提交歷史。當您需要刪除或修改提交時,Git提供了git resetgit commit --amend等命令來幫助您實作這些功能。

刪除最後一次提交

如果您想要刪除最後一次提交,可以使用git reset HEAD~命令。這個命令會將目前分支的頭指標移動到最後一次提交之前的位置,從而刪除最後一次提交。同時,它也會重置索引以匹配新的頭指標,但不會修改工作目錄。

$ git reset HEAD~

在執行這個命令後,Git會報告哪些檔案已經被修改或新增,以便您可以根據需要進行後續操作。

刪除任意數量的提交

git reset命令不僅可以刪除最後一次提交,也可以刪除任意數量的提交。您可以使用HEAD~n語法來指定要刪除的提交數量,其中n是您想要刪除的提交數。

$ git reset HEAD~n

這個命令會將目前分支的頭指標移動到n次提交之前的位置,從而刪除最近的n次提交。

復原刪除的提交

即使您使用git reset刪除了提交,Git仍然保留了這些提交的記錄在reflog中。您可以使用git reflog命令來檢視reflog記錄,並找到您想要復原的提交。

$ git reflog

然後,您可以使用git checkout命令來復原刪除的提交。

$ git checkout <commit_id>

或者,您可以使用git cherry-pick命令來重新應用刪除的提交。

$ git cherry-pick <commit_id>
內容解密:
  • git reset HEAD~:刪除最後一次提交,並重置索引。
  • git reset HEAD~n:刪除任意數量的提交,並重置索引。
  • git reflog:檢視reflog記錄,以便找到刪除的提交。
  • git checkout <commit_id>:復原刪除的提交。
  • git cherry-pick <commit_id>:重新應用刪除的提交。

圖表翻譯:

  flowchart TD
    A[Git Reset] --> B[刪除提交]
    B --> C[重置索引]
    C --> D[工作目錄不變]
    D --> E[Git Reflog]
    E --> F[復原刪除的提交]
    F --> G[Git Checkout]
    G --> H[Git Cherry-pick]

此圖表展示了Git重置和刪除提交的流程,從刪除提交到重置索引,再到工作目錄不變,最後到復原刪除的提交。

Git 重置和還原

Git是一個強大的版本控制系統,提供了多種方式來管理和修改提交記錄。在這篇文章中,我們將探討如何使用Git重置和還原提交。

Git重置

Git重置(git reset)是一個強大的命令,允許您重置提交記錄到指定的提交版本。您可以使用git reset來刪除最近的提交,或者重置提交記錄到某個特定的提交版本。

例如,要刪除最近的三個提交,您可以使用以下命令:

git reset HEAD~3

這將重置提交記錄到第四個提交版本。

Git還原

Git還原(git revert)是一個命令,允許您還原某個提交的變更。您可以使用git revert來建立一個新的提交,該提交復原了指定提交的變更。

例如,要還原某個提交的變更,您可以使用以下命令:

git revert 9c6a1fad

這將建立一個新的提交,該提交復原了指定提交的變更。

部分還原

如果您只想還原某個提交的一部分變更,您可以使用以下命令:

git revert -n commit
git reset
git add -p
git commit
git checkout.

這將還原指定提交的變更,但不會建立新的提交。然後,您可以使用git add -p來選擇要還原的變更,並使用git commit來建立新的提交。

編輯多個提交

Git 提供了 git rebase 命令來編輯多個提交。這個命令可以用來重新排列、合併或分割提交。當你執行 git rebase -i HEAD~n 時,Git 會啟動你的編輯器並顯示最後 n 個提交的列表。你可以編輯這個列表來指定要對每個提交執行的操作。

可用的操作

以下是可用的操作:

  • pick:使用提交的原始內容。
  • reword:修改提交的訊息。
  • edit:修改提交的內容和訊息。
  • squash:合併提交到前一個提交中。
  • fixup:與 squash 類別似,但丟棄提交的訊息。

編輯提交

當你編輯提交列表時,你可以重新排列提交的順序,或者刪除某些提交。你也可以使用 squashfixup 來合併提交。

解決衝突

如果你要求 Git 執行無效的操作,例如反轉兩個提交的順序,而後一個提交依賴於前一個提交的內容,Git 會停止並要求你解決衝突。當你解決完衝突後,你可以使用 git rebase --continue 來繼續重新基礎的過程。

中止重新基礎

如果你想要中止重新基礎的過程,你可以使用 git rebase --abort 來傳回到之前的狀態。

Mermaid 圖表

  graph LR
    A[開始] --> B[編輯提交]
    B --> C[解決衝突]
    C --> D[繼續重新基礎]
    D --> E[完成]
    E --> F[中止重新基礎]

圖表翻譯

這個圖表顯示了編輯多個提交的過程。首先,你需要編輯提交列表。然後,Git 會檢查是否有衝突。如果有,你需要解決衝突。解決完衝突後,你可以繼續重新基礎的過程。如果你想要中止重新基礎,你可以使用 git rebase --abort 來傳回到之前的狀態。

程式碼範例

$ git rebase -i HEAD~3

這個命令會啟動你的編輯器並顯示最後 3 個提交的列表。你可以編輯這個列表來指定要對每個提交執行的操作。

內容解密

這個程式碼範例顯示瞭如何使用 git rebase -i 來編輯多個提交。當你執行這個命令時,Git 會啟動你的編輯器並顯示最後 3 個提交的列表。你可以編輯這個列表來指定要對每個提交執行的操作。例如,你可以使用 pick 來使用提交的原始內容,或者使用 reword 來修改提交的訊息。

Git 分支管理

Git 的分支管理是版本控制系統的一個重要功能,允許開發者在不同的分支中平行工作。分支是 Git 中的一個基本概念,允許開發者建立多個版本的程式碼函式庫,並在不同分支中進行修改和測試。

分支的作用

分支的主要作用是允許開發者在不同的分支中平行工作,從而提高開發效率和減少衝突。分支還可以用於隔離不同的功能或特性,讓開發者可以獨立地工作和測試。

分支型別

Git 中有兩種主要的分支型別:主分支(master)和功能分支(feature)。

  • 主分支(master):主分支是 Git 中的預設分支,代表著專案的主線版本。
  • 功能分支(feature):功能分支是用於開發新的功能或特性的分支,通常是從主分支建立出來的。

分支操作

Git 中提供了多種分支操作命令,包括:

  • git branch: 建立、列出或刪除分支。
  • git checkout: 切換到不同的分支。
  • git merge: 合併兩個分支。
  • git rebase: 將一個分支重新根據另一個分支。

分支策略

Git 中有多種分支策略,可以根據專案的需要選擇適合的策略。一些常見的分支策略包括:

  • 主分支開發:所有開發都在主分支中進行。
  • 功能分支開發:每個功能或特性都在獨立的分支中開發。
  • 發布分支:為了發布而建立的分支,通常用於最終測試和除錯。
圖表翻譯:
  graph LR
    A[主分支] -->|建立|> B[功能分支]
    B -->|合併|> A
    A -->|重新根據|> B
    B -->|刪除|> C[刪除分支]

上述圖表展示了 Git 中的分支操作,包括建立功能分支、合併功能分支到主分支、重新根據主分支和刪除功能分支。

從技術架構視角來看,Git 的分支模型和核心命令,例如 initaddcommitmvresetrevertrebasebranchcheckoutmerge,構成了其強大的版本控制能力的基本。這些命令的組合使用,涵蓋了從初始化倉函式庫、管理檔案變更、提交更新、處理檔案移動和重新命名、復原修改、到分支管理和合併等一系列核心操作,展現了 Git 在處理複雜專案和團隊協作方面的靈活性。然而,Git 的學習曲線較陡峭,需要使用者理解其底層概念和工作流程,例如索引、物件模型、reflog 等,才能有效運用其全部功能。對於初學者,建議從基本命令和工作流程開始,逐步深入理解 Git 的高階功能和分支策略。展望未來,Git 的分散式架構和靈活的分支模型將持續在軟體開發領域扮演關鍵角色,並隨著開發流程和協作方式的演進不斷最佳化和完善。對於追求效率和程式碼品質的開發團隊而言,精通 Git 的使用無疑是至關重要的。