1. 程式人生 > >git fetch 、git pull、git merge 的理解

git fetch 、git pull、git merge 的理解

真正理解 git fetch, git pull  要講清楚git fetch,git pull,必須要附加講清楚git remote,git merge 、遠端repo, branch 、 commit-id 以及 FETCH_HEAD。 1. 【git remote】首先, git是一個分散式的結構,這意味著本地和遠端是一個相對的名稱。 本地的repo倉庫要與遠端的repo配合完成版本對應必須要有 git remote子命令,通過git remote add來添加當前本地倉庫的遠端repo, 有了這個動作本地的repo就知道了當遇到git push 的時候應該往哪裡提交程式碼 (git push 後不加引數的時候,預設就是git push origin 當前的分支名,比如對本地的master分支執行git push,其實就是git push origin master,當然,如果遠端倉庫沒有master這個分支的話,肯定會報錯)。 2. 【git branch】其次,git天生就是為了多版本分支管理而創造的,因此分支一說,不得不提, 分支就相當於是為了單獨記錄軟體的某一個釋出版本而存在的,既然git是分散式的,便有了本地分支和遠端分支一說,git branch 可以檢視本地分支, git branch -r  可以用來檢視遠端分支。 本地分支和遠端分支在git push 的時候可以隨意指定,交錯對應,只要不出現版本衝突即可。 3. 【git merge】再者,git的分散式結構也非常適合多人合作開發不同的功能模組,此時如果每個人都在其各自的分支上開發一個相對獨立的模組的話,在每次release製作時都需先將各成員的模組做一個合併操作,用於合併各成員的工作成果,完成整合。 此時需要的就是git merge. 4.【git push 和 commit-id】在每次本地工作完成後,都會做一個git commit 操作來儲存當前工作到本地的repo, 此時會產生一個commit-id,這是一個能唯一標識一個版本的序列號。 在使用git push後,這個序列號還會同步到遠端repo。 在理解了以上git要素之後,分析git fetch 和 git pull 就不再困難了。    首先,git fetch 有四種基本用法 1. git fetch            →→ 這將更新git remote 中所有的遠端repo 所包含分支的最新commit-id, 將其記錄到.git/FETCH_HEAD檔案中 2. git fetch remote_repo         →→ 這將更新名稱為remote_repo 的遠端repo上的所有branch的最新commit-id,將其記錄。  3. git fetch remote_repo remote_branch_name        →→ 這將這將更新名稱為remote_repo 的遠端repo上的分支: remote_branch_name 4. git fetch remote_repo remote_branch_name:local_branch_name       →→ 這將這將更新名稱為remote_repo 的遠端repo上的分支: remote_branch_name ,並在本地建立local_branch_name 本地分支儲存遠端分支的所有資料。   FETCH_HEAD: 是一個版本連結,記錄在本地的一個檔案中,指向著目前已經從遠端倉庫取下來的分支的末端版本。   git pull 的執行過程: git pull : 首先,基於本地的FETCH_HEAD記錄,比對本地的FETCH_HEAD記錄與遠端倉庫的版本號,然後git fetch 獲得當前指向的遠端分支的後續版本的資料,然後再利用git merge將其與本地的當前分支合併。 git pull 後不加引數的時候,跟git push 一樣,預設就是git pull origin 當前分支名,當然遠端倉庫沒有跟本地當前分支名一樣的分支的話,肯定會報錯。 本地master分支執行git pull的時候,其實就是git pull origin master。 拆解git pull 操作。 git pull操作其實是git fetch 與 git merge 兩個命令的集合。 git pull  等效於先執行 git fetch origin 當前分支名, 再執行 git merge FETCH_HEAD. 通過上述分析,可以知道,如果要合併程式碼就並不一定要用git merge命令了,也可以用git pull命名的,比如要把遠端origin倉庫的xx分支合併到本地的yy分支,可以有如下兩種做法。 第一種,傳統標準的做法: git fetch origin 目標分支名  // fetch到遠端倉庫目標分支的最新commit記錄到  ./git/FETCH_HEAD檔案中 git checkout 要被合併的分支名  // 切換到要合併的分支 git merge FETCH_HEAD  // 將目標分支最新的commit記錄合併到當前分支 舉例說明:將遠端origin倉庫的xx分支合併到本地的yy分支。 git fetch origin xx git checkout yy git merge FETCH_HEAD 完成。 第二種,直接使用pull命令,將遠端倉庫的目標分支合併到本地的分支: git pull <remoterepo_name> <branch_name>  舉例說明:將遠端origin倉庫的xx分支合併到本地的yy分支

git checkout yy

git pull origin xx 完成。

其實還有一種思路,在前面第一種,第二種方式的基礎上,可以這樣來思考。

是否可以先本地checkout遠端目標分支,或者本地已經有了,先pull更新下來,然後將本地的兩個分支進行merge不也可以嗎?

答案是肯定的。

舉個例子:

將遠端origin倉庫的xx分支合併到本地的yy分支。

git checkout xx

git pull   // 如果本地沒有xx分支的,這一步都可以不執行。

git checkout yy   // 切換到yy分支

git merge xx  //  將xx分支合併到yy分支  這一步可以加上 --no-ff 引數,即 git merge --no-ff