Git 和 GitHub:從入門到實踐2 Git 和 GitHub 基礎配置

weixin_34353714發表於2019-01-23

原文地址:https://www.ibm.com/developerworks/cn/opensource/os-cn-git-and-github-2/index.html

前言

在本系列的第一篇文章中著重介紹了 Git 的基礎特性。本文作為本系列的第二篇文章將介紹 Git 和 GitHub 的基礎配置,包括 Git 安裝、使用 Git 克隆 GitHub 上的程式碼庫、使用 Git 克隆遠端程式碼倉庫、Git 的基本配置和設定忽略提交規則。您在閱讀完本文將有能力完成本地 Git 環境的基礎配置,為接下來的 Git 日常使用做基礎。

GitHub 是一個程式碼託管平臺,如果開發者想要在本地進行開發工作,那麼就需要使用到 Git 的客戶端工具來連線到 GitHub,再克隆程式碼到本地。如果您是重度的 GUI 使用者,那麼有很多 GUI 客戶端可以選擇,在 Git 的官網就專門有個頁面列出了業內的 GUI 客戶端

但遺憾的是往往 GUI 客戶端只能提供 Git 部分的功能,如果想要享受到 Git 自底向上強大的功能,使用命令列的方式來操作 Git 是不二之選。建議無論您是否擅長使用命令列工作,都可以嘗試使用命令列方式來操作 Git。本文將只介紹如何從命令列來連線到 GitHub。

安裝 Git

使用命令列方式操作 Git 工具,需要本地安裝 Git。注意,這裡沒有使用 "Git 客戶端" 一詞,因為 Git 作為一個開源版本控制系統,本身既可以作為客戶端工具,也可以用於建立伺服器端程式碼庫,所以本質上 Git 作為工具來講沒有客戶端和伺服器端之分。

本地安裝 Git 十分簡單。

對於 Windows 使用者,可以下載 Git For Windows 工具。下載安裝成功之後,我們可以得到一個 Git Bash 工具,它是一個類 Linux Bash 工具。在該工具中我們可以直接執行 Git 相關命令。如圖 1 所示:

圖 1. Git Bash
71414-8fbb7bd4ddd34b12.png
image

點選檢視大圖

對於 Mac 和 Linux 使用者,只需通過對應的包管理工具安裝即可,如清單 1 所示:
清單 1. Mac 和 Linux 下安裝 Git

$ brew install git         # For Mac
$ apt-get install git      # For Ubuntu
# yum install git          # For RedHat EL, CentOS

使用 Git 克隆 GitHub 程式碼庫

安裝 Git 成功之後,我們就可以使用 Git 克隆 GitHub 上的程式碼庫,本節仍然以我的程式碼庫 repo-for-developerworks 為例。

GitHub 提供了兩種克隆方式:HTTPS 和 SSH。我們可以點選倉庫頁面上的 **Clone or download **按鈕來檢視用於克隆的連結,同時可以點選浮動框右上角的 Use SSH/Use HTTPS 換我們想要克隆的 link,如圖 2 和 圖 3 所示。注意,這裡只是切換檢視不同的連結,而不是設定程式碼庫不同的連結方式。

圖 2. 檢視 HTTPS 克隆連結
71414-363a4b5bc4090d80.png
image

點選檢視大圖

圖 3. 檢視 SSH 克隆連結
71414-df49141b06c7bf3b.png
image

點選檢視大圖

由此我們可以獲得兩個 URL:

  • HTTPS 連結:https://github.com/caozhi/repo-for-developerworks.git
  • SSH 連結:git@github.com:caozhi/repo-for-developerworks.git

使用 HTTPS 進行克隆

由於程式碼庫是開放的,因此使用 HTTPS 方式克隆時,無需 GitHub 使用者名稱密碼,如清單 2 所示:

清單 2. 使用 HTTPS 進行克隆
caozhi@ clone$ git clone https://github.com/caozhi/repo-for-developerworks.git
Cloning into 'repo-for-developerworks'...
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 14 (delta 3), reused 5 (delta 1), pack-reused 0
Unpacking objects: 100% (14/14), done.

順便提一下,進行 pull 和 fetch 操作時也無需使用者名稱密碼認證。因為 GitHub 的機制允許隨意免費下載任何公開的程式碼庫,如若要 push 程式碼需經過認證或者經過作者同意才可。當要進行 push 時,會出現提示要求輸入使用者名稱密碼,如清單 3 所示:
清單 3. HTTPS 方式下 push 程式碼

caozhi@ repo-for-developerworks$ echo change >> README.md   ## make some modification
caozhi@ repo-for-developerworks$ git add .
caozhi@ repo-for-developerworks$ git commit -m "changes"
[master d774ecf] changes
 1 file changed, 1 insertion(+)
caozhi@ repo-for-developerworks$ git push
Username for 'https://github.com': caozhi0321@gmail.com    ## Enter GitHub account name
Password for 'https://caozhi0321@gmail.com@github.com':   ## Enter Password
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 528 bytes | 528.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To https://github.com/caozhi/repo-for-developerworks.git
   075c130..d774ecf  master -> master

使用 SSH 進行克隆
使用 SSH 方式進行克隆,需要一步額外的配置 SSH-KEY 的操作。首先需要本地生成一個 SSH Key。我們可以藉助 ssh-keygen 工具生成一對 RSA 的祕鑰:私鑰 id_rsa 和公鑰 id_rsa.pub。生成的祕鑰檔案會預設放在 home 目錄下的 .ssh 目錄下,如圖 4 所示:

圖 4. 使用 ssh-keygen 生成 RSA 祕鑰
71414-d661d82aee2699bb.png
image

點選檢視大圖

先將 id_rsa.pub 公鑰檔案的內容複製到剪貼簿,如圖 5 所示,使用 cat id_rsa.pub 命令可以檢視公鑰內容,隨後將該公鑰匯入到 GitHub 裡的賬戶之下。

圖 5. 檢視 id_rsa.pub 公鑰檔案
71414-4be399c862e5e47e.png
image

點選檢視大圖

在 GitHub 頁面右上角的頭像裡點選展開一個下拉選單,點選 Settings 可以開啟個設定頁面,如圖 6 所示:

圖 6. 開啟 GitHub 設定
71414-4b9c763f68af2725.png
image

點選檢視大圖

開啟 **SSH and GPG keys **的配置頁面,點選右上角的 New SSH key 按鈕,如圖 7 所示:

圖 7. 開啟 SSH and GPG keys 的配置頁面
71414-0062406fdac85fac.png
image

點選檢視大圖

在開啟的頁面中先設定一個您想匯入的公鑰的名稱,再將前面複製的公鑰內容貼上到大文字框中,點選 Add SSH key 即可,如圖 8 所示:

圖 8. 輸入 Key 的名稱及其內容
71414-5143176619d5deea.png
image

頁面自動跳轉回 SSH and GPG keys 設定頁面,您可以看到在我的賬號下成功新增了一個 SSH Key,如圖 9 所示:

圖 9. 檢視已經新增的 Key
71414-63956f5dea65ec3c.png
image

點選檢視大圖

此時我們可以使用 SSH 的方式進行程式碼克隆,還可以使用 ssh -T 命令檢測是否配置成功, 如清單 4 和 5 所示:

清單 4. 使用 SSH 方式克隆
caozhi@ $ git clone git@github.com:caozhi/repo-for-developerworks.git
Cloning into 'repo-for-developerworks'...
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 20 (delta 5), reused 10 (delta 2), pack-reused 0
Receiving objects: 100% (20/20), done.
Resolving deltas: 100% (5/5), done.
清單 5. 檢測 SSH 是否配置成功
caozhi@bogon:~$ ssh -T git@github.com
Hi caozhi! You've successfully authenticated, but GitHub does not provide shell access.

使用 SSH 的方式進行克隆,將使得我們本地與 GitHub 之間建立了信任連線,也就意味著之後所有需要進行使用者認證的地方都不再需要顯式地使用者名稱密碼認證。例如 git push 會直接通過 SSH 進行認證。經驗表明,使用 SSH 的另一個好處是在網路環境較差的情況下,其穩定性要高於 HTTPS 連線。

至此,我們成功地使用 Git 命令列方式克隆了程式碼庫,之後就可以進行正常的日常開發。

使用 Git 克隆遠端倉庫

當一個開發者剛進入某一專案,一般來說他所要做的第一件事是克隆遠端倉庫到本地,以進行本地開發工作。遠端倉庫可以是來自於 GitHub 或者 GitLab 等程式碼託管服務,也可以是專案組自己所搭設的 Git 伺服器。無論是哪種遠端倉庫,都可以使用 git clone 命令 git clone <repository> [local_path] 將其從遠端克隆到本地。命令中間的 <repository> 根據遠端倉庫提供的連線方式不同,其形式可能不同,例如:

  • GitHub 的 HTTPS 連線:
    https://github.com/caozhi/repo-for-developerworks.git
  • GitHub 的 SSH 連線:
    git@github.com:caozhi/repo-for-developerworks.git
  • 自建倉庫的 SSH 連線:
    git_user@192.168.0.1:/usr/local/repo-for-developerworks.git

其中前兩種 GitHub 的連線方式,其倉庫的連線字串可以在 GitHub 的對應倉庫頁面中找到,如前圖 2圖 3所示。

第三種自建倉庫的 URL 一般需要提供遠端伺服器上的賬號、host 和路徑。以上面例子中的連線字串git_user@192.168.0.1:/usr/local/repo-for-developerworks.git 為例:

  • git_user 是伺服器上對程式碼庫目錄有訪問許可權的賬號。
  • 192.168.0.1 是遠端伺服器的 IP,也可以是主機名或者 URL。
  • /usr/local/repo-for-developerworks.git 是伺服器上程式碼庫的根目錄。

git clone 命令中的 local_path 指定了本地想要存放程式碼庫的地址。該引數是可選引數,如果不指定該引數就會在本地新建一個以遠端倉庫名為命名的目錄,然後以該目錄為程式碼庫根目錄。圖 10 展示了在空目錄 clone_demo 中執行不帶 local_path引數的 clone 命令:

圖 10. local_path 為空
71414-01f1cea644abbc4e.png
image

點選檢視大圖

從截圖可以看到,git clone 命令在 clone_demo 目錄中建立了一個 repo-for-developerworks 的程式碼庫目錄。

圖 11 展示了在目錄 clone_demo 中執行帶 local_path 引數的 clone 命令:

圖 11. local_path 引數為指定路徑
71414-ed1d0d5f68062f17.png
image

點選檢視大圖

從截圖可以看到,git clone 命令在 clone_demo 目錄中新建了一個我們指定的 local_dev-repo 目錄,並將其作為原生程式碼庫的根目錄。

圖 12 展示了在空目錄 clone_demo2 中執行 local_path 為當前目錄的 clone 命令:

圖 12. local_path 引數為當前目錄
71414-d1db7788f850cbfa.png
image

點選檢視大圖

我們知道一般作業系統將一個英文句點表示當前目錄,因此從截圖可以看出,當 local_path 指定為當前目錄時,git clone命令會直接將當前目錄作為原生程式碼庫的根目錄。

當然 Git 還提供其它的連線方式如 File、FTP。感興趣的讀者可以自己使用 Git 搭一個 Git 伺服器嘗試使用 File 和 FTP 方式進行連線。

預設情況下,git clone 會將遠端程式碼庫全部克隆到本地。Git 還支援只克隆特定分支到本地。我們可以使用 git clone -b**branchname** --single-branch git@URL local_path 命令, 如圖 13 所示:

圖 13. 克隆特定分支
71414-593ee8304b605e81.png
image

點選檢視大圖

Git 的基本配置

在克隆了程式碼庫之後,我們一般仍需要對 Git 做一些基本的配置才能使用 Git 進行日常工作。Git 配置的作用域主要有三種:System、Global 和 Local,分別對應的配置檔案地址為:

  • System:/etc/gitconfig。系統級別有效。
  • Global:home 目錄下的 ~/.gitconfig 檔案。使用者級別有效。
  • Local:程式碼庫目錄的 .git/config 檔案。程式碼庫級別有效。

另外我們也可以使用 git config --system -lgit config --global -lgit config --local -l 命令分別列出三個作用域下的配置。跟 Linux 作業系統的環境變數配置類似,Git 在執行命令中會首先檢視 local 配置,如果沒有找到所需配置會再檢視 global 配置,最後再檢視 system 配置。

在使用 git config 命令進行配置的時候,也可以使用 git config --systemgit config --globalgit config --local 三種不同的選項來修改不同作用域的配置。

下面介紹一些重要或有用的 Git 配置。

配置 user 資訊

配置 user 資訊在 Git 中是十分重要的一個步驟, username 和 email 不能為空,它們將會被記錄在每一條該 user 的 commit 資訊中,如圖 14 所示:

圖 14. 檢視 commit 的 user 資訊
71414-fa49188e5985bb8b.png
image

我們可以配置 user.nameuser.email 的值來配置 user 資訊,如清單 6 所示:

清單 6. 配置 user.name 和 user.email
git config --global user.name "caozhi"
git config --global user.email "caozhi0321@gmail.com"

也可以將上述命令中的 --global改成 --local來修改只對程式碼庫作用域有效的配置。

配置命令的別名
Git 提供了很多有用的命令,我們可以將一些比較常用的命令設定上別名,提高工作效率。例如我們可以將 git log --abbrev-commit 設定一個別名 lg,使得檢視 log 時只需要顯示 commit id 的短名稱,如: git config --global alias.lg "log --abbrev-commit"

設定成功後就可以使用 git lg 來檢視 commit 日誌,如圖 15 所示:

圖 15. 短名稱的日誌
71414-fb2eba79af6f3d71.png
image

點選檢視大圖

當然還可以設定一些其它的別名,如清單 7 所示:

清單 7. 配置 st 和 cm 別名
git config --global alias.st "status"
git config --global alias.cm "commit"

別名可以根據自己的喜好和習慣去設定。將常用的命令設為短別名將大大提高工作效率。

檢視配置

配置成功後可以使用 git config --global -l 命令檢視配置,如圖 16 所示:

圖 16. 檢視配置
71414-12dd3b3b603e5fb1.png
image

點選檢視大圖

使用 Config 檔案進行配置

除了使用命令之外,也可以直接編輯 config 檔案進行相關配置,如圖 17 所示:

圖 17. ~/.gitconfig 檔案裡的配置
71414-84715d6b24cc170b.png
image

設定 Git 忽略提交規則

在進行完程式碼庫克隆和簡單的配置之後,接下來我們可以根據專案需要配置一些檔案忽略規則。跟大多數的程式碼庫管理工具一樣,Git 也可以對不需要被程式碼庫所管理的檔案或檔案型別進行配置,使得提交程式碼時,這些檔案不會被提交到程式碼庫中。Git 是通過忽略清單.gitignore 檔案進行配置的。

通常我們會考慮將如下型別的檔案新增到忽略清單中:

  • 編譯過程的中間檔案,例如 *.class 檔案、*.o 檔案、*.obj 檔案等。
  • 外部依賴的包或者工程編譯的包,例如 jar 包、lib 包、dll 包或 war 包等。在有的專案實踐中,可能會將這類依賴包也放到程式碼庫中進行管理,通常這不是一個很好的策略,因為這樣會顯著地增加程式碼庫的大小,降低開發者的工作效率。比較合理的方式是通過構建工具的依賴管理功能來管理這些依賴包,例如 Maven、Gradle 等。
  • 編譯過程中,通過某種機制自動生成的程式碼。某些專案中,可能會使用指令碼或者 xsd schema 檔案來生成程式碼;這類程式碼只需要將用於自動生成的指令碼或者 schema 檔案管理起來即可。
  • 專案的配置檔案。同一專案組的不同開發者可能有不同的專案配置,或者配置中包含敏感資訊,例如賬號密碼等,這類配置檔案也應該放到 ignore 清單裡。
  • 某些 IDE 的工程配置檔案,例如 Eclipse 的 settingproject 檔案、Idea 的 .idea 目錄等。
  • 一些自動生成的系統檔案,例如 Windows 的 Thumbs.db 或者 MacOS 的.DS_Store 檔案等。
  • 專案或者 IDE 的日誌檔案。

.gitignore 檔案每行表示一個匹配模式(# 開頭的行或者空行除外,# 用於註釋)。它使用 glob 模式來進行匹配,glob 模式是一種簡化的正規表示式,常用於來進行路徑的模式匹配。我們可以在程式碼庫的根目錄或者任意子目錄新增.gitignore 檔案,特定目錄下的.gitignore 檔案使得忽略規則只在該目錄及其子目錄下有效。表 1 列出了常用的一些匹配模式的寫法:

表 1. 常用匹配模式
模式 含義 示例
完整路徑 忽略完整路徑所定義的檔案 dev/dev.conf
/path 以 / 開頭,只匹配當前目錄下路徑為 path 的檔案 `/a.java
/a.cpp`
path 不以 / 開頭,匹配當前目錄及其子目錄下所有檔案 `*.o
web.xml`
path/ 以 / 結尾,用以只匹配目錄;path 目錄及其子目錄和檔案會被忽略;如果 path 是個檔案,則不會被忽略 .settings/
帶 * 號的模式 置於檔案中,用於匹配所有滿足規則的檔案 `*.zip
*.jar`
帶 ** 的模式 置於路徑中,用於匹配滿足 ** 前後的所有路徑 `Dev/**/dev.conf
*/.jar`
!path 在 ignore 檔案中如果前面已經定義了某個模式,但是又有一些特殊檔案我們不想被忽略,我們可以用 ! 來匹配 *.jar ## 忽略所有 jar 包 !server.jar ## 希望server.jar 仍被跟蹤

注意:

  • 當某個檔案已經被提交到程式碼庫中被 Git 所管理起來之後,將該檔案再新增進 .gitignore 檔案是無效的,對該檔案進行修改時,執行 git status 操作之後仍然會提示該檔案已被修改。針對已經提交程式碼庫的檔案我們又想忽略其修改的場景,將會在本系列第四篇文章中介紹。
  • 每個目錄下都可以放單獨的 .gitignore 檔案以控制子目錄的忽略規則。
  • 即使已經在忽略列表裡,當我們確實想要提交一些符合忽略規則的檔案時,仍可以使用 git -f add 加具體的檔案路徑的方式將這些檔案提交到庫中。如圖 18 所示:
圖 18. 強制新增被忽略的檔案
71414-9d9e0ed5a39de51c.png
image

點選檢視大圖

結束語

為使用 Git 和 GitHub 進行日常開發做準備,本文詳細通過一些列演示向讀者講解了如何採用 SSH 和 HTTPS 兩種方式從 GitHub 克隆程式碼庫,如何進行本地 Git 開發環境的基礎配置,如何配置 .gitignore 檔案等。相信您在閱讀完本文之後將有能力自己初始化一套本地的 Git 環境。

參考資源

相關文章