Git: 更新分支+解衝突 - Summer。桑莫。夏天
文章推薦指數: 80 %
修改好有衝突的檔案後,將變更標記為已解決,然後繼續Rebase 的操作,讓Git ... git merge Auto-merging hello_world.html CONFLICT (content): Merge ...
Summer。
桑莫。
夏天
前端工程師,喜歡蒐集明信片、設計簡單的小物、旅遊和看電影。
這裡紀錄了我的學習和開發筆記,歡迎交流(*´∀`)~♥
關於我、所有文章和標籤列表
關於我
所有文章
標籤列表
©2022.Allrightsreserved.
Git:更新分支+解衝突
27May2018
git
gitrebase
gitmerge
Sourcetree
事情是這樣的…
A、B兩位工程師皆修改同一隻檔案hello_world.html的同一行程式碼。
Step1:A新增一個檔案hello_world.html,並加入一些文字段落後提交(Commit)、推至遠端。
Step2:B更新本地倉儲,修改hello_world.htmlline#2後提交、推至遠端。
Step3:A修改hello_world.htmlline#2後提交,在推至遠端時出現以下訊息…
$gitpushoriginmaster
Togithub.com:cythilya/git_test.git
![rejected]master->master(fetchfirst)
error:failedtopushsomerefsto'[email protected]:cythilya/git_test.git'
hint:Updateswererejectedbecausetheremotecontainsworkthatyoudo
hint:nothavelocally.Thisisusuallycausedbyanotherrepositorypushing
hint:tothesameref.Youmaywanttofirstintegratetheremotechanges
hint:(e.g.,'gitpull...')beforepushingagain.
hint:Seethe'Noteaboutfast-forwards'in'gitpush--help'fordetails.
來看SourceTree的線圖,這表示本地端的修改尚未提交至遠端,必須先把遠端的進度更新至本地端才行,因此A需要做更新的動作。
Step4:A執行gitfetch,到遠端抓取目前本地端所沒有的資料,但不做更新。
下載完成後會更新origin/master所指向的方向。
若要更新本地端的進度,可選擇Rebase或Merge。
備註:SourceTree可以設定自動更新,就不需要手動打指令gitfetch(Settings>Advanced>勾選Automaticallyrefresh)。
方法一:Rebase
承Step4,做完gitfetch就來做Rebase。
Rebase意即「重新定義分支的參考基準」。
$gitrebaseorigin/master
表示本地端的master將以本地的遠端分支origin/master為參考基準,此時本地分支origin/master已更新過,進度同遠端倉儲分支master。
出現以下訊息。
First,rewindingheadtoreplayyourworkontopofit...
Applying:修改文章段落
Usingindexinfotoreconstructabasetree...
Mhello_world.html
Fallingbacktopatchingbaseand3-waymerge...
Auto-merginghello_world.html
CONFLICT(content):Mergeconflictinhello_world.html
error:Failedtomergeinthechanges.
Patchfailedat0001修改文章段落
Thecopyofthepatchthatfailedisfoundin:.git/rebase-apply/patch
Resolveallconflictsmanually,markthemasresolvedwith
"gitadd/rm
在有衝突的檔案看到這樣的記號…
HEAD:由於以origin/master為參考基準,因此HEAD指向的目前本機端程式碼位置,是剛從遠端更新的程式碼。
<<<<<<Howareyou?
HelloWorld(*´∀`)~♥
>>>>>>>修改文章段落 決定使用下方(即本次)的修改,刪除標記衝突的記號。HelloWorld(*´∀`)~♥
修改好有衝突的檔案後,將變更標記為已解決,然後繼續Rebase的操作,讓Git重新計算$gitaddhello_world.html $gitrebase--continue Applying:修改文章段落 最後推到遠端上。
$gitpushoriginmaster 來看SourceTree的線圖,這表示成功推到遠端上,同步遠端分支origin/master和遠端倉儲分支master的進度。
備註:以上歷程等同於gitpull--rebase;gitpush。
意即,將遠端更新的內容抓下來後,用Rebase的方式合併,最後推到遠端上。
看更多-gitready»pullwithrebase。
方法二:Merge 承Step4,做完gitfetch就來做Merge。
$gitmerge Auto-merginghello_world.html CONFLICT(content):Mergeconflictinhello_world.html Automaticmergefailed;fixconflictsandthencommittheresult. 手動解衝突,在有衝突的檔案看到這樣的記號… HEAD:HEAD指向目前本機程式碼位置,是本次修改。
<<<<<<HelloWorld(*´∀`)~♥ =======
Howareyou?
>>>>>>>XXXX....... 決定使用上方(即本次)的修改,刪除標記衝突的記號。HelloWorld(*´∀`)~♥
將變更加入暫存區、提交、推至遠端。$gitaddhello_world.html $gitcommit-m"解決衝突" $gitpushoriginmaster 備註:gitfetch+gitmerge等同於gitpull。
來看SourceTree的線圖,這表示成功推到遠端上,同步遠端分支origin/master和遠端倉儲分支master的進度。
注意,使用gitmerge會多一個合併的提交記錄,因此會有一個小耳朵(紅線部份)。
總結:RebasevsMerge Rebase Rebase很像是把本次修改直接貼到新的基準點的後面。
在解衝突方面,提交紀錄是一個一個apply後來解衝突,所以如果本次修改有很多的提交紀錄,就要做很多次apply&解衝突的動作。
在指令的使用上 $gitfetch $gitrebase
複製本次修改並接在目前
同步遠端狀態,並重新設定
等同於 $gitpull—-rebase $gitpush
並且會多一個合併的提交紀錄(小耳朵),用來記錄合併的來源與合併後的修改,如果沒有修改而只是選擇用哪一個版本,合併時的修改檔案就是空白。
在指令的使用上 $gitpull
同步遠端狀態,並重新設定
等同於 $gitfetch $gitmerge
延伸文章資訊
- 1合併發生衝突了,怎麼辦? - 為你自己學Git | 高見龍
git merge dog Auto-merging index.html CONFLICT (content): Merge conflict in index.html ... 這問題看來是...
- 2實戰版本衝突(Dealing with Conflict) - Practical guide for git users
... 肯定會遇到的一種情況,除了慢慢修正一個接一個Conflict 的選擇之外,以下陳述在幾種情況下可以省時費力的解決方法。 ... git checkout --theirs <confli...
- 3git遇到衝突了怎麼辦?別緊張,解衝後就好了。 - iT 邦幫忙
git commit -am 'a description only existing in meat branch'; git merge vegetable; git status. As ...
- 46.解決合併的衝突【教學1 使用分支】 | 連猴子都能懂的Git入門 ...
git merge issue3 Auto-merging myfile.txt CONFLICT (content): Merge conflict in myfile.txt Automat...
- 5本地分支衝突- git - W3HexSchool - 六角學院
這裡也來分享如何解決衝突,也附上本小節Git 範例程式碼. ... git merge dev Auto-merging all.css CONFLICT (content): Merge co...