LoginSignup
85
74

More than 5 years have passed since last update.

Githubで間違えてgit push -f origin masterしてしまった時の対応

Last updated at Posted at 2013-02-20

originhttps://github.com/[username]/[reponame]というgithub上で管理しているリモートリポジトリだとする。

ここで誰かが間違えて、必要な変更を失ってしまうようなgit push -f origin masterをやってしまった場合の話。

force-pushed branch master of [username]/[reponame] from 1e6753 to 8cec0c

8cec0cではなく1e6753の状態に戻したいが、1e6753は誰のローカルにも存在しなく、github上でもタグや名前が付けられてないのでfetchしてくることが出来ないとする。

https://github.com/[username]/[reponame]/commit/1e6753
にアクセスすれば、1e6753がどんなコミットであったか分かる。

ここでは、1e6753が255番目のMerge Pull Requestだと分かったとする。
直接、masterにpushするというような運用をしていななければ、たいてい最新のmasterは何らかのMerge Pull Request後であると思う。

$ git ls-remote origin

でremote originにある全てのreferenceがわかり、Github上にはref/pull/番号/mergeref/pull/番号/headが全てのpull requestに対してあるというのがわかる。
これらは全てローカルにfetchしてくることが出来るので、あとは

$ git fetch origin refs/pull/255/merge
From github.com:[username]/[reponame]
 * branch            refs/pull/255/merge -> FETCH_HEAD
$ git checkout FEACH_HEAD
$ git checkout -b old_master
$ git log (確認)
$ git push -f origin old_master:master

とやれば1e6753と同じ内容にmasterが戻る。

実例で説明できない分ちょっとわかりにくくなってしまったが、これは実際に起った問題で、意外とWeb上に情報がない問題だったりする。実際にこうやることで直せたので誰かの役に立つことを期待。push -fはたまに必要だったりするけど怖い・・・。

85
74
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
85
74