Git 逆引きリファレンス

2021/09/16

Gitで "やらかした" 内容を見出しにして解決策を紹介いたします。

なお、Gitの基本・実践コマンドについては以下をご参考ください。

 

INDEX

 

Git Hub を使いたい


別記事としてエントリーしました。以下のURLをご確認ください。

 

コンフリクトを解消したい

手動で解決する場合


# コンフリクトを解消しファイルを保存後、以下のコマンドを実行
$ git add ファイル名

$ git commit ファイル名 -m "コミットメッセージ"

 

自動で解決する場合


# 現在のブランチを正とする
$ git checkout --ours {file_name}

# マージで指定したブランチを正とする
$ git chekout --theirs {file_name}

# 現在のブランチを正とする+全部
$ git checkout --ours .

# マージで指定したブランチを正とする+全部
$ git checkout --theirs .

 

git logを見やすくしたい


[ Laravelプロジェクト ] -> [ .git ] -> [ config ] を開きます。

末尾に以下を追加。


:
[alias]
    plog = log --pretty='format:%C(yellow)%h %C(green)%cd %C(reset)%s %C(red)%d %C(cyan)[%an]' --date=iso

コマンドを実行


$ git plog

 

 

リモートと同期 → developブランチにも反映


### リモートと同期

# developブランチからmasterブランチへ
$ git checkout master

# リモートのデータを取得
$ git fetch

# 差分を確認
$ git diff HEAD origin/master

# 差分を確認(ファイル名のみ表示)
$ git diff HEAD origin/master --name-only

# マージ
$ git merge origin/master

### developブランチにも反映

# masterブランチからdevelopブランチへ
$ git checkout develop

# リモートから取得したデータをdevelopブランチにもマージ
$ git merge master

 

マージしたらコンフリクトになった

マージしたらコンフリクトした。やっぱりやめよう

コンフリクトした状態では他のブランチに切り替えることができない。

error: you need to resolve your current index firstというエラーが出る。

以下のコマンドでマージ前の状態に戻せる。(※コンフリクトの編集をしていないときに限ります。)


$ git merge --abort


 

マージしたらコンフリクトした。コンフリクトを解消しようといろいろ編集した。でもやっぱりやめよう。

編集した内容もマージもすべて取り消されます。


$ git reset --hard HEAD

 

マージは完了した。でもやっぱりやめよう。

revertコマンドを使用して、マージコミットを取り消します。


$ git revert -m 1 マージしたコミットID(ハッシュ値)

 

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


#------------------------------
# ローカル履歴から変更を取り消す
#------------------------------
# 戻したいコミットID(ハッシュ値)を確認
$ git log -5 --oneline
$ git reset --hard コミットID(ハッシュ値)

# 強制的にPUSHする
$ git push -f origin master

#------------------------------
# 本番環境
#------------------------------
# リモートのブランチに強制一致
$ git reset --hard origin/master


 

エラー「CRLF will be replaced by LF」


Gitには改行コードを変換する設定が搭載されています。

これによって、異なるOS間でGitを使っていると、addしたときに「CRLF will be replaced by LF」というエラーが表示されたりします。

改行コード自動変換のオフは以下のコマンドを実行します。


$ git config --global core.autoCRLF false


 

ローカルとリモートブランチを削除 → 新規にブランチを作成したい


### developブランチの削除

# ブランチの一覧表示(ローカル)
$ git branch

# ブランチの一覧表示(リモート)
$ git branch --remote

# ブランチの削除(ローカル)
$ git branch -d develop

# ブランチの削除(リモート)
$ git push --delete origin develop


### developブランチの作成

# 1) BitBucketの画面(リモート)からブランチの新規作成
# 2) リモートからデータを取得
$ git fetch

 

.gitignore にデフォルトで記述しておきたいファイル名


# IDE and editor specific files #
#################################
/nbproject
.idea

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db
_notes

 

ワーキングツリー / add / commit / push 取り消したい

ワーキングツリーの取り消し

# すべて(ワーキングツリー&インデックス)前の状態に戻す
$ git reset --hard HEAD

 

add の取り消し

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

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

 

commit の取り消し

commit の取り消しは「reset」と「revert」があります。おススメは「revert」


### 方法① revert
# コミットIDを確認
$ git log --oneline -5

# 指定したコミットを打ち消すコミットを新たに行う
$ git revert コミットID

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

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

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

### 特定のコミットまで戻す
# コミットIDを確認
$ git log --oneline -5

$ git reset --hard コミットID

 

push の取り消し

push の取り消しは「reset」と「revert」をしてから push します。


### 方法①リバート
# コミットIDを確認
$ git log --oneline -5

# 指定したコミットを打ち消すコミットを新たに行う
$ git revert コミットID

# リモートリポジトリに反映
$ git push

### 方法②リセット
# コミットIDを確認
$ git log --oneline -5

# ワークディレクトリの変更だけ残す
$ git reset --mixed コミットID

# 強制的にリモートリポジトリに反映
$ git push -f origin ブランチ名

 

Git の管理対象から特定のファイルを除外したい


別記事としてエントリーしました。以下をリンクをご参考ください。

 

ローカルをリモートのブランチに強制一致させたい


作業内容が妙になってしまった時に、「リモートが合っているんだからアイツに合わせたいんだよ!」っていうケース。


# リモートにあるマスターブランチを取得
$ git fetch origin master

# "origin/master" の箇所は適宜読み替える
$ git reset --hard origin/master

 

特定のファイルの変更を確認したい


git log で、特定のファイルの変更履歴を確認し、変更が発生したコミットを見つける方法です。

「あれ?これは、いつからこうなってるんだろう?」「誰がやったんだろう?」っていうケース。


### 特定のファイルの変更を確認する
# 構文
$ git log -p ファイル名

# 実例
$ git log -p resources/views/index.blade.php
# よりコンパクトに表示
$ git log --word-diff -p resources/views/index.blade.php

 

git pull を取り消したい


git pull の取り消しは、pull したリモートブランチのマージを取り消しすればいいので、マージする前の位置に参照(HEAD)を戻してやります。

HEADの移動履歴は、git reflog に記録されています。

※ref(参照)のログだから「reflog」です。


# HEAD の移動履歴を表示
$ git reflog

321dd75 (origin/master, master) HEAD@{0}: merge: merging origin/master to master
321dd75 (origin/prod, prod)     HEAD@{1}: checkout: moving from temp to prod
eceee42 (origin/tmp, tmp)       HEAD@{2}: commit: fix the form bug.
321dd75 (origin/prod, prod)     HEAD@{3}: reset: moving to prod.
321dd75 (origin/prod, prod)     HEAD@{4}: checkout: moving from prod to temp

 
マージ前の参照がHEAD@{1}だとわかりました。
git reset --hard を利用して、強制的にHEADを移動します。

【 git reset --hard 】
HEAD(参照)、作業ツリー、インデックスのすべてを指定したコミットに書き換えるコマンド

# HEAD(参照)、作業ツリー、インデックスを強制的に戻す
$ git reset --hard HEAD@{1}

 

コンフリクトエラーの見方


プルリクエストでマージした時にコンフリクトが発生した場合は以下のような画面になります。

「<<<<<<<< 」から「=======」の間の行には、現在チェックアウトしているmaster側での状態が記載されています。 「=======」から「>>>>>>>>」の間の行には、マージさせたい開発したデータ側の状態が記載されています。

コンフリクトを解決するには、このどちらかを残して、他方を削除すれば、解消されます。

(※個人的にはとりあえずmaster側のデータを残します。)

 

ローカルからリモートURLの確認


ローカルにクローンしたリポジトリのリモートURLを確認します。


$ git remote -v
origin  git@github.com:laraweb/laraweb.git (fetch)
origin  git@github.com:laraweb/laraweb.git (push)

 

 

本番にデプロイした内容を元に戻したい

【 トラブル内容 】
① git push してリモートリポジトリを更新(ローカル環境)
② git pull で更新したリモートリポジトリをマージ(本番環境)
③ 変なことになった。前のデータに戻したい。
1つ前の状態に戻したい

#--------------------------
# ローカル環境
#--------------------------
# 1つ前の状態に戻る
$ git reset --hard HEAD^

# ブランチ名の前に "+" をつけることで強制PUSH
$ git push origin +master

#--------------------------
# 本番環境
#--------------------------
# リモートのブランチに強制一致
$ git reset --hard origin/master

 

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

#--------------------------
# ローカル環境
#--------------------------
# 戻す対象のハッシュ値を調べる
$ git log -5 --oneline

# 指定したハッシュ値のコミットまで戻る
$ git reset --hard ハッシュ値

# ブランチ名の前に "+" をつけることで強制PUSH
$ git push origin +master

#--------------------------
# 本番環境
#--------------------------
# リモートのブランチに強制一致
$ git reset --hard origin/master

 

git cherry-pick したらコンフリクト発生

(他のブランチの)特定コミットをmasterブランチにコミットしたい。
→ コンフリクト発生

$ git checkout master
$ git cherry-pick コミットID

# エラー発生
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ' or 'git rm '
hint: and commit the result with 'git commit'

# マージされていないファイルを確認
$ git ls-files -u

# 現在の状態を確認
$ git status
...(略)
Unmerged paths:
  (use "git add ..." to mark resolution)

        both modified:   routes.php
        both modified:   ContentsController.php

# routes.php と ContentsController.php を手作業でコンフリクトを解消してやるのが普通のやり方。
# ただ、多くの場合、マージ先かマージ元を優先してコミットしている。
# そのときはcheckout --ours(master) または checkout --theirs(cherry-pickしたコミット)を使えば一発。
$ git checkout --theirs app/Http/routes.php
$ git checkout --theirs app/Http/Controllers/ContentsController.php

# routes.php と ContentsController.php をみると <<<HEAD がなくなっている
# あとは add して commit するだけ
$ git add --all
$ git commit -m "コミット解消"
$ git push

 

実演


 

リモートURLを変更したい


# 現在のリモートURLを確認
$ git remote -v
origin  git@github.com:hoge/current-repo.git (fetch)
origin  git@github.com:hoge/current-repo.git (push)

# 新しいリモートURLに変更
git remote set-url origin {new url}

# 変更したリモートURLを確認
$ git remote -v
origin  git@github.com:hoge/new-repo.git (fetch)
origin  git@github.com:hoge/new-repo.git (push)

 

実演

 

新しくブランチを切る


# ブランチを切る
$ git branch ブランチ名

# プッシュ時に上流ブランチとして認識させる
$ git push -u origin ブランチ名

 

git gc で Unlink of file エラー

【 git gc 】
「ゴミ掃除」を行うコマンドで未参照のオブジェクトを削除し、かつファイルの差分をデルタ圧縮することでリポジトリの最適化を行います。

# GCやってゴミを減らす
$ git gc-aggressive

# 削除状態も同期され、リモートのブランチ一覧から削除済みブランチが表示されなくなる
$ git prune

 

git cherry-pick でエラー(PullRequestなどの取り込みのある場合)

git cherry-pick するときに PullRequest などの取り込みのある場合、以下のようなエラーにメッセージが表示されることがあります。

 

 

この場合はメッセージ通りに git commit --allow-empty のコマンド打ってOKです。

ただ、このコマンドを打ったあと、Vim(?)が起動されるので戸惑う人がいるかもしれません。

 

 

その場合は焦らずに vim を閉じるコマンド「:q」でOKです。

 

上流ブランチを明示的に設定

git branch コマンドを使えば、明示的に設定することもできます。


# 現在の上流ブランチを確認
$ git branch -vv

# 上流ブランチの指定
# リモートとローカルのブランチ名を変えられる
$ git branch --set-upstream-to=origin/master master

 

 

【 バグ発生 】過去のコミットに一時的に戻り、確認後、また最新のコミットに戻る

git checkout コミットID で OK。


# 戻りたいログを確認
$ git log -20 --oneline

# 戻る
$ git checkout コミットID

# 確認後ブランチに戻る
$ git checkout ブランチ名

 

実例

 

ローカルリポジトリに Git Hub で作成した Laravel のプロジェクトを持ってくる

ローカル環境もしくはサーバ環境に GitHub 上に置いている Laravel で作成したデータを持ってくる(クローン)ケースです。

ダウンロードする側に何かしらデータがあるとクローンができません。

クローンする前に事前にディレクトリの中身は空にしておきましょう。

開発環境が Docker の場合は以前に記事をエントリーしているのでご参考ください。


# すでに何かデータがある場合クローンできないので、事前に削除しておく
$ rm -rf laraveltokyo
$ mkdir laraveltokyo

# クローンしたいディレクトリまで移動
$ cd laraveltokyo

# Git Hub からクローン
# SSH 接続よりも SSL 接続のほうが上手くいく
$ git clone https://github.com/自分のアカウント/プロジェクト名 .

# vendor ディレクトリをインストール
$ composer install

# DBの設定
# .envファイルをDBの接続情報に変える
$ vim .env

# DBの作成(マイグレーション)
$ php artsian migrate

 

ターミナルを日本語化


$ export LANG=ja_JP.UTF-8

 

 

【 IDE が PhpStorm なら 】
「設定」> 「ツール」> 「ターミナル」の環境変数に LANG=ja_JP.UTF8 を設定してもOK。ただ、ときどきこの設定が消える(※調査中)

 

直前にコミットしたメッセージを変更する


$ git add -all

# 間違えた!修正したい!!
$ git commit -m "HTMLを修正"

# ↓でコミットメッセージが変わる
$ git commit --amend -m "CSSを修正"

 

直前のコミットとの差分を見る


$ git diff HEAD~ HEAD

# 省略形
# HEAD を省略すると自動的に最新のコミットと比較
$ git diff HEAD~

「HEAD」とは現在の最新のコミットのこと。
「~」をつけると一世代前をさす。
ちなみに「~~」が二個だと二世代前。

 
僕自身、何か "やらかしたら" ここに追加していく予定です。

以上です。

 

【改訂新版】Gitポケットリファレンス

Gitの初歩的なことは一通り勉強していて、さらにもっとGitを使いこなしたいと思っている人におススメの本です。中身は基本的にリファレンスです。ただ、コマンドレベルの説明だけではなく、「使い方」や「エラーと対処法」など実用レベルで記述されています。普段のルーチン作業だけでは、すぐに細かいコマンドとか忘れがちになります。何かあったときのための備えとして、または辞書としてお手元に置いておくのもありかと思います。

Amazonで詳細を見る

オススメ

 

本庄マサノリ

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

>> Twitter をフォローする

 

-環境構築