git-分支的新建與合併
git-分支的新建與合併
2016年11月02日 22:53:26 YY-Captain 閱讀數:9368 標籤: gitgithub 更多
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 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
- 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引數推送失敗的話,可以使用此引數