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