😀

自分用 Gitコンフリクトガイド

2022/11/28に公開

毎回ググっているような気がしたのでメモ。

ブランチを切ってpushしたらpullreqで自動mergeできないって言われた・・・

リモートで自動mergeできない状態

対処方法として git mergegit rebase の2つの方法がある
git 使い始めの人には git merge を進めて慣れてる人には git rebase を進める

get mergeでの解決方法

参考

リモートから最新のmasterを取得してブランチにorigin/masterをmergeする

以下手順

リモートを取得

git fetch

pushしたブランチにいることを確認

git branch

#* experiment8
#  master

リモートの内容をブランチにmergeする

このときGithub側で自動mergeできなかった内容でコンフリクトする

git merge origin/master
                                                                                                                                                     git-leaning/git/experiment8
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

差分を見ると自動mergeできないものが出てきている

git diff README.md

git-leaning/git/experiment8 !+ (merge)
diff --cc README.md
index 3a9017e,4ef9294..0000000
--- a/README.md
+++ b/README.md
@@@ -30,4 -30,4 +30,8 @@@ branch experiment
  リモートの編集1
  ブランチでの編集

++<<<<<<< HEAD
 +## ブランチでの編集
++=======
+ ## リモートの履歴を進めてみるその9
++>>>>>>> origin/master

編集してconflictを直してコミット

vim README.md
git add .
# -mオプションなどでコンフリクトのログを消さないように注意
git commit

conflictを解消した上で再度push

git push orign experiment8

これでpullreq画面を再度見ると衝突が解消されたことがわかる

conflict解消後

これで引き続き開発をすればよい

git rebase での解決方法

リモートでconflict

git rebase --continue と場合によっては git rebase --skip を使う

またrebaseの状態がよくわからなくなったら git rebase --abort をすればrebase前に戻れる。rebaseを試しにやってみて、やっぱ難しい場合は abort 後mergeをすればよい

参考

リモートから最新のmasterを取得してブランチにorigin/masterをrebaseする

以下手順

リモートを取得

git fetch

pushしたブランチにいることを確認

git branch

#* experiment8
#  master

リモートの内容をブランチにmergeする

git rebase origin/master

このときGithub側で自動mergeできなかった内容でコンフリクトする
(ここまではmergeと同じ)

編集してconflictを直してadd

vim README.md
git add .

このときに自分の編集とリモート側の内容が一致した場合(つまり自分の編集を全く反映せずにリモート側の編集を全て反映させたい場合)はgit statusが変更したってことにならない

自分の編集を全て捨てた場合

自分の編集がリモートと一致しているから何もない

git st                                                                                                                                                            git-leaning/git/experiment13  (rebase)
rebase in progress; onto 939c6d7
You are currently rebasing branch 'experiment13' on '939c6d7'.
  (all conflicts fixed: run "git rebase --continue")

この場合は git rebase --skip を使用する

git rebase --skip

自分の編集が反映される場合

自分の編集が入っているからmodfiedがある

git st                                                                                                                                                           git-leaning/git/experiment13 + (rebase)
rebase in progress; onto 939c6d7
You are currently rebasing branch 'experiment12' on 'b230439'.
  (all conflicts fixed: run "git rebase --continue")

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   README.md

この場合は git rebase --continue を使用する

git rebase --continue

pushには -f が必要なことを忘れずに

mergeと同じ感覚でpushしてもリジェクトされてしまう

git push origin experiment13                                                                                                                                              

git-leaning/git/experiment13
To git@github.com:ryurock/git-leaning.git
 ! [rejected]        experiment13 -> experiment13 (non-fast-forward)
error: failed to push some refs to 'git@github.com:ryurock/git-leaning.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

この場合は強制 push オプション -f を使用する

git push -f origin experiment13

Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 347 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:ryurock/git-leaning.git
 + 1bebf33...3df9914 experiment13 -> experiment13 (forced update)

pullreq画面を再度見ると衝突が解消されたことがわかる

push後のpullreq

これで引き続き開発を行えばよい

Discussion