1. 程式人生 > 其它 >使用Git進行版本控制

使用Git進行版本控制

摘自:Python程式設計 從入門到實踐(第2版)附錄D
Ubuntu 20.04

1. 安裝Git

$ sudo apt install git

2. 配置Git

Git跟蹤是誰修改了專案,需要知道使用者名稱和電子郵件。

$ git config --global user.name "username"
$ git config --global user.email "[email protected]"

3. 忽略檔案

建立一個git_practice資料夾作為專案目錄,並建立hello_git.py檔案。
有些檔案無須讓Git跟蹤它們,如.pyc儲存在目錄__pycache__中。為讓Git忽略這個目錄,建立一個名為.gitignore的特殊檔案,並在其中新增下面一行內容:

__pycache__/

4. 初始化倉庫

git_practice$ git init
已初始化空的 Git 倉庫於 git_practice/.git/

倉庫是程式中被Git主動跟蹤的一組檔案。Git用來管理倉庫的檔案都儲存在隱藏的目錄.git中,你不需要與這個目錄打交道。

5. 檢查狀態

執行其他操作前,先看一下專案的狀態:

git_practice$ git status
位於分支 master

尚無提交

未跟蹤的檔案:
  (使用 "git add <檔案>..." 以包含要提交的內容)
	.gitignore
	hello_git.py

提交為空,但是存在尚未跟蹤的檔案(使用 "git add" 建立跟蹤)
git_practice$

在Git中,分支是專案的一個版本。提交是專案在特定時間的快照。
Git指出專案中未被跟蹤的檔案,因為我們還沒有告訴它要跟蹤哪些檔案。接下來,Git告訴我們尚未將任何東西新增到當前提交中,但指出可能需要加入倉庫中的未跟蹤檔案。

6. 將檔案加入倉庫中

將這兩個檔案加入倉庫中,並再次檢查狀態:

git_practice$ git add .
git_practice$ git status 
位於分支 master

尚無提交

要提交的變更:
  (使用 "git rm --cached <檔案>..." 以取消暫存)
	新檔案:   .gitignore
	新檔案:   hello_git.py

git_practice$ 

命令git add .將專案中未被跟蹤的所有檔案都加入倉庫中。它不提交這些檔案,只是讓Git開始關注它們。現在檢查專案狀態時,我們發現Git找出了需要提交的一些修改。標籤new file意味著這些檔案是新新增到倉庫中的。

7. 執行提交

執行第一次提交:

git_practice$ git commit -m "Started project."
[master (根提交) 4588708] Started project.
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 hello_git.py
git_practice$ git status 
位於分支 master
無檔案要提交,乾淨的工作區
git_practice$ 

執行命令 git commit -m "message"拍攝專案的快照。標誌-m讓Git將接下來的訊息("Started project.")記錄到專案的歷史記錄中。輸出表明位於分支master上,且有兩個檔案被修改了。
現在檢查狀態時,會發現我們位於分支master上,且工作樹是乾淨的。這是你每次提交專案的可行狀態時都希望看到的訊息。如果顯示的訊息不是這樣的,請仔細閱讀,很可能是你在提交前忘記了新增檔案。

8. 檢視提交歷史

Git記錄所有的專案提交。

git_practice$ git log
commit 45887084157ddb1585e8ff8f516793dc5e2d92c7 (HEAD -> master)
Author: user <[email protected]>
Date:   Tue Mar 1 10:19:56 2022 +0800

    Started project.
git_practice$ 

每次提交時,Git都會生成唯一的引用ID,長40字元。它記錄提交是誰執行的、提交的時間以及提交時指定的訊息。並非在任何情況下都需要所有這些訊息,Git提供一個選項,讓列印提交歷史條目更簡單:

git_practice$ git log --pretty=oneline
45887084157ddb1585e8ff8f516793dc5e2d92c7 (HEAD -> master) Started project.
git_practice$ 

標誌--pretty=oneline指定顯示兩項最重要的資訊:提交的引用ID和為提交記錄的訊息。

9. 第二次提交

需要修改專案並提交所做的修改。為此,在hello_git.py中新增一行程式碼:

print("Hello Git world!")

如果現在檢視專案的狀態,將發現Git注意到這個檔案發生了變化:

git_practice$ git status
位於分支 master
尚未暫存以備提交的變更:
  (使用 "git add <檔案>..." 更新要提交的內容)
  (使用 "git restore <檔案>..." 丟棄工作區的改動)
	修改:     hello_git.py

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
git_practice$ 

輸出指定了當前所在的分支和被修改了的檔案的名稱,還指出了所作的修改未提交。下面提交所做的修改,並再次檢視狀態:

git_practice$ git commit -am "Extended hello Git."
[master 0a0faea] Extended hello Git.
 1 file changed, 1 insertion(+)
git_practice$ git status
位於分支 master
無檔案要提交,乾淨的工作區
git_practice$ git log --pretty=oneline
0a0faeac34f19c8de29e2e5ed68c9d44527d99f2 (HEAD -> master) Extended hello Git.
45887084157ddb1585e8ff8f516793dc5e2d92c7 Started project.
git_practice$ 

標誌-a讓Git將倉庫中所有修改了的檔案都加入到當前提交中。(如果在兩次提交之間建立了新檔案,可再次執行命令git add .,將這些新檔案加入倉庫中。)標誌-m讓Git在提交歷史中記錄一條訊息。
檢視專案的狀體時,我們發現狀態樹也是乾淨的。最後,可以看到提交歷史中包含兩個提交。

10. 撤銷修改

如何放棄所做的修改,恢復到前一個可行狀態。為此,首先在hello_git.py中再新增一行程式碼:

print("Hello Git world!")

print("Oh no, I broke the project!")

我們檢視狀態,發現Git注意到了所做的修改:

git_practice$ git status
位於分支 master
尚未暫存以備提交的變更:
  (使用 "git add <檔案>..." 更新要提交的內容)
  (使用 "git restore <檔案>..." 丟棄工作區的改動)
	修改:     hello_git.py

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
git_practice$ 

如果願意,可提交所做的修改,但這次我們不提交所做的修改,而是恢復到最後一個提交(我們知道,那次提交時專案能夠正常地執行)。為此,不對hello_git.py執行任何操作,而是在終端會話中執行如下命令:

git_practice$ git checkout .
從索引區更新了 1 個路徑
git_practice$ git status 
位於分支 master
無檔案要提交,乾淨的工作區

命令git checkout讓你能夠恢復到以前的任意提交。命令git checkout .放棄最後一次提交後所做的所有修改,將專案恢復到最後一次提交的狀態。
如果此時返回文字編輯器,將發現hello_git.py被修改成這樣:

print("Hello Git world!")

11. 檢出以前的提交

你可以檢出提交歷史中的任何提交,而不僅僅時最後一次提交,為此可以在命令git checkout末尾指定該提交引用ID的前6字元(而不是句點)。通過檢出以前的提交,你可以對其進行稽核,然後返回到最後一次提交,或者放棄最近所做的工作並選擇以前的提交:

git_practice$ git log --pretty=oneline
0a0faeac34f19c8de29e2e5ed68c9d44527d99f2 (HEAD -> master) Extended hello Git.
45887084157ddb1585e8ff8f516793dc5e2d92c7 Started project.
git_practice$ git checkout 0a0fae
注意:正在切換到 '0a0fae'。

您正處於分離頭指標狀態。您可以檢視、做試驗性的修改及提交,並且您可以在切換
回一個分支時,丟棄在此狀態下所做的提交而不對分支造成影響。

如果您想要通過建立分支來保留在此狀態下所做的提交,您可以通過在 switch 命令
中新增引數 -c 來實現(現在或稍後)。例如:

  git switch -c <新分支名>

或者撤銷此操作:

  git switch -

通過將配置變數 advice.detachedHead 設定為 false 來關閉此建議

HEAD 目前位於 0a0faea Extended hello Git.
git_practice$ 

檢出以前的提交後,將離開分支master,進入Git所說的分離頭指標(detached HEAD)狀態。HEAD指標表示當前提交的專案狀態,之所以說處於分離狀態,是因為我們離開了一個命名分支(這裡時master)。
要回到分支master,可檢出它:

git_practice$ git checkout master 
切換到分支 'master'
git_practice$ 

這讓你回到分支master。除非要使用Git的高階功能,否則在檢出以前的提交後,最好不要對專案做任何修改。然而,如果參與專案開發的人只有你自己,而你又想放棄較近的所有提交併恢復到以前的狀態,也可將專案重置到以前的提交。為此,可在處於分支master上的情況下,執行如下命令:

git_practice$ git status
位於分支 master
無檔案要提交,乾淨的工作區
git_practice$ git log --pretty=oneline
0a0faeac34f19c8de29e2e5ed68c9d44527d99f2 (HEAD -> master) Extended hello Git.
45887084157ddb1585e8ff8f516793dc5e2d92c7 Started project.
git_practice$ git reset --hard 458870
HEAD 現在位於 4588708 Started project.
git_practice$ git status
位於分支 master
無檔案要提交,乾淨的工作區
git_practice$ git log --pretty=oneline
45887084157ddb1585e8ff8f516793dc5e2d92c7 (HEAD -> master) Started project.
git_practice$ 

首先檢視狀態,確認位於分支master上。檢視提交歷史時,我們看到了兩個提交。接下來,執行命令git reset --hard,並在其中指定要永久恢復到的提交的引用ID前6字元。我們再次檢視狀態,發現位於分支master上,且沒有需要提交的修改。再次檢視提交歷史時,會發現我們回到了要重新開始的提交。

12. 刪除倉庫

有時候,倉庫的歷史記錄被你弄亂了,而你有不知道如何恢復。如果無法恢復且參與專案開發的只有你一人,可繼續使用這些檔案,但要將專案的歷史記錄刪除——刪除目錄.git。這不會影響任何檔案的當前狀態,只會刪除所有的提交,因此你將無法檢出專案的其他任何狀態。
為此,可開啟一個檔案瀏覽器,並將目錄.git刪除,也可以通過命令列將其刪除。這樣做後,需要重新建立一個倉庫,重新對修改進行跟蹤。下面演示瞭如何在終端會話中完成這個過程:

git_practice$ git status
位於分支 master
無檔案要提交,乾淨的工作區
git_practice$ rm -rf .git
git_practice$ git status
fatal: 不是 git 倉庫(或者任何父目錄):.git
git_practice$ git init
已初始化空的 Git 倉庫於 git_practice/.git/
git_practice$ git status
位於分支 master

尚無提交

未跟蹤的檔案:
  (使用 "git add <檔案>..." 以包含要提交的內容)
	.gitignore
	hello_git.py

提交為空,但是存在尚未跟蹤的檔案(使用 "git add" 建立跟蹤)
git_practice$ git add .
git_practice$ git commit -m "Starting over."
[master (根提交) ec75766] Starting over.
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 hello_git.py
git_practice$ git status
位於分支 master
無檔案要提交,乾淨的工作區
git_practice$