gitでありがちな問題の解決方法まとめ

  • 1267
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Git Advent Calendar / Jun. 最終日(30日目)の記事です.29日目は「いざという時のためのgit reflog」でした.
Git Advent Calendar最後なので,git操作でやりがちなミスからどう回復するかをまとめます.他にもあればコメントもらえるとマージしていきます.

ブランチを切り忘れてmasterでコミットしてしまった

その時点でブランチを切る&reset --hardで間違ったコミットたちをmasterから消す

$ git checkout -b new-branch
# masterの最新コミットを消す
$ git checkout master && git reset --hard HEAD~

ブランチを移動し忘れてコミットしてしまった

cherry-pickでコミットを引っ張ってくる.

# 現在間違ったブランチ(bad-branch)にいる
$ git checkout good-branch
$ git cherry-pick bad-branch # 間違ったブランチに行なったコミットを持ってくる
# 間違ったブランチに行なったコミットを消す
$ git checkout bad-branch && git reset --hard HEAD~ 

間違ったコミットをpushしてしまった

個人プロジェクトならコミットを消して反則技のgit push -fする.そうでないなら,可能な限り速やかにgit revertを使って「間違ったコミットを打ち消すコミット」を行ない,pushする

マージ済みのブランチが大量にある

git branch --mergedで一覧が見られるので,masterとカレントブランチ以外を以下のようにして消す.

$ git branch -d $(git branch --merged | grep -v master | grep -v '*') # masterと現在いるブランチは消さない

間違ってreset --hardで戻しすぎた

git reflogを使う.詳しくは昨日のエントリ(いざという時のためのgit reflog)を参照.

重要なstashを消しちゃった

git stash dropしたり,git stash pop -> git reset --hardしたとき.
git fsckするとdangling commitが見られるので,git cherry-pick <SHA1>git stash apply <SHA1>してあげるとよい.
git gcが走ってたら消えてるかも.

コミットメッセージでtypoした

直前のコミットの場合はgit commit --amendを使う.amendと打つのが面倒なので,git commit --amendgit fixにエイリアスしてる

$ git commit # コミットメッセージでtypoした
$ git commit --amend # 入力しなおす

ブランチを移動しようとしたら怒られた

以下のようなメッセージが出たとき

$ git checkout fix/piyo
error: Your local changes to the following files would be overwritten by checkout:
        config/deploy.rb
Please, commit your changes or stash them before you can switch branches.
Aborting

消してもいい変更ならgit reset --hard HEADとかgit co .する.後者をよく使う.
消さずに保存したい場合はきちんとコミットするか,stash saveする.
git stashについてはfukajuneさんの「変更を一時的に退避!キメろgit stash」が詳しいです.

昔のコミット内容にちょっとしたバグを見つけた

そのコミットをまだpushしていない場合限定
新しく行なった変更を以前のコミットに含めたい.

直前のコミットに含めたい

上記のcommit --amendを使うとよい.

それ以上古いコミットに含めたい

変更をcommitしたあと,git rebaseを使う.

$ git commit -m '適当なメッセージ'
$ git rebase -i HEAD~3 # 修正したいコミットを指定
# エディタが立ち上がるので,'適当なメッセージ'のコミットを修正したいコミットの下に移し,先頭をsquashに変更する

その他困った

QiitaのGitタグ投稿を見るか,git-tasuketeに助けを求めてみる