Git命令_git branch、分支與沖突


git branch -a //查看所有分支(包括所有項目)

git branch -r //查看遠程項目的分支

git branch   //查看的是本地分支

git checkout [branch_name]   //切換到branch_name分支,也可以切到某個commit上

git checkout -b new_branch   //創建新分支new_branch,並切換到上面,后面再加參數用於指定基於哪個分支,不加的話默認基於當前分支;

git branch --set-upstream-to=origin/remote_branch your_branch  //本地創建一個新分支后,需要與已經存在的遠程分支進行關聯,這條命令是手動建立跟蹤關系

git merge branchname                                      //將branchname分支合並到當前分支;

git push origin --delete branch_name               //刪除遠程分支,origin是遠程某個倉庫地址的一個名稱,或者叫標簽,方便指向該遠程倉庫

git branch -d branch_name                              //刪除本地分支

 

綠色代表當前項目所在的分支,紅色就是遠程分支列表。

// *表示當前所處的分支,白色的是本地分支
// origin是指遠程的某個倉庫地址
/ /HEAD 遠程的HEAD,HEAD是指向當前commit的引用,默認情況下HEAD指向某個分支,而某個分支永遠指向該分支的最新的commit
// 每次提交一個新的commit時,都會從當前commit向前移動
// branch永遠指向當前分支地最新一次commit

 


關於新建一個遠程分支,新建本地分支,本地分支如何關聯遠程分支的方法: 

場景1:我想創建一個遠程分支

這里我試着創建了一個本地分支feature2,但遠程沒有該分支的同名分支origin/feature2

輸入git branch --set-upstream-to=origin/feature2  feature2之后出現如下hint;

1、首先,如果遠程存在一個分支是我們希望使用的,我們需要git fetch就可以了,ps:實際上此時遠程不存在feature2分支;

2、第二個方法可以使用git push -u 的方法把本地的這個新分支強推到遠程去,遠程也就有了一個一模一樣的分支了;

 

試着做一下第二個hint中的操作,之后再輸入git branch -a查看一下遠程分支列表,可以看到遠程確實多了一個分支;

 

 至此我們創建了一個本地分支的同時也創建了一個新的遠程分支,該遠程分支與新建的本地分支同名,並且二者建立的跟蹤關系,或者叫關聯關系。

 

 

場景2:如果已經有一個遠程分支存在,我想創建一個本地分支與該遠程分支建立跟蹤關系

方法1:

拉取遠程分支到本地分支git pull <遠程主機名> <遠程分支名>:<本地分支名>    例如:git pull origin master:wy

這樣的話可以新建一個本地之前不存在wy分支,是基於某個遠程分支的;但是這個分支跟該遠程分支沒有自動進行關聯(或者叫跟蹤關系),實際上新建了一個基於遠程分支的本地分支,但是沒有跟蹤關系,之后還需要手動設置跟蹤關系:git branch --set-upstream-to=<遠程主機名>/<遠程分支名> <本地分支名>。

這種方式的話,可以使得本地分支和遠程分支的名字不一定要一樣,比較靈活。

 

方法2:

git checkout -b  <新分支名> <遠程主機名/遠程分支名>

這條命令會本地新建一個本地分支是基於某個遠程分支,並且會自動建立跟蹤關系。

 

另外還可以這樣:

git checkout --track <遠程主機名/遠程分支名>

這會自動創建一個本地分支與遠程分支同名,且自動建立跟蹤關系。



有時候git clone遠程庫下來,會發現本地沒有分支;這時候要輸入git checkout -b <本地分支名> <遠程主機名/遠程分支名>

這樣會新建一個本地分支(-b參數的作用),該本地分支<本地分支名>基於 <遠程主機名/遠程分支名>且建立了跟蹤關系 ,並且把當前分支自動切到這個新建的本地分支上;

git branch -vv 可以查看本地分支與遠程分支的跟蹤關系;

有時候發現git clone命令是不會創建本地分支的;需要手動創建一個本地分支來跟蹤遠程分支;



 本地分支和遠程分支的跟蹤關系建立:

Git:本地分支和遠程分支建立追蹤關系的三種方式:https://blog.csdn.net/qq_42780289/article/details/97762596

跟蹤遠程分支:https://www.cnblogs.com/wuer888/p/7656730.html

 

主要的三種方法:

手動建立追蹤關系:git branch --set-upstream-to=<遠程主機名>/<遠程分支名> <本地分支名>

push時建立追蹤關系: git push -u <遠程主機名> <本地分支名>    加上-u參數,這樣push時,本地當前分支就和遠程主機的同名分支建立追蹤關系。

新建分支時建立跟蹤關系:git checkout -b <本地分支名> <遠程主機名>/<遠程分支名>,新分支指針指向 <遠程主機名>/<遠程分支名> 所指的位置。具體位置可用 git log --oneline --graph 查看。

 

查看追蹤關系:

GIT如何查看本地分支與遠程分支的關聯配置https://blog.csdn.net/kingjin_csdn_/article/details/93111111

主要的三條命令:

git branch -vv

git remote show origin

cat .git/config

 

Git 清理無效的遠程追蹤分支:https://www.jianshu.com/p/884ff6252be5

遠程版本庫創建了一個分支后,在本地可以使用git remote update 用於在本地創建遠程追蹤分支。

但是,如果在遠程版本庫上刪除了某一分支,該命令並不會刪除本地的遠程追蹤分支,

這時候,有另一個命令git remote prune

該命令可以刪除本地版本庫上那些失效的遠程追蹤分支,具體用法是,假如你的遠程版本庫名是 origin,則使用如下命令先查看哪些分支需要清理:

git remote prune origin --dry-run

再輸入:

git remote prune origin

就可以刪除無效的本地跟蹤遠程分支了。

 

甚至命令可以結合起來使用:

git remote update origin --prune

git remote update origin -p

 


分支產生的背景和意義:

舉個例子,准備開發一個新功能,需要兩周時間,如果活還沒干完,不完整的代碼庫會導致別人沒法干活;如果一次性全部寫完再一次提交,又存在丟失每天進度的風險;

現在有了分支,就不用怕了,先創建一個分支,別人看不到,還可以在原來分支上正常工作;而你再自己的分支上干活,想提交就提交;

當自己完成了開發,就可以一次性合並到原來的分支上,又安全又不影響別人工作;

 

分支的原理(參考廖雪峰的Git教程):

  每一次提交,Git都把他們串成一條時間線

  HEAD 指向當前分支;

  master 指向提交;master是主分支,每次提交,master分支都會向前移動一步,這樣,隨着你不斷提交,master分支的線會越來越長;

  創建一個新的分支,例如dev,即增加了一個dev指針,修改HEAD的指向,指向dev。即完成分支的創建,工作區文件沒有任何變化;

  在dev上的工作結束之后,就可以把dev和master合並,最簡單的方法,直接把master指向dev的當前提交,就完成了合並,HEAD指向master;

  合並完分支后,甚至可以直接刪除dev分支。刪除分支dev就是把dev指針給刪掉,這樣就剩下了一條master分支;

 

分支管理策略:

master分支應該是十分穩定的,僅用來發布新版本;

dev分支是不穩定的用來干活的;

多人合作時,每個人都再dev分支上干活,每個人都有自己的分支,是不是往dev分支上合並即可;

 

分支管理和分支的意義:
一般主分支是用來發布版本的;
本地拉一些子分支,是不穩定的分支,是用來干活添加新功能的;
然后功能添加完成之后,合並到主分支當中;
如果這個因為新功能而拉的子分支只有你一個人開發,那么用本地的分支即可
如果這個子分支有很多人一起開發,那么就要推送到遠程,大家一起開發
創建遠程分支(本地分支push到遠程):$ git push origin [name]

 

分支切換:
未commit的內容:緩存區/工作區
如果你切換分支的話,沒有commit的內容不受切換分支影響的;
但是commit的內容是收到切換分支影響會發生改變。
只會顯示當前分支commit的內容,而不會顯示切換那個分支commit的內容;

 


談談merge:
master分支,feature1分支;
當前在master分支上,merge feature1分支;
那么master分支上會有兩個分支的內容;但是feature1分支依然存在;
合並到哪個分支,這個分支有兩個分支所有的內容。另外一個分支不變;
合並分支只是把當前分支和合並過來的的分支里面的不一樣的內容合並過來。
但是當前分支本來和被合並的分支不一樣的內容還會存在。

 

merge沖突:
開新分支,合並該新分支時出現merge沖突了;
那就手動修改沖突的文件和位置;重新merge;
出現沖突:解決沖突就是把Git合並失敗的文件手動編輯為我們希望的內容,再提交。

 

還有一種merge沖突,遠程分支發生了commit,本地也commit。但是修改的是同一行;
這樣再fetch+merge或者pull的時候就會發生沖突;或者直接push的話也會發生沖突;
反正都是merge沖突;
而且解決這個沖突之后,git log --graph上面會有分叉很難看;
如何做到沒有分叉?//使用rebase

 

push沖突://遠程分支發生了更新,本地分支提交前要保證是最新的才行;所以本地要先更新再push才行;甚至更新時會發生沖突,就是上面這個情況;
推送前要fetch+merge一下;//但是每次merge會產生一個分叉,在本地倉庫的日志里;
然后再push;

 

本地在新分支上開發代碼,如果多次commit的話,以后合並進主分支時會有很多次commit,很難看而且不方便查閱;
這就可以嘗試在合並分支時,將要被合並的分支中的多個commit合並成一個commit使用-amend參數

 

Git 分支管理&查看歷史&標簽:https://www.jianshu.com/p/97f94e94418e



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM