程序項目的分支
開發(fā)程序項目過程中育叁,我們可能需要從原來的程序項目中分出另一個項目來修改迅脐,這個操作成為branch。
在Git文檔庫中創(chuàng)建分支需要使用"git branch"指令
在切換分支的時候豪嗽,Git會先對比文檔庫中當前分支的文件內(nèi)容是否和將要切換過去的分支文件相同谴蔑。針對不同文件,Git需要從文檔庫中取出該文件龟梦,這是為了讓文件夾中的文件符合分支原來的狀態(tài)隐锭。但是為了避免數(shù)據(jù)意識,當Git要覆蓋文件夾中的文件時计贰,會檢測該文件的內(nèi)容是否已經(jīng)加入文檔庫钦睡。如果還沒有加入,Git會顯示警告信息躁倒,并且停止執(zhí)行荞怒,以免資料遺失 。如果確定不想保留這些已經(jīng)修改秧秉,卻還沒有加入文檔庫的文件褐桌,可以換成執(zhí)行"git checkout -f+分支名",Git就會強制覆蓋修改后的文件象迎。
除了被tracked的文件以外荧嵌,對于untracked和ignored的文件,Git都不會進行任何處理砾淌。
補充說明:雖然Git切換分支之后完丽,會‘盡可能’讓文件夾中的文件恢復成原來該分支的狀態(tài),但是并不能保證一模一樣拇舀。例如當前分支和即將切換過去的分支都有文件A,而且內(nèi)容完全一樣蜻底。但是我們再當前的分支中修改了文件A骄崩,卻沒有commit聘鳞。這時候切換分支的時候,Git對比文檔庫中兩個分支的文件A是相同的要拂,所以不會從文檔庫中取出文件A抠璃,結(jié)果切換分支之后,文件A就不會回到原來的狀態(tài)脱惰。這種錯誤的起因有一部分是操作上的瑕疵搏嗡,因為在一班情況下,在切換分支之前拉一,會先把最新的文件內(nèi)容存入文檔庫采盒,這樣就不會發(fā)生這樣的問題。所以在切換分支之前要先status檢查一下是否一致蔚润。如果不一致磅氨,就需要做適當?shù)奶幚恚蛘咧苯訄?zhí)行“git checkout .”用文檔庫中的文件覆蓋文件夾中的文件嫡纠。
合并程序項目的分支
在大多數(shù)情況下烦租,程序項目的分支都會被合并到主要的分支。除非想要將該分支獨立出來除盏,成為另一個項目叉橱。合并分支需要使用"git merge"指令,格式如下:
git merge <branch-name>
這個指令會把指定的分支者蠕,合并到當前工作中的分支窃祝。
假如我們需要合并分支A和分支B,執(zhí)行以下指令蠢棱。
git checkout A
git merge B
如果換成
git checkout B
git merge A
兩者的區(qū)別是什么呢锌杀?假設我們有branch-1和branch-2兩個分支
我們切換到branch-1再合并branch-2
我們可以看見,最后的時間節(jié)點為branch-1的泻仙。
接下來糕再,我們回滾到未合并之前,
git reset --hard HEAD^
切換到branch-2玉转,再合并branch-1突想。
用merge合并的方法,我們現(xiàn)在只有兩個分支看起來就比較復雜了究抓,如果分支更多猾担,我們可能很難看懂。我們需要更簡潔的合并方法'git rabase'刺下。
git rebase //命令在另一個分支基礎之上重新應用绑嘹,用于把一個分支的修改合并到當前分支。
那么我們重新把branch-2應用到branch-1中:
git rebase branch-2
這樣的結(jié)構(gòu)看起起來是不是清晰了很多
解決合并沖突
在我們工作的時候橘茉,如果兩個人共同做一個項目就有可能發(fā)生沖突工腋,什么時候會發(fā)生沖突呢姨丈?我們還以上面的分支為例,我會盡可能用大家熟悉的例子來講解擅腰。
現(xiàn)在我們已經(jīng)把branch-2合并到branch-1中了蟋恬,那么我們的branch-1跟branch-2中都有“branch-2.txt”文件,我們同時修改這個文件趁冈;
好了歼争,我們開始在branch-1中合并branch-2
我們的沖突出現(xiàn)了渗勘,并且在branch-2.txt中沐绒,那么我們看一下呀邢,branch-2.txt現(xiàn)在的樣子吧?
在HEAD那個區(qū)域是我們工作的分支价淌,在====下面的是我們將要合并的分支內(nèi)容,接下來我們需要對這段文字進行處理蝉衣,哪些使我們需要的括尸,不需要的我們刪掉病毡。假如我需要保存兩次修改:
然后再重新提交到遠程就ok了。
提示:
如果合并的過程中發(fā)生了沖突啦膜,我們想要放棄這次合并,可執(zhí)行“git merge --abort”指令僧家。Git文檔庫和文件夾中的文件內(nèi)容都會恢復到未執(zhí)行合并前的狀態(tài)雀摘。