😀
自分用 Gitコンフリクトガイド
毎回ググっているような気がしたのでメモ。
ブランチを切ってpushしたらpullreqで自動mergeできないって言われた・・・
対処方法として git merge
と git 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画面を再度見ると衝突が解消されたことがわかる
これで引き続き開発をすればよい
git rebase での解決方法
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画面を再度見ると衝突が解消されたことがわかる
これで引き続き開発を行えばよい
Discussion