ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

みんなgit使えて偉いね、という話

[github][git]

To https://github.com/username/hogehoge
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/hogehoge'

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.

こんなエラーが出た。
原因はリモートリポジトリのファイルAとローカルリポジトリのファイルAが互いに変更されていて、どちらの変更を優先していいかわからない、つまり競合状態にあるのが原因らしい。
チームで開発しているとよくあるエラーらしいのだが、これの対処方法がわからない。色々ネット上の記事を読んで回ったがいまいちわからない。というかそもそもgitの仕組み自体わかっていない状態だ。gitについて詳しい人は頭のなかで「あれがこうなって今こういう状況だから……」と組み立てることができるのだろうか。すごいね。

とりあえずみんな大好き「サルでもわかるGit入門」の「競合の解決」をみてみる。

どうやら競合状態にある場合は、競合しているファイルを開き、手動で直せと書いてある。おわりにはサルが「おつかれさま!これでGitの基本的な使い方の説明は終わりばい!」とか言ってる。なめとんのか。

テキストファイルならまだしも、バイナリファイルとかの場合はどうするのだろうか。競合箇所が多い場合は?いろいろ無理があるのではないか。というか私が抱えている症状はまさにそれで、手動じゃ直す気になれないファイルばかりだ。

・解決方法1:「とにかく俺のローカルが正しいんだよ」
開発者が自分1人か、あるいはジャイアンであるかいずれかの場合では、強制的にpushすればよい。

git push --force 

これで強制push。どうなっても知らない。

・解決方法2
いろいろ探した結果、マージでバイナリファイルがコンフリクトした場合のGitの動作と対処方法というサイトに行き着いた。
マージ元とマージ先のいずれかを優先させるかの決定はcheckoutを使えば良い?いけそうな気がしたが症状は直らず。
merge...?って人はここでも見て勉強しましょう。

・解決方法3
【git】git pushがrejectされたときの対応方法の対応方法を上から順番に試してみる。

・まとめ
gitはよくわからんまま使わないほうが良い。なんとなく便利って聞いたから程度で始めるとよくわからんことになる。運用するなら勉強をしましょう。