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
延伸文章資訊
- 1git遇到衝突了怎麼辦?別緊張,解衝後就好了。
When we use git merge to merge two branches, git has its own way to determine whether there is a ...
- 2本地分支衝突- git - W3HexSchool - 六角學院
這裡也來分享如何解決衝突,也附上本小節Git 範例程式碼. ... git merge dev Auto-merging all.css CONFLICT (content): Merge co...
- 3Rebase 版本衝突· Git
請在解完conflict 後,下指令 git rebase --continue 使用 git rebase --skip 略過 ... 這時候rebase 的動作會先停下來,並且要求我們解決衝...
- 4解决Git 变基后的合并冲突 - GitHub Docs
当您执行git rebase 操作时,通常会移动提交。 因此,您可能会遇到引入合并冲突的情况。 这意味着您的两个提交修改了同一个文件中的同一行,而Git 不知道要应用哪个 ...
- 5遇到冲突了怎么解决? - Git 进阶指南
你可以直接用编辑器打开冲突的源文件进行修改,但需要注意删除冲突标记,你也可以使用体验更加友好的Three-Way Merge 工具,借助 git mergetool 命令来完成。