Git

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

More than 3 years have passed since last update.

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


ブランチを切って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

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