SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【git】git pushがrejectされたときの対応方法

問題

git

git push しようとしたら、rejectされた。どうしよう。

C:\tmp\gittest\testB>git push c:\tmp\gittest\test master
To c:\tmp\gittest\test
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'c:\tmp\gittest\test'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

答え

自分がリモートの変更をpullしてから、pushするまでの間に、他からのpushがあるなどしてリモートが変更されている状況。

エラーメッセージが教えてくれているように、あなたのブランチの先端はリモートのより後ろになっている。

リモートの変更をマージしてから、改めてpushする。

対応方法 1) とりあえず git pull する

git pull

自動的にマージされて、これでpushできる状態になることもある。

ただ、履歴はこんな感じになる(AさんとBさんが枝分かれして、合流しました)。

git-1


対応方法 2)fetch して merge する

git fetch    (リモートの変更を取ってきて)
git merge origin/master    (マージする)

これも上と同じような結果になる。


対応方法 3)fetch して rebase する

rebase で、リモートの変更の後に自分の変更を持ってくることもできる。

git fetch    (リモートの変更を取ってきて)
git rebase origin/master

履歴はすっきりする(Aさんの変更の後に、Bさんの変更が入りました)。

git-2


対応方法 4)pull –commit や pull –rebase する

これでも何とかなるようだが、無理してpullコマンドを使わなくてよい。

fetchとmergeとrebaseで何とかなる。


競合が単純ではない場合、自動でマージされないので、手作業での修正が必要なこともある。

C:\tmp\gittest\testB>git pull
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From c:/tmp/gittest/test
   a131725..46abd9b  master     -> origin/master
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

↓
マージしてからcommit、pushする

関連するメモ

コメント(1)

Github初心者によるGithub入門〜Githubでソースコードを共有しよう編〜 | ロボット工学者の卵がマインドストームでいろいろやる 2014年11月3日 08:14

[…] 参考 : Qiita – GitHubの初期設定(SSH接続からリポジトリへのpushまで) yk5656 diary – GitHubにリポジトリを作成してみる Softelメモ – 【git】git pushがrejectされたときの対応方法 […]