Git 逆引きリファレンス

2020/07/29

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(ハッシュ値)


 

エラー「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側のデータを残します。)

 

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

以上です。

 

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

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

Amazonで詳細を見る

オススメ

 

本庄マサノリ

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

>> Twitter をフォローする

 

-環境構築