在Merge 之前想試試看有沒有衝突? - Git 短文| 高見龍
文章推薦指數: 80 %
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
來看一下這個--abort參數的手冊說明:
Thesecondsyntax(“gitmerge–abort”)canonlyberunafterthemergehasresultedinconflicts.gitmerge–abortwillabortthemergeprocessandtrytoreconstructthepre-mergestate.
簡單的說,如果合併沒有順利完成的話,這個參數可以讓專案會回到合併之前的狀態。
歡迎來聊聊
有任何跟Git有關的疑難雜症或是應用情境,都歡迎來信或留言,如果討論的篇幅夠多就會另外整理一篇文章供大家參考:)
Comments
延伸文章資訊
- 1I ran into a merge conflict. How do I abort the merge?
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. MERGE_HEAD is pr...
- 2What does “git merge –abort” do? - Linux Hint
In this way, you will ensure that no such conflicts arise again in the future. So the “git merge ...
- 3Dealing With Merge Conflicts | Learn Version Control with Git
- 47. 使用rebase 合併【教學1 使用分支】 | 連猴子都能懂的Git ...
To check out the original branch and stop rebasing run "git rebase --abort". 和merge 時的操作相同,修改在myf...
- 5在Merge 之前想試試看有沒有衝突? - Git 短文| 高見龍
git status On branch payment You have unmerged paths. (fix conflicts and run "git commit") (use "...