はじめに
こんにちは!
夏までに痩せたい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する」という流れのため、更新が被るとデグレってしまう可能性があります。
まとめ
いかがだったでしょうか。
同じエラーに出会った際にはぜひ参考にしてみてください。
最後までご覧いただきありがとうございました!