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
特定のファイルの履歴を調べたい
スタッシュにある変更差分を確認したい
# 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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。