① git merge conflict 怎麼解決
首先,找到包含conflict的文件
一般的命令包括
git
diff
git
status
git
ls-files
-u
(這個命令的結果比較奇葩)
找到文件後
cat一下
就可以找到conflict具體的地方
找到了conflict的地方
我們可以通過一些方面來追溯
產生conflict的那些遞交可以使用
git
log
--merge
--left-right
-p
其中--merge選項告訴git只要顯示那些和conflict相關的遞交
--left-right會在commit的信息中加入<
或者>
來提示這個commit是在當前分支
還是在那個需要被merge進來的分支上!
② git merge和rebase的區別
merge和rebase的區別
處理沖突的方式:
使用merge命令合並分支,解決完沖突,執行git add .和git commit -m'fix conflict'。這個時候會產生一個commit。
使用rebase命令合並分支,解決完沖突,執行git add .和git rebase --continue,不會產生額外的commit。這樣的好處是『干凈』,分支上不會有無意義的解決分支的commit。
git pull和git pull --rebase區別:git pull做了兩個操作分別是『獲取』和合並。所以加了rebase就是以rebase的方式進行合並分支,默認為merge。
③ Git怎樣撤銷一次分支的合並Merge
如果確定放棄這次合並的提交,假如是 merge 了錯誤的分支到 master,先通過 git reflog 或者 gitg、gitk、qgit 等工具確定你 merge 之前 master 所在的 commit,然後在 master 分支上使用 git reset --hard <commit> 重置頭指針。一般來說,在 master 上直接執行 git reset --hard HEAD~ 也可以回到合並之前的提交,但 git reset --hard 命令還是使用確定的 commit 為好。注意,git reset --hard 命令有風險,除非十分確定要放棄當前提交,否則最好先 git branch 為當前的提交建立個新的分支引用後再繼續,待確定無誤後刪除即可。
如果錯誤的合並之後又有了新的提交,可以在完成前述正確的合並之後,通過 git rebase --onto <錯誤的合並提交> <正確的合並提交> <新提交所在分支> 來在正確的合並提交上重建新的提交。git rebase --onto 命令所重建的提交序列最好是線性的,否則非線性的提交會變成線性的。若需要保存非線性的提交歷史,可以考慮使用 --preserve-merges 參數,不過結果很不可靠,具體視提交的非線性程度而定。
④ 我在git merge的時候遇到了沖突,怎麼解決
首先我們來看看為什麼會沖突,git沖突的原因很簡單,就是兩個分支當中對同一處代碼進行了不同的改動。於是git會困惑,不知道在merge的時候究竟應該怎麼做,於是就會出現沖突。
實戰
光說不練沒有意義,讓我們來實際操作一下。
我們首先創建一個一個test.txt文件,在其中寫入一行test。git add並且git commit。
接著我們checkout -b創建一個新的分支,在這個分支當中我們把test.txt之前的一行改成get conflict。然後我們同樣add commit。
git merge --abort
mergetool
除了手動合並以及放棄之外,我們還有一些其他的合並工具。比如git官方也開發了一個專門用來合並的工具,叫做git merge tool,它會將找到一份兩個分支的祖先代碼作為base也就是基準,然後再將兩個分支的改動都列舉出來作為對比,讓我們在git編輯器當中決定要留下什麼。
它打開大概是這樣的,我個人只用過一次,因為覺得太難用了。
git mergetool
IDE工具
除了git官方之外,一般的IDE當中也都會提供merge的工具。比如vscode當中的git插件為我們提供了非常好用的merge功能,它會用不同的顏色高亮不同分支的代碼。並且還提供了幾個非常好用的功能。分別是保留當前分支的代碼,保留合並分支的代碼,以及保留兩者和對比改動。
我們用vscode打開test.txt之後會看到:
當我點擊compare changes之後,它就會把這兩個文件排列在一起給我們觀察它們各自的改動,不得不說是非常好用了。
⑤ git怎樣撤銷一次分支的合並merge
如果確定放棄這次合並的提交,假如是 merge 了錯誤的分支到 master,先通過 git reflog或者 gitg、gitk、qgit 等工具確定你 merge 之前 master 所在的 commit,然後在 master 分支上使用 git reset --hard <commit> 重置頭指針。一般來說,在 master 上直接執行git reset --hard HEAD~ 也可以回到合並之前的提交,但 git reset --hard 命令還是使用確定的 commit 為好。注意,git reset --hard 命令有風險,除非十分確定要放棄當前提交,否則最好先 git branch 為當前的提交建立個新的分支引用後再繼續,待確定無誤後刪除即可。
如果錯誤的合並之後又有了新的提交,可以在完成前述正確的合並之後,通過 git rebase --onto <錯誤的合並提交> <正確的合並提交> <新提交所在分支> 來在正確的合並提交上重建新的提交。git rebase --onto 命令所重建的提交序列最好是線性的,否則非線性的提交會變成線性的。若需要保存非線性的提交歷史,可以考慮使用 --preserve-merges 參數,不過結果很不可靠,具體視提交的非線性程度而定。