Gitコマンド(トラブルシューティング)

2019/09/18

Gitで運用していると、頻繁によくわからないトラブルに遭遇します。

このページで備忘録としてメモすることにしました。

 

INDEX

取り消し系

 

できない系

 

ログ・差分確認系

 

その他

 

特定のコミットまで戻したい場合

戻す対象のハッシュ値を調べる

$ git log --oneline -5

 

指定したハッシュ値のコミットまで戻す

$ git reset --hard {ハッシュ値}

ポイント
オプション

--hard コミット、インデックス、ファイルの変更をすべて削除する。
--mixed コミット、インデックスを削除。ファイルの変更だけは残す。
--soft コミットだけを削除する。インデックス、ファイルの変更は残す。
 

直前のコミットを取り消す

直前のコミットを取り消す場合は以下のコマンドでも可能です。


# コミットを取り消した上でワークディレクトリの内容も書き換えたい場合
# このコマンドを使う時は慎重に!
$ git reset --hard HEAD^

# ワークディレクトリの変更だけ残す
# 個人的にはこっちをよく使う
$ git reset --mixed HEAD^

# コミットだけを取り消したい場合(ワークディレクトリ・インデックスの内容はそのまま)
$ git reset --soft HEAD^

 

ちゃんと消えたか確認

$ git log --oneline -5

ポイント

「やっぱりさっきのgit resetをなかったことにしたい」
そんなコマンドも実は用意されています。


# 直前のリセットを取り消す
$ git reset --hard ORIG_HEAD

 

git push を取り消したい場合

直前のコミットを取り消す

# ワークディレクトリの変更だけ残す
$ git reset --mixed HEAD^

# ワークディレクトリ・インデックスの内容はそのままで、コミットだけを取り消したい場合
$ git reset --soft HEAD^

 

強制的に Push する

$ git push -f origin master

ポイント

実は、この書き換えたブランチを push しようとすると、リモートにある以前のコミットとコンフリクト(リモートより歴史が短いブランチをプッシュしているため)して push できません。なので、強制的にプッシュさせる「-f」オプションを付けて強引に上書きします。

 

ちゃんと消えたか確認

$ git log --oneline -5

 

git の add を取り消す


# 書式
$ git reset HEAD [ファイル名]

# 使用例
$ git reset HEAD resources/views/sample.blade.php

 

開発用ブランチに切り替えて作業を開始

masterブランチにチェックアウト

$ git checkout master

 

最新の状態にしておく

$ git pull origin master

 

他のブランチに切り替える

$ git checkout develop

 

masterブランチを取り込む

$ git merge master

 

一時避難 → プル

現在の作業を一時避難

# 書式
$ git stash save "{コメント}"

# 今日の日付を入れるとわかりやすいかも?
$ git stash save "2019-02-28"

# コメントを省略
$ git stash

 

避難した作業を確認

# 保存されている stash を一覧表示
$ git stash list

# 直近のスタッシュにある変更差分を確認したい
git diff stash@{0}

ポイント

実行時には以下のように情報が出力されます。


$ git stash list

# git stash list 実行時には以下のように出力されます。
: WIP on : <ハッシュ> <コミットコメント>

# 例 stash@{0} が最新のスタッシュ
stash@{0}: On develop: 2019-02-28

# 各変更について詳しく見たい場合、変更内容に含まれるファイルの一覧が見れる
$ git stash show 

 

変更点を取り入れる

$ git pull

 

一時避難した処理を元に戻す

# 書式
$ git stash apply {スタッシュ名}

# 番号指定
$ git stash apply stash@{0}

# スタッシュ名を省略すると直近のスタッシュが復活
$ git stash apply

# 直近のスタッシュを適用+スタッシュを消す
$ git stash pop

 

スタッシュを削除

# 書式
$ git stash drop {削除したい stash 名}

# 番号指定
git stash drop stash@{0}

# スタッシュ名を省略すると、直近のスタッシュが削除される
git stash drop

 

すでにGitの管理下にあるものを除外する

すでに管理対象となっているファイルは、.gitignore に記述しただけでは対象から外れません。以下の作業を行います。

.gitignore に追加

例:Thumbs.db を除外


# Thumbs.db すべて無視されます。
Thumbs.db

 

ファイルを管理対象から除外する

# 書式ーファイルの場合
$ git rm --cached {ファイル名}

# 例
$ git rm --cached public/images/Tumbs.db

# ディレクトリごと
$ git rm -r --cached {ディレクトリ名}

# 例
$ git rm -r --cached .idea/

ポイント

--cached オプションを付けることにより、ファイルを残したまま管理対象から外すことができます。
--cached オプションをつけないと、ファイルごと削除されるので注意!

 

コミットする

$ git add .gitignore
$ git commit -m "change the setting of .gitignore"

このあとリモートにプッシュすると、リモートにあるTumbs.dbは削除されます。

ローカルにあるTumbs.dbは削除されません。

 

git pull の取り消し

1つ前の状態に戻す

$ git reset -hard HEAD^

ポイント
-hard
ワークディレクトリの物理的変更を行う(ワークディレクトリの内容も書き換える)
HEAD^
1つ前の状態

 

直前以外

git reflog

ポイント

reflog(参照ログ)とはHEADやブランチ先端の動きの履歴です。
・各個人のローカルリポジトリに存在します。
・ブランチの切り替え、新たに加えられた変更のプル、履歴の書き換え、あるいは単なる新規コミットの実行などを記録します。

git reflog で履歴を確認してから「HEAD@{1}」などを指定してresetします。


git reset --hard HEAD@{1}

 

git push ができない

git push したら以下のエラーが表示

To git@github.com:◯◯◯.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:◯◯◯.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

これは自分がリモートの変更をpullしてから、pushするまでの間に他のpushがあるなどしてリモートが変更されているためです。
(※ブランチの先端がリモートより後ろになっているためです。)

対策方法

この場合、 git pull すると解決します。


$git pull

 

git pull ができない

git pull したらコンフリクト

error: Your local changes to the following files would be overwritten by merge:
    ディレクトリ名/ファイル名
Please, commit your changes or stash them before you can merge.

 
対策方法

この場合、 git stash すると解決します。


$ git stash

このあと git pull を実行します。

git pull ができたら一時避難したデータをもとに戻します。


$ git stash apply

もとに戻したら削除で完了。


$ git stash drop

 

git checkout ができない

git checkout したらエラー

ブランチを切り替える時に下記エラーが出て切り替えられないことがあります。


error: Your local changes to the following files would be overwritten by checkout:
    abc.txt
    hogehoge.ctp
Please, commit your changes or stash them before you can switch branches.
error: The following untracked working tree files would be overwritten by checkout:
    abc.txt
Please move or remove them before you can switch branches.
Aborting

 
対策方法

この場合、 git stash すると解決します。


$ git stash save "2019-04-04"

このあと git checkout master を実行します。

git checkout ができたら一時避難したデータをもとに戻します。


$ git stash apply

もとに戻したら削除で完了。


$ git stash drop

ポイント

その他のやり方として問題のデータをコミットしておくやり方があります。(※push はしません。)
変更履歴を戻すには、コミットしたブランチに戻ってから
git reset --soft HEAD^
git reset

 

git pull する前に差分を確認

git pull はいうなれば「git fetch & git merge」なので、git pull を実行すると、いきなりローカルブランチにマージがかかってしまいます。

これを事前に diff で差分を確認してから、git pull をします。

masterブランチを例で書くと以下のようになります。


// リモートを取ってくる
git fetch origin master

// [ローカル] → [リモート追跡]の差分を見る
git diff master origin/master

// 問題ないことが確認できたら..
git merge origin/master

 

コミット履歴を見る(最終形)

git logコマンドを見やすくするためにオプションを付けました。

以下が最終形です。


# 5つまで表示
$ git log --oneline --graph --decorate -5

 

特定のコミットでの差分が見たい

「このコミットでのdiffなんだっけ?」と確認したいときに使うコマンドです。


# コミットIDを調べる
$ git log --online --graph --decorate -5

# diffを見る
$ git show {commit ID}

 

git add する前に変更点を見たい

git add する前に、ある変更したファイルに対しての変更点が見たいケースです。


# 書式
$ git diff -- {対象のファイルパス}

# 例
$ git diff -- resources/views/borad/message.blade.php

 

特定のファイルの履歴を調べたい

通常の履歴を調べるのは log だけでいいのですが、特定ファイルの場合は、-p オプションをつけてファイルをフルパスで指定してあげます。


# 書式
$ git log -p {対象のファイルパス}

# 例
$ git log -p app/Http/routes.php

 

実行結果

 

スタッシュにある変更差分を確認したい


# git stash list で stash@{N} の番号を確認する
$ git stash list
stash@{0}: WIP on branch_name: commit_id2 commit_comment2
stash@{1}: WIP on branch_name: commit_id1 commit_comment1

# 中身を見たい番号を指定して、以下のコマンドでHEADとの差分を確認
$ git diff stash@{0}

 

ブランチ間の差分を見たい


# ブランチAの方がBより古い扱いで差分が表示される
$ git diff [ブランチA] [ブランチB]

# 使用例
$ git diff master develop
# リモートブランチの staging とローカルの develop を比較
$ git diff origin/staging develop

 
 
何か気づいたら、また随時追加していく予定です。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-環境構築