Git: 更新分支+解衝突 - Summer。桑莫。夏天

文章推薦指數: 80 %
投票人數:10人

修改好有衝突的檔案後,將變更標記為已解決,然後繼續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",thenrun"gitrebase--continue". Youcaninsteadskipthiscommit:run"gitrebase--skip". Toabortandgetbacktothestatebefore"gitrebase",run"gitrebase--abort". 對於程式碼的修改,Git是可以自動合併不同行的部份,但若是更改同一行的程式碼,就需要人工手動解決衝突——在這裡,由於檔案hello_world.html都被A、B兩人同時更改了同一行程式碼,自動合併失敗,因此需要做人工解衝突的動作。

在有衝突的檔案看到這樣的記號… 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指向目前本機程式碼位置,是本次修改。

XXXX…….:是剛從遠端更新的程式碼。

<<<<<<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/ $gitpush 說明 將資料從遠端取下來。

複製本次修改並接在目前/指向的位置,於是指向最新的位置。

同步遠端狀態,並重新設定/參考的基準點與相同。

等同於 $gitpull—-rebase $gitpush Merge Merge是將遠端的更新加入本次修改中,所以遠端的提交紀錄會在本次修改提交紀錄之後。

並且會多一個合併的提交紀錄(小耳朵),用來記錄合併的來源與合併後的修改,如果沒有修改而只是選擇用哪一個版本,合併時的修改檔案就是空白。

在指令的使用上 $gitpull $gitpush 說明 將資料從遠端取下來,合併本次修改與遠端狀態,並產生一個合併的Commit同時指向兩個ParentCommit。

同步遠端狀態,並重新設定/參考的基準點與相同。

等同於 $gitfetch $gitmerge/ $gitpush 補充 取消Rebase gitfetchvsgitpull 推薦閱讀 Git-遠端分支 為你自己學Git-【狀況題】怎麼有時候推不上去… 使用gitrebase避免無謂的merge 標籤: git gitrebase gitmerge Sourcetree commentspoweredbyDisqus RecentPosts ArchitectingonAWS筆記:Networking 02Jun2022 ArchitectingonAWS筆記:BackupandRestore 01Jun2022 ArchitectingonAWS筆記:EdgeServices 31May2022


請為這篇文章評分?