在軟體開發過程中,管理多個貢獻者的程式碼可能會很快變得一團糟。想象一下,幾個人同時編輯同一個文件,每個人都在新增新想法、修復錯誤或調整功能。如果沒有一個結構化的系統,就很難跟蹤誰在什麼時候、為什麼修改了什麼?錯誤很難挽回,合併專案的不同版本也會很快變得混亂。這正是 Git 以及 GitHub 所要解決的核心問題,它為開發人員提供了一種強大的方式來跟蹤變更、高效協作並管理程式碼庫的多個版本,同時又不會相互掣肘。本文將作為 Git 教程,從初學者的視角出發,為那些在使用 Git 過程中遇到困難的人提供指導。
什麼是Git?
Git 是一種分散式版本控制系統。它用於監控程式碼隨時間的變化。它允許開發人員分開工作,並在不發生衝突的情況下合併他們的工作。Git 還提供了整個專案的單獨副本和程式碼歷史記錄,這讓它變得更快、更可靠。因此,它既適用於個人專案,也適用於協作專案。Git 大多基於命令列,它為使用者提供了一個強大的工具箱,用於分支功能、提交更新、階段性修改,以及精確地撤銷錯誤。重要的是要記住,Git 只是一個管理程式碼的工具;它完全獨立於 GitHub 等網站,可以在沒有網際網路或任何託管服務的情況下執行。
你需要知道的核心概念
以下是 Git 背後主要概念的快速分解:
- 倉庫(Repo):Git 跟蹤檔案和更改的目錄。
- 克隆:遠端倉庫在本地機器上的副本。
- 提交:程式碼在某一特定時刻的快照,並附有描述改動的資訊。
- 分支:程式碼庫的一個獨立版本,用於開發新功能或修復。
- 合併:將一個分支中的變更整合到另一個分支中。
- 推送/拉取:將自己的修改傳送到 GitHub 或拉取他人的更新。
如何訪問Git
以下是訪問 Git 的三種不同方式:
- 命令列 – 最廣泛使用的 Git 訪問方式。
- 整合開發環境(IDE) – 最流行的 Git 擴充套件工具是 gitlens,它能在 vs 程式碼中提供大量擴充套件功能。
- Git 的圖形使用者介面 – 可參考官方網站 https://git-scm.com/downloads/guis
- GitKraken – Git 圖形使用者介面是最流行的圖形使用者介面之一
- SourceTree – 僅適用於 Windows 和 Mac。
動手實踐
現在,我們已經介紹了基礎知識,並在系統上設定了 Git,是時候動手實踐了。在本節中,我們將介紹每個開發者都應該掌握的一些最基本的 Git 命令。無論你是要開始一個新專案,還是要在現有專案上進行協作,這些命令都是有效使用 Git 的核心工作流程。我們將保持簡單、實用和初學者友好的風格。沒有花哨的設定,只有真正用得上的命令。開啟你的終端,讓我們開始吧!
建立目錄
mkdir git_learning
更改目錄
cd git_and_github
初始化git
git init
該命令將初始化 Git 倉庫。
你可以找到 .git 資料夾。這是 Git 維護的重要資料夾。它在執行 git init
命令時建立。Git 基本上使用雜湊值來儲存檔案,因此非常節省記憶體。
現在我們來建立一些檔案。
建立檔案
touch file1.txt
編輯檔案
vi file1.txt
輸入 i 進入插入模式,新增一些文字,然後點選 escape 鍵,輸入 :wq 儲存檔案。
另一個檔案也是如此。
touch file2.txt vi file2.txt
要了解倉庫的狀態
git status
該命令將顯示目錄中的更改以及這些更改是否被跟蹤。
對於簡短的狀態,您可以使用
git status -s
Git中的暫存區域
在 Git 中進行提交之前,我們有一個叫做暫存區的地方。在這裡,我們可以看到所做的修改,並在提交前對其進行審查。這是 Git 的一個特殊功能。我們可以檢視上一次提交和暫存改動之間的改動,然後進行新的提交。
我們將使用
git add git add file1.txt file2.txt
這將開始跟蹤目錄中的更改。
現在,要將目錄中的所有檔案新增到暫存中,只需使用:
git add .
使用該命令時要謹慎。因為它會跟蹤目錄中的所有內容,如日誌、環境檔案、資料集等。這可能會造成 Git 負載過重,導致版本管理效率低下。
每個提交都有一個
- ID – 唯一識別符號(雜湊值)。
- Message – 關於所做改動的描述。
- Date/Time – 何時修改的。
- Author – 誰修改了檔案。
- Complete snapshot – 在提交時。
你可能會認為,每次提交都儲存整個快照會佔用記憶體,效率很低。但 Git 不會儲存重複內容,並會壓縮內容以減少記憶體空間。所以,這也許是個可行的策略!
提交更改
git commit -m “Short description”
-m
是指資訊。
但有時,我們並不滿意簡短的描述。我們必須提供更多關於所做更改的背景資訊。
為此,我們只需使用:
git commit
這將在編輯器中開啟一個檔案,我們可以在其中鍵入少於 80 個字元的描述(別忘了在描述後新增換行符)。為此,讓我們為新的提交做一些修改。讓我再新增一個空檔案並提交修改。
一個誤解是 “當我們提交暫存區時,暫存區就變成了空的!”。這是不正確的。暫存區域不會變空,相反,暫存區域和之前的提交沒有區別。
指導原則 :
- 提交不應過大或過小。我們不必提交每個檔案的小改動。同樣,我們也不必在做了大量改動後才提交。當你達到想要記錄的狀態時,就進行提交。
- 如果您同時解決了一個錯字和一個錯誤,也就是說:您在解決一個錯誤時發現了一個錯字;那麼這兩個錯誤不應該同時提交,因為在還原錯字時,錯誤也會被還原。因此,我們必須分開提交。此外,如果您將兩個提交放在一起,我們也可以將它們分別取消提交。
- 提交資訊應該有意義。由於 Git 不僅用於版本控制,還用於協作,所以提交資訊要有意義,並遵循術語,這將有助於專案中的每個人理解所做的改動。
無暫存提交
我們能在不將修改新增到暫存區域的情況下(即在使用 git add
命令之前)提交修改嗎?
可以。讓我們來看一個例子。讓我對 file3.txt 進行修改。
git commit -am “message”
-a
會讓 Git 自動分階段處理已修改和已跟蹤的檔案。
比方說,你已經暫存了整個版本庫,但你想刪除一個檔案。通常,你會使用 rm
命令來刪除檔案。但該檔案仍在暫存區域,所以要刪除該檔案,我們將採取以下步驟。
一種可能的方法是使用普通的 rm
命令,然後用 git add <deleted_filename>
從起始區域移除該檔案。我知道這聽起來很奇怪,但 git add
會將檔案從暫存區域移除。
由於這裡跟蹤的是 file3.txt,因此顯示 file3.txt 已被刪除。
如果有一個檔案已被暫存,而你又想刪除它,請按以下步驟操作:
讓我們試試在不使用傳統 rm
命令的情況下使用 git rm <file_name>
。
我們可以從 git status
中看到新檔案已經存在。之後,使用 git rm
命令,我們會發現新檔案不存在了。git rm
命令會刪除暫存區域和工作目錄中的檔案,而 rm
命令(linux)只會刪除工作目錄中的檔案。
如何忽略跟蹤某些檔案
讓我們看看如何忽略對某些檔案的跟蹤。但這引出了一個問題:為什麼要不跟蹤檔案?原因如下:假設你有日誌檔案:你會生成大量日誌檔案、資料集,每次對它們進行更改時都會更新。它們基本上都是 JSON 格式,但每次執行筆記本都會產生不同的輸出,這使得 Git 難以跟蹤變化。因此使用 .gitignore 來避免 Git 追蹤這些檔案。
我們總是需要忽略一些檔案,比如日誌檔案。在版本庫中新增這些檔案只會增加版本庫的大小。因此,我們必須在 Git 中忽略這些檔案。在下圖中,我建立了一個日誌目錄和一個日誌檔案。隨後,我建立了一個 .gitignore 檔案,並在 .gitignore 檔案中新增了一個日誌目錄條目。這樣,Git 就不會再追蹤指定的檔案了。
我們可以看到,日誌資料夾不再被跟蹤。
處理異常值
有一個問題!當我們使用 git add
或 commit
開始跟蹤某個檔案,然後將其新增到 gitignore 時,Git 仍會跟蹤該檔案或目錄中的改動。因此,為了避免這種情況,我們必須從暫存區域移除這些檔案/目錄。但 git rm
會同時刪除暫存區和目錄中的檔案。因此,如果我們只想從暫存區移除檔案,就要使用 :
git rm -r – cached directory_name/filename
可以看到,檔案 not_track.txt 已被跟蹤。因此,為了避免這種情況發生,我們必須使用以下命令:
git rm -r –cached directory_name/filename
檢視差異
現在,讓我們看看上次提交和暫存檔案之間有哪些改動。
我們將使用下面的命令來檢視:
git diff --staged
以下是對上述截圖的解釋:
.gitignore 之前並不存在(/dev/null 表示沒有之前的檔案)。
新增了兩個條目:
- logs/ → 忽略該目錄。
- not_track.txt → 忽略該檔案。
file3.txt 正在從 repo 中刪除(分階段刪除)。該檔案有一行 “這是我的第三個檔案”。
開發人員通常使用圖形使用者介面工具(如 VS Code)檢視 diff
,但也可以使用命令列檢視差異。
git diff來幫忙
git diff
會比較上次提交的檔案和暫存的檔案。例如:a/file1. js 是舊檔案,b/file1.js 是新檔案 → 舊副本中的改動用紅色的 -
號(減號)表示,新副本中的改動用綠色的 +
號(加號)表示(如圖所示)。
Green - newly appended linesRed - these lines will be removedWhite - These lines are there in the old and new code.
git diff
命令顯示了目錄和暫存之間的差異。
讓我們在目錄中做一些改動,以使用該命令:
現在,讓我們對所有檔案進行階段化,並提交我們的更改,以檢視過去進行的所有提交。檢視方法如下:
git log
git log —oneline
→ 這將給出提交的簡要摘要。
git log —oneline —reverse
→ 這將反轉提交的順序。
要檢視提交中的更改,我們可以使用
git show <id of that commit>
如何獲取上一次提交的改動
git restore --staged filename
→ 這將從上次提交中獲取檔案並放到這裡。
git restore .
會從暫存環境中獲取檔案並放到工作目錄中。但如果有新的未跟蹤檔案,而之前的提交中又沒有該檔案,它就會保持原樣。
我們可以看到,執行 git restore
命令後,file1.txt 中的更改已恢復到之前的提交狀態。
簡要回顧
在本節實踐課程中,我們學習了實際開發工作流程中使用的 Git 基本命令。我們從建立 Git 倉庫開始,學習瞭如何建立和編輯檔案。介紹了工作目錄、暫存區域和提交等關鍵概念,以及 git init
、git add
、git commit
和git status
等命令。我們探討了 Git 如何跟蹤更改、管理檔案版本以及處理暫存與未暫存檔案。我們特別強調了正確的提交方法、使用 .gitignore來避免跟蹤不必要的檔案,以及使用 git diff 來檢視差異。最後,我們還學習瞭如何使用 git log
、git show
和git restore
檢視以前的提交併恢復修改。
小結
Git 一開始可能會讓人不知所措,但一旦掌握了暫存、提交、恢復和檢視歷史等核心概念,它就會成為工作流程中的強大工具。在本文中,我們將重點放在命令列上,因為它能讓你對幕後發生的一切擁有最大的控制權和透明度。瞭解了 Git 如何跟蹤檔案、處理提交和管理變更,你就能寫出更簡潔的程式碼,更有效地開展協作,並在出現問題時迅速恢復。無論你是要回滾錯誤的變更、檢視提交歷史,還是整理工作,Git 都能為你提供支援。
評論留言