BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Sourcetree】「リモートリポジトリにgit push・git pullできない」を手動で解決する!

はじめに

こんにちは!
夏までに痩せたいBFT名古屋支店のあきやまです。
今回は、Sourcetreeでgit pull、git pushできない問題を手動で解決していきます。

エラー内容

現在のチームでは、ローカルリポジトリで作業したファイルを退勤前にリモートリポジトリにpushするのがお約束です。
いつものように、ローカルリポジトリで更新したファイルを全てインデックスに追加し、名前を付けてコミットします。(いつも同時にpushもさせる)

すると、画面のようなエラーが。

コミットは成功、pushに失敗したというエラーも同時に出力されました。
push前のブランチから新たなブランチが作られたため、リモートリポジトリの状況と現在のローカルリポジトリの状況に差異が生じてしまい、pushできないようです。

では、リモートリポジトリの更新内容を先にローカルリポジトリにpullしようとします。
すると、また画面のようなエラーが。

こちらも同じく、push前のブランチから分岐が発生し、リモートリポジトリであるorigin/masterと、ローカルリポジトリであるmasterに差異があるためにpullできない状態です。(図参照)

[補足]
git pullとは、git fetchとgit mergeを同時に行うものです。
FETCH_HEADとは、git fetchでリモートリポジトリの最新の履歴を取得した際に、取得した最新のコミットを示す目印です。

解決策

私は、以下の方法でこの問題を解決しました。
まず、ローカルリポジトリで作業したファイルを、エクスプローラーの安全な場所にコピーしておきます。
これを忘れると作業内容が全てパーになるので注意。(私は一度やりました)
そして、ローカルリポジトリに既にpullされているコミットの中で最新のものを選択し、右クリック→「現在のブランチをこのコミットまでリセット」を選択

「コミットまでリセット...」の画面で、使うモード:「Hard全ての作業コピーの変更を破棄する」を選択しOKを押下

すると、強めの警告が表示されますが、「はい」を選択します。

この警告を始めてみた時はおもわず笑ってしまいました。
行おうとしていることは破壊的な操作のようです。が、気にせず進みます。
再度お伝えしますが、作業したファイルをローカルに退避していることを必ず確認してください!

そして、改めてリモートリポジトリをpullします。
これで、最新のリモートリポジトリの状態がローカルリポジトリに反映されます。
正常にpullされていることを確認したら、安全な場所に退避していたファイルをローカルリポジトリに戻し、改めてpushします。
これにより、最新のリモートリポジトリがpullされているローカルリポジトリに自分の変更を加えるため、エラーなくpushすることができます。

注意

今回はあくまで「手動」での解決です。
このやり方は、origin/masterの更新とmasterの更新が被っていない場合に限ります。
今回は、「コミットを手動でⒷまで戻し、ⓧとⓎを先にpullしてからⒸとⒹをpushする」という流れのため、更新が被るとデグレってしまう可能性があります。

まとめ

いかがだったでしょうか。
同じエラーに出会った際にはぜひ参考にしてみてください。
最後までご覧いただきありがとうございました!