程序員如何輕鬆入門Git?讀完這一篇,獨立創建自己的第一個項目

Git 程序員 軟件 Mac電腦 Finder Windows 異步社區 2019-07-10

如果你想試著用一下Git的話,那麼我們馬上就可以開始了。本章將會帶領你創建自己的第一個項目。我們會為你演示那些用於提交修改版本、查看歷史和與其他開發者交換版本的命令。

1.1 準備Git環境

首先,我們需要安裝好Git。你可以在Git的官網上找到你所需要的一切:

http://git-scm.com/download

Git是一個高可配置軟件。首先,我們可以宣佈用config命令配置一下用戶名和用戶郵箱:[1]

> git config --global user.email "[email protected]"

1.2 第一個Git項目

在這裡,我們建議你最好能為接下來的Git測試單獨開闢一個項目。總之應先從一個簡單的小項目開始。在我們這個小小的示例項目中,first-steps目錄下只有兩個文本文件,如圖1.1所示。


程序員如何輕鬆入門Git?讀完這一篇,獨立創建自己的第一個項目


圖1.1 我們的示例項目

在開始擺弄這個玩具項目之前,我們建議你最好先做一個備份!儘管在Git中,想要造成永久性的刪除或破壞也不是件容易的事情,而且每當你要做某些“危險”動作的時候,Git通常也會發出相應的警告消息。但是,有備無患總是好的。

1.2.1 創建版本庫

現在,我們首先需要創建一個版本庫,用於存儲該項目本身及其歷史。為此,我們需要在該項目目錄中使用init命令。對於一個帶版本庫的項目目錄,我們通常稱之為工作區。

> cd /projects/first-steps 
> git init
Initialized empty Git repository in /projects/first-steps/.git/

init命令會在上述目錄中創建一個名為.git的隱藏目錄,並在其中創建一個版本庫。但請注意,該目錄在Windows資源管理器或Mac Finder中可能是不可見的。


程序員如何輕鬆入門Git?讀完這一篇,獨立創建自己的第一個項目


圖1.2 本地版本庫所在的目錄

1.2.2 首次提交

接下來,我們需要將foo.txtbar.txt這兩個文件添加到版本庫中去。在Git中,我們通常將項目的一個版本稱之為一次提交,但這要分兩個步驟來實現。第一步,我們要先用add命令來確定哪些文件應被包含在下次提交中。第二步,再用commit命令將修改傳送到版本庫中,並賦予該提交一個散列值以便標識這次新提交。在這裡,我們的散列值為2f43cd0,但可能會有所不同,因為該值取決於文件內容。

> git add foo.txt bar.txt 
> git commit --message "Sample project imported."
master (root-commit) 2f43cd0] Sample project imported.
2 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 bar.txt
create mode 100644 foo.txt

1.2.3 檢查狀態

現在,我們來修改一下foo.txt文件的內容,先刪除bar.txt文件,再添加一個名為bar.html的新文件。然後,status命令就會顯示出該項目自上次提交以來所發生的所有修改。請注意,新文件bar.html在這裡被標示成了未跟蹤狀態,這是因為我們還沒有用add命令將其註冊到版本庫。

> git status 
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in
# working directory)
#
# deleted: bar.txt
# modified: foo.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# bar.html
no changes added to commit (use "git add" and/or "git commit -a")

如果我們還想看到更多細節性的內容,也可以通過diff命令來顯示其每個被修改的行。當然。有很多人可能會覺得diff的輸出是個非常難讀的東西。幸運的是,在這一領域,我們有許多工具和開發環境可用,它們可以將這一切顯示得更為清晰(見圖1.3)。


程序員如何輕鬆入門Git?讀完這一篇,獨立創建自己的第一個項目


圖1.3 圖形工具(kdiff3)中的Diff報告

> git diff foo.txt 
diff --git a/foo.txt b/foo.txt
index 1910281..090387f 100644
--- a/foo.txt
+++ b/foo.txt
@@ -1 +1 @@
-foo
\ No newline at end of file
+foo foo
\ No newline at end of file

1.2.4 提交修改

接下來,所有的修改都必須要先被歸檔成一次新的提交。我們要對修改過的文件和新文件執行add命令,並對要刪除的文件使用rm命令。

> git add foo.txt bar.html 
> git rm bar.txt
rm 'bar.txt'

現在再次調用status命令,我們會看到所有的修改已經被納入了下一次提交中。

> git status 
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: bar.html
# deleted: bar.txt
# modified: foo.txt
#

然後用commit命令提交這些修改。

> git commit --message "Some changes." 
[master 7ac0f38] Some changes.
3 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 bar.html
delete mode 100644 bar.txt

1.2.5 顯示歷史

log命令可用來顯示項目的歷史,所有提交都會按時間順序被降序排列出來。

> git log
commit 7ac0f38f575a60940ec93c98de11966d784e9e4f
Author: Rene Preissel <[email protected]>
Date: Thu Dec 2 09:52:25 2010 +0100
Some changes.
commit 2f43cd047baadc1b52a8367b7cad2cb63bca05b7
Author: Rene Preissel <[email protected]>
Date: Thu Dec 2 09:44:24 2010 +0100
Sample project imported.

1.3 Git的協作功能

現在,我們已經有了一個存放項目文件的工作區,以及一個存放項目歷史的版本庫。在一個像CVS和Subversion這樣傳統的集中式版本系統中,儘管每個開發者也都有屬於他/她自己的工作區,但所有人都共享了一個通用的版本庫。而在Git中,每個開發者擁有的是一個屬於他/她自己的、自帶獨立版本庫的工作區,因此這已經是一個不依賴於中央服務器的、完整的版本控制系統了。開發者們可以通過交換各自版本庫中的提交來實現項目合作。下面我們就來做個試驗,先創建一個新的工作區,以便我們模擬第二位開發者的活動。

1.3.1 克隆版本庫

我們的這位新開發者首先要有一個屬於他/她自己的版本庫副本(也稱為克隆體)。該副本中包含了所有的原始信息與整個項目的歷史信息。下面。我們用clone命令來創建一個克隆體。

> git clone /projects/first-steps /projects/first-steps-clone
Cloning into first-steps-clone...
done.

現在,該項目結構如圖1.4所示。


程序員如何輕鬆入門Git?讀完這一篇,獨立創建自己的第一個項目


圖1.4 樣例項目與它的克隆體

1.3.2 從另一版本庫中獲取修改

下面,我們來修改一下first-steps/foo.txt文件,並執行以下操作來創建一次新提交。

> cd /projects/first-steps 
> git add foo.txt
> git commit --message "A change in the original."

現在,新的提交已經被存入了我們原來的first-steps版本庫中,但其克隆版本庫(first-stepsclone)中依然缺失這次提交。為了讓你更好地理解這一情況,我們來看一下first-steps的日誌。

> git log --oneline 
a662055 A change in the original.
7ac0f38 Some changes.
2f43cd0 Sample project imported.

在接下來的步驟中,我們再來修改克隆版本庫中的first-steps-clone/bar.html文件,並執行以下操作。

> cd /projects/first-steps-clone 
> git add bar.html
> git commit --message "A change in the clone."
> git log --oneline
1fcc06a A change in the clone.
7ac0f38 Some changes.
2f43cd0 Sample project imported.

現在,我們在兩個版本庫中各做了一次新的提交。接下來,我們要用pull命令將原版本庫中的新提交傳遞給它的克隆體。由於之前我們在創建克隆版本庫時,原版本庫的路徑就已經被存儲在了它的克隆體中,因此pull命令知道該從哪裡去取回新的提交。

> cd /projects/first-steps-clone 
> git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /projects/first-steps
7ac0f38..a662055 master -> origin/master
Merge made by recursive.
foo.txt | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

如上所示,pull命令從原版本庫中取回了新的修改,將它們與克隆體中的本地修改進行了對比,並在工作區中合併了兩邊的修改,創建了一次新的提交。這個過程就是所謂的合併(merge)。

請注意!合併過程在某些情況下可能會帶來衝突。一旦遇到了這種情況,Git中就不能進行自動化的版本合併了。在這種情況下,我們就必須要手動清理一些文件,然後再確認要提交哪些修改。

在拉回(pull)、合併(merge)的過程完成之後,我們可以用一個新的log命令來查看結果。這次是日誌的圖形化版本。

> git log --graph 
9e7d7b9 Merge branch ’master’ of /projects/first-steps
*
|\
| * a662055 A change in the original.
* | 1fcc06a A change in the clone.
|/
* 7ac0f38 Some changes.
* 2f43cd0 Sample project imported.

這一次,歷史記錄不再是一條直線了。在上面的日誌中,我們可以很清晰地看到並行開發的過程(即中間的兩次提交),以及之後用於合併分支的那次合併提交(即頂部的那次提交)。

2.3.3 從任意版本庫中取回修改

在沒有參數的情況下,pull命令只在克隆版本庫中能發揮作用,因為只有該克隆體中有默認的原版本庫的連接。當我們執行pull操作時,也可以用參數來指定任意版本庫的路徑,以便從某一特定開發分支中提取相關修改。

現在,讓我們將克隆體中的修改pull到原版本庫中吧。

> cd /projects/first-steps 
> git pull /projects/first-steps-clone master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
From /projects/first-steps-clone
* branch master → FETCH_HEAD
Updating a662055..9e7d7b9
Fast-forward
bar.html | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

2.3.4 創建共享版本庫

除了可以用pull命令從其他版本庫中取回相關提交外,我們也可以用push命令將提交傳送給其他版本庫。只不過,push命令只適用於那些沒有開發者在上面開展具體工作的版本庫。最好的方法就是創建一個不帶工作區的版本庫,我們稱之為裸版本庫(bare repository)。你可以使用clone命令的--bare選項來創建一個裸版本庫。裸版本庫通常可被用來充當開發者們傳遞提交(使用push命令)的匯聚點,以便其他人可以從中拉回他們所做的修改。下面我們來看一個裸版本庫(見圖1.5)。


程序員如何輕鬆入門Git?讀完這一篇,獨立創建自己的第一個項目


圖1.5 裸版本庫(一個沒有工作區的版本庫)

> git clone --bare /projects/first-steps 
/projects/first-steps-bare.git
Cloning into bare repository first-steps-bare.git...
done.

1.3.5 用push命令上載修改

為了演示push命令的使用,我們需要再次修改一下firststeps/foo.txt文件,並執行以下操作來創建一次新的提交。

> cd /projects/first-steps 
> git add foo.txt
> git commit --message "More changes in the original."

接下來,我們就可以用push命令向共享版本庫傳送該提交了(見圖2.6)。該指令的參數要求與pull命令相同,我們需要指定目標版本庫的路徑及其分支。

> git push /projects/first-steps-bare.git master 
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 293 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /projects/first-steps-bare.git/
9e7d7b9..7e7e589 master -> master


程序員如何輕鬆入門Git?讀完這一篇,獨立創建自己的第一個項目


圖1.6 經由共享版本庫來進行版本共享

1.3.6 Pull命令:取回修改

現在,為了讓克隆版本庫也得到相應的修改,我們需要在執行pull命令時配置參數指向共享版本庫的路徑參數。

> cd /projects/first-steps-clone 
> git pull /projects/first-steps-bare.git master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../first-steps-bare
* branch master -> FETCH_HEAD
Updating 9e7d7b9..7e7e589
Fast-forward
foo.txt | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

請注意!如果另一個開發者在我們之前已經做過一次push操作,此次push命令就會被拒絕傳送提交。這時候,我們必須要先做一次pull操作,將其他人新上載的更新取回,並在本地合併。

小結

  • 工作區與版本庫:工作區是一個包含.git子目錄(內含版本庫)中的目錄。我們可以用init命令在當前目錄中創建版本庫。
  • 版本提交:一次版本提交通常定義了版本庫中所有文件的一個版本,它詳細說明了該版本是由何人在何時何地創建的。當然,我們需要用add命令來確定哪些文件將被納入下一次提交,然後再用commit命令創建新的版本提交。
  • 查看信息:通過status命令,我們可以查看哪些文件已被本地修改,以及哪些修改將被納入下次提交。另外,log命令可用來顯示提交歷史。diff命令可用來顯示兩個版本文件之間的差異。
  • 克隆:對於用clone命令創建某一個版本庫的副本,我們稱之為該版本庫的克隆體。在一般情況下,每個開發者都會擁有整個項目版本庫的完整克隆體,他/她的工作區中將會包含完整的項目歷史。這使他們可以各自獨立開展工作,無需連接服務器。
  • 推送與拉回:pushpull命令可用於在本地和遠程版本庫之間共享版本提交。

相關推薦

推薦中...