在Merge 之前想試試看有沒有衝突? - Git 短文| 高見龍

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

git status On branch payment You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) ... 讓您精通業界最常用Git版本控制!Git線上直播課程熱烈報名中現在就報名!學員評價 為你自己學Git 目錄 勘誤表 電子書 單元劇 面試題 系列文章 練習場 關於我 photobymariuszkluzniak 在Merge之前想試試看有沒有衝突? 當你開了一個新的branch,然後做了幾個commit,進度做得差不多之後,下一步就是準備使用gitmerge指令來進行合併。

但你手邊的專案可能有好一陣子沒跟線上的同步,這個merge執行下去可能噴一堆的衝突要解決。

不久前在社群分享就有朋友問到,有沒有辦法可以在進行merge之前先看看會不會發生衝突發生? 除了直接合併下去,衝突再解掉或是再gitreset回來就好的方法之外,gitmerge指令目前並沒有類似gitcommit--dry-run的乾跑參數。

假設想要合併分支cat,想做到乾跑效果可以這樣做: $gitmergecat--no-commit--no-ff 根據Git的說明手冊,對於--no-commit參數的說明如下: With–no-commitperformthemergebutpretendthemergefailedanddonotautocommit,togivetheuserachancetoinspectandfurthertweakthemergeresultbeforecommitting. 這個參數會假裝這次的合併失敗,並且不會產生新的commit,讓使用者有機會可以在commit前再做一些事。

而後面再加上--no-ff參數則是不希望Git使用FastForward方式合併,如果想了解FastForward是怎麼回事,歡迎參閱「為什麼我的分支都沒有『小耳朵』」章節。

那,就讓我們實際來操作一次: 目前專案裡有master跟cat兩個分支,cat分支是從master分出去的,狀態如下: $gitmergecat--no-commit--no-ff Automaticmergewentwell;stoppedbeforecommittingasrequested Good!沒發生衝突,但也沒產生Commit或FastForward。

看一下目前的Git狀態: $gitstatus Onbranchmaster Allconflictsfixedbutyouarestillmerging. (use"gitcommit"toconcludemerge) Changestobecommitted: newfile:cat1.html newfile:cat2.html 的確就停在Commit之前的狀態,cat1.html跟cat2.html都被放到暫存區了。

要注意的是,這個地方如果沒有加上--no-ff的話,雖然不會產生Commit,但還是因為Fastforward而完成合併。

剛剛這個例子太順利的,沒有每天在過年的,讓我們再來看一個會衝突的例子: 在這個例子裡,payment分支跟member因為剛好改到同一個檔案,所以merge應該會發生衝突: $gitmergemember--no-commit--no-ff Auto-mergingindex.html CONFLICT(content):Mergeconflictinindex.html Automaticmergefailed;fixconflictsandthencommittheresult. 果然發生衝突了。

看一下狀態: $gitstatus Onbranchpayment Youhaveunmergedpaths. (fixconflictsandrun"gitcommit") (use"gitmerge--abort"toabortthemerge) Changestobecommitted: newfile:member.html Unmergedpaths: (use"gitadd..."tomarkresolution) bothmodified:index.html 回到過去 在上面這兩個範例中,gitreset--merge指令來回到合併之前的狀態,而在Git1.7.4版本之後,可使用gitmerge--abort也可以跟上面這個指令一樣的效果: $gitmerge--abort 再看一下狀態: $gitstatus Onbranchpayment nothingtocommit,workingtreeclean 這樣就回到合併之前的狀態了。

來看一下這個--abort參數的手冊說明: Thesecondsyntax(“gitmerge–abort”)canonlyberunafterthemergehasresultedinconflicts.gitmerge–abortwillabortthemergeprocessandtrytoreconstructthepre-mergestate. 簡單的說,如果合併沒有順利完成的話,這個參數可以讓專案會回到合併之前的狀態。

歡迎來聊聊 有任何跟Git有關的疑難雜症或是應用情境,都歡迎來信或留言,如果討論的篇幅夠多就會另外整理一篇文章供大家參考:) Comments



請為這篇文章評分?