1. 程式人生 > >git-分支的新建與合併

git-分支的新建與合併

git-分支的新建與合併

2016年11月02日 22:53:26 YY-Captain 閱讀數:9368 標籤: gitgithub 更多

個人分類: linuxGitHub

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/makenothing/article/details/53014308

0 準備

0.0 倉庫

github 
gitlab

無論是github,還是gitlab 都是儲存程式碼的倉庫,可以在上面儲存、管理程式碼。

0.1 管理工具

git

git是基本的管理工具,在windows、linux、Mac等系統上都有對應的客戶端。

0.2 git的原理

此處不贅述,可以參考之前的文章: 
git原理與使用指南 
git設定與使用

1 分支的新建與提交

因為這部分屬於基本的操作,此處不做贅述,僅僅列出做常用的幾條命令,權當是為了以後查詢方便。

1.1 本地分支新建

git branch new_task_A //新建分支
git checkout new_task_A //轉到該分支

當然上面兩條命令通常用一條命令代替

git checkout -b new_task_A  //新建並轉到該分支

1.2 本地分支提交

我們在新分支上進行工作,修改了程式碼,或者增加了些許檔案,需要提交到本地儲存起來。

git add . // .表示當前目錄所有檔案,或者可以指定某一檔案,如下
//git add index.html 提交某一檔案
//git add -a 所有的更改操作--新建,更改,刪除;
//git add . 只包括 新建 ,修改操作;無刪除;
//git add -u 只包括修改,刪除操作,無新建
// 然後就是 commit 
git commit -m "do something " //這樣就提交到本地倉庫了

然後,接下來,如果我們修改的沒什麼錯誤,就會合併到master 分支上。

git checkout master //首先轉到master分支
git merge new_task_A //合併到master分支

常見問題: 
git merge 的時候,如果沒有衝突,就會很順利,有衝突的話,就要做額外的一些工作,一般會提示:

Unmerged paths:
.....

修改分支名稱

git branch -m old_name new_name

這時候,需要手動解決衝突,然後對解決衝突的檔案執行 git add命令。

1.3 提交分支到遠端

如果,我們希望自己在本地新建的分支能夠在遠端伺服器上顯示,以new_task_A為例,可以這樣

git push origin new_task_A

1.4 刪除分支

1.4.1 刪除本地分支

bug 修復完成,提交了版本,新分支 new_task_A 已經不需要的時候,可以刪掉了

git branch -d new_task_A

1.4.2 刪除遠端分支

git push origin --delete new_task_A

常見問題:一般是許可權問題,或者安全問題。請確認自己有足夠的許可權執行git push.

1.5 獲取遠端倉庫

1.5.1 強制覆蓋本地倉庫

清除本地修改
git reset --hard
拉取遠端分支
git pull origin master
強制拉取上游upstream 到本地
git remote add upstream https://XXXXX/A.git //設定上游upstream ,也就是本地的fork源倉庫
git fetch upstream   //拉取upstream的程式碼A,就會出現upstream/master 分支
git reset --hard upstream/master //強制使用upstream/maste 覆蓋本地分支

1.5.2 git pull 與 git fetch

Git中從遠端的分支獲取最新的版本到本地有兩種方法:git pull 與git fetch 
1. git fetch:相當於是從遠端獲取最新版本到本地,不會自動merge

git fetch origin master //下載最新的版本到origin/master分支上
git log -p master..origin/master // 比較本地的master分支和origin/master分支的差別
git merge origin/master //最後進行合併

上述過程其實可以用以下更清晰的方式來進行:

git fetch origin master:tmp
git diff tmp 
git merge tmp
  1. git pull:相當於是從遠端獲取最新版本並merge到本地
 git pull origin master

上述命令其實相當於git fetch 和 git merge,git fetch更安全一些,可以在merge前,我們可以檢視更新情況,然後再決定是否合併。

1.6 merge 不同fork的版本

1.6.1 將兩個不同fork分支合併

情景:B與C都從A【upstream】fork而來。B與C都對A做了修改,現在要你對B C的修改,都合併到A中。

A---fork--->B
A---fork--->C

當然,方法有很多種,可以先把B合併到A,然後再把C合併到 A,就OK了。 
這裡有個情況是,你不是B或者C的直接管理者,而只是第三者,僅有git clone程式碼的許可權。這樣的話,你就不能在B或者C的github倉庫裡執行merge request。此時,選擇現在本地對兩者進行合併。

可以知道,A是B或者C的upstream,我們可以先把B的程式碼clone到本地,然後將A的程式碼clone到同一本地倉庫中。

git clone https://XXXXX/B.git //git clone
cd B
git checkout master //checkout到需要合併的分支,比如master
git remote add upstream https://XXXXX/A.git //設定upstream
git fetch upstream   //拉取upstream的程式碼A,就會出現upstream/master 分支,以及upstream的其他分支(如果有的話)
git branch -va   //k可以看一下當前倉庫的所有程式碼分支,包括B以及A的所有分支
git checkout master //切換到需要合併的分支B的master
git merge upstream/master //合併到A的master ,Done !
  •  

此時,解決衝突,就可以獲得兩個不同fork分支的合併版本。

//解決衝突
git merge --no-ff upstream/master //合併到A的master 可以先使用--no-ff引數
Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.
git status                      //然後檢視衝突位置
# On branch master-branch-1
# Changes to be committed:
#
#   modified:   conf/custom/vhost/baidu.conf
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      baidu-detect.conf   //此處是需要解決衝突的檔案
#
vim baidu-detect.conf       //開啟檔案檢視衝突位置,一般使用<<<< ===== >>>> 標記
git add baidu-detect.conf   // 修改完成後。add commit push 
git commit -m "fix merge problem"
git push -f origin master-branch-1  // -f 引數是強制將修改推送到master-branch-1,如果沒有-f引數推送失敗的話,可以使用此引數 

建議參考:分支的新建與合併 
github merge不同fork的程式碼 
fork merge