git fetch和git pull的区别_Git实战(实验楼)学习笔记 实验2 基本用法(下)
一、實驗介紹
本節實驗為 Git 入門第二個實驗,繼續練習最常用的 Git 命令。
知識點
- 對比差異
- 分布式的工作流程
- Git 標簽
實驗環境
實驗環境為 Ubuntu Linux 命令行環境,需要了解基本的 Linux 操作,如果沒有使用過 Linux 的同學,推薦先學習 Linux 基礎入門 前三個實驗。
實驗準備
在進行該實驗之前,可以先 clone 一個練習項目 gitproject :
本節中的實驗操作都是在該項目中完成。
二、比較內容
下面將學習如何比較提交,分支等內容。
2.1 比較提交 git diff
現在我們對項目做些修改:
使用 git status 查看當前修改的狀態:
可以看到一個文件修改了,另外一個文件添加了。如何查看修改的文件內容呢,那就需要使用 git diff 命令。git diff 命令的作用是比較修改的或提交的文件內容。
上面的命令執行后需要使用 q 退出。命令輸出當前工作目錄中修改的內容,并不包含新加文件,請注意這些內容還沒有添加到本地緩存區。
將修改內容添加到本地緩存區,通配符可以把當前目錄下所有修改的新增的文件都自動添加:
再執行 git diff 會發現沒有任何內容輸出,說明當前目錄的修改都被添加到了緩存區,如何查看緩存區內與上次提交之間的差別呢?需要使用 --cached 參數:
可以看到輸出中已經包含了新加文件的內容,因為 file1 已經添加到了緩存區。
最后我們提交代碼:
提交后 git diff 與 git diff --cached 都不會有任何輸出了。
2.2 比較分支
可以用 git diff 來比較項目中任意兩個分支的差異。
我們首先創建一個新的分支 test,并在該分支上提交一些修改:
然后,我們查看 test 分支和 master 之間的差別:
git diff 是一個難以置信的有用的工具,可以找出你項目上任意兩個提交點間的差異。可以使用 git help diff 詳細查看其他參數和功能。
2.3 更多的比較選項
如果你要查看當前的工作目錄與另外一個分支的差別,你可以用下面的命令執行:
你也以加上路徑限定符,來只比較某一個文件或目錄:
上面這條命令會顯示你當前工作目錄下的 file1 與 test 分支之間的差別。
--stat 參數可以統計一下有哪些文件被改動,有多少行被改動:
三、分布式的工作流程
下面我們學習 Git 的分布式工作流程。
3.1分布式的工作流程
你目前的項目在 /home/shiyanlou/gitproject 目錄下,這是我們的 Git 倉庫(repository),另一個用戶也想與你協作開發。他的工作目錄在這臺機器上,如何讓他提交代碼到你的 Git 倉庫呢?
首先,我們假設另一個用戶也用 shiyanlou 用戶登錄,只是工作在不同的目錄下開發代碼,實際工作中不太可能發生,大部分情況都是多個用戶,這個假設只是為了讓實驗簡化。
該用戶需要從 Git 倉庫進行克隆:
這就建了一個新的 "myrepo" 的目錄,這個目錄里包含了一份gitproject倉庫的克隆。這份克隆和原始的項目一模一樣,并且擁有原始項目的歷史記錄。
在 myrepo 做了一些修改并且提交:
myrepo 修改完成后,如果我們想合并這份修改到 gitproject 的 git 倉庫該如何做呢?
可以在倉庫 /home/shiyanlou/gitproject 中把myrepo的修改給拉 (pull)下來。執行下面幾條命令:
這就把 myrepo 的主分支合并到了 gitproject 的當前分支里了。
如果 gitproject 在 myrepo 修改文件內容的同時也做了修改的話,可能需要手工去修復沖突。
如果你要經常操作遠程分支(remote branch),你可以定義它們的縮寫:
git pull 命令等同于執行兩個操作: 先使用 git fetch 從遠程分支抓取最新的分支修改信息,然后使用 git merge 把修改合并進當前的分支。
gitproject 里可以用 git fetch 來執行 git pull 前半部分的工作, 但是這條命令并不會把抓下來的修改合并到當前分支里:
獲取后,我們可以通過 git log 查看遠程分支做的所有修改,由于我們已經合并了所有修改,所以不會有任何輸出:
當檢查完修改后,gitproject 可以把修改合并到它的主分支中:
如果我們在 myrepo 目錄下執行 git pull 會發生什么呢?
myrepo 會從克隆的位置拉取代碼并更新本地倉庫,就是把 gitproject 上的修改同步到本地:
因為 myrepo 是從 gitproject 倉庫克隆的,那么他就不需要指定 gitproject 倉庫的地 址。因為 Git 把 gitproject 倉庫的地址存儲到 myrepo 的配置文件中,這個地址就是在 git pull 時默認使用的遠程倉庫
如果 myrepo 和 gitproject 在不同的主機上,可以通過 ssh 協議來執行 clone 和pull 操作:
這個命令會提示你輸入 shiyanlou 用戶的密碼,用戶密碼隨機,可以點擊實驗操作界面右側工具欄的 SSH直連 按鈕查看。
3.2 公共git倉庫
開發過程中,通常大家都會使用一個公共的倉庫,并 clone 到自己的開發環境中,完成一個階段的代碼后可以告訴目標倉庫的維護者來 pull 自己的代碼。
如果你和維護者都在同一臺機器上有帳號,那么你們可以互相從對 方的倉庫目錄里直接拉所作的修改,git 命令里的倉庫地址也可以是本地的某個目錄名:
也可以是一個ssh地址:
3.3 將修改推到一個公共倉庫
通過 http 或是 git 協議,其它維護者可以通過遠程訪問的方式抓取(fetch)你最近的修改,但是他們沒有寫權限。如何將本地私有倉庫的最近修改主動上傳到公共倉庫中呢?
最簡單的辦法就是用 git push 命令,推送本地的修改到遠程 Git 倉庫,執行下面的命令:
或者
git push 命令的目地倉庫可以是 ssh 或 http/https 協議訪問。
3.4 當推送代碼失敗時怎么辦
如果推送(push)結果不是快速向前 fast forward,可能會報像下面一樣的錯誤:
這種情況通常是因為沒有使用 git pull 獲取遠端倉庫的最新更新,在本地修改的同時,遠端倉庫已經變化了(其他協作者提交了代碼),此時應該先使用 git pull 合并最新的修改后再執行 git push:
四、git標簽
4.1 輕量級標簽
我們可以用 git tag 不帶任何參數創建一個標簽(tag)指定某個提交(commit):
這樣,我們可以用stable-1 作為提交 8c315325 的代稱。
前面這樣創建的是一個“輕量級標簽”。
如果你想為一個tag添加注釋,或是為它添加一個簽名, 那么我們就需要創建一個 "標簽對象"。
標簽對象
git tag 中使用 -a, -s 或是 -u三個參數中任意一個,都會創建一個標簽對象,并且需要一個標簽消息(tag message)來為 tag 添加注釋。 如果沒有 -m 或是 -F 這些參數,命令執行時會啟動一個編輯器來讓用戶輸入標簽消息。
當這樣的一條命令執行后,一個新的對象被添加到 Git 對象庫中,并且標簽引用就指向了一個標簽對象,而不是指向一個提交,這就是與輕量級標簽的區別。
下面是一個創建標簽對象的例子:
4.2 簽名的標簽
簽名標簽可以讓提交和標簽更加完整可信。如果你配有GPG key,那么你就很容易創建簽名的標簽。首先你要在你的 .git/config 或 ~/.gitconfig 里配好key。
下面是示例:
你也可以用命令行來配置:
現在你可以在創建標簽的時候使用 -s 參數來創建“簽名的標簽”:
如果沒有在配置文件中配 GPG key,你可以用 -u 參數直接指定。
五、小結
本節學習了下面知識點:
- git diff
- 分布式的工作流程
- git tag
課后練習
使用 [GitHub](https://github.com) 賬號,創建自己的倉庫并練習一遍本節所講的內容。
對于初學者,如果不想深入 git 強大的高級功能的話,學完這個實驗就可以開始上手開發了,后續實驗內容用到的比較少,并且理解難度大。如果仍然感興趣,建議使用一段時間 Git 后再仔細學習后續實驗,會有更好的收獲。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的git fetch和git pull的区别_Git实战(实验楼)学习笔记 实验2 基本用法(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python操作json数据_Pytho
- 下一篇: 没有与这些操作数【】匹配的运算符_[02