2022/04/06
Gitで "やらかした" 内容を見出しにして解決策を紹介いたします。
なお、Gitの基本・実践コマンドについては以下をご参考ください。
INDEX
- Git Hub を使いたい
- コンフリクトを解消したい
- git logを見やすくしたい
- リモートと同期 → developブランチにも反映
- マージしたらコンフリクトになった
- 特定のコミットまで戻したい
- エラー「CRLF will be replaced by LF」
- ローカルとリモートブランチを削除 → 新規にブランチを作成したい
- .gitignore にデフォルトで書いておきたいファイル名
- ワーキングツリー / add / commit / push 取り消したい
- Git の管理対象から特定のファイルを除外したい
- ローカルをリモートのブランチに強制一致させたい
- 特定のファイルの変更を確認したい
- git pull を取り消したい
- コンフリクトエラーの見方
- ローカルからリモートURLの確認
- 本番にデプロイした内容を元に戻したい
- git cherry-pick したらコンフリクト発生
- リモートURLを変更したい
- 新しくブランチを切る
- git gc で Unlink of file エラー
- git cherry-pick でエラー(PullRequestなどの取り込みのある場合)
- 上流ブランチを明示的に設定
- 【 バグ発生 】過去のコミットに一時的に戻り、確認後、また最新のコミットに戻る
- ローカルリポジトリに Git Hub で作成した Laravel のプロジェクトを持ってくる
- ターミナルを日本語化
- 直前にコミットしたメッセージを変更する
- 直前のコミットとの差分を見る
- パスワードを毎回聞かれる問題を解決(HTTPS)
- コミットの取り消し
- git push で403 error が出た時の対処法
Git Hub を使いたい
コンフリクトを解消したい
手動で解決する場合
# コンフリクトを解消しファイルを保存後、以下のコマンドを実行
$ git add ファイル名
$ git commit ファイル名 -m "コミットメッセージ"
自動で解決する場合
# 現在のブランチを正とする
$ git checkout --ours {file_name}
# マージで指定したブランチを正とする
$ git chekout --theirs {file_name}
# 現在のブランチを正とする+全部
$ git checkout --ours .
# マージで指定したブランチを正とする+全部
$ git checkout --theirs .
git logを見やすくしたい
リモートと同期 → 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を移動します。
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 したらコンフリクト発生
→ コンフリクト発生
$ 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 cherry-pick でエラー(PullRequestなどの取り込みのある場合)
上流ブランチを明示的に設定
git branch コマンドを使えば、明示的に設定することもできます。
# 現在の上流ブランチを確認
$ git branch -vv
# 上流ブランチの指定
# リモートとローカルのブランチ名を変えられる
$ git branch --set-upstream-to=origin/master master
【 バグ発生 】過去のコミットに一時的に戻り、確認後、また最新のコミットに戻る
ローカルリポジトリに Git Hub で作成した Laravel のプロジェクトを持ってくる
ローカル環境もしくはサーバ環境に GitHub 上に置いている Laravel で作成したデータを持ってくる(クローン)ケースです。
ダウンロードする側に何かしらデータがあるとクローンができません。
クローンする前に事前にディレクトリの中身は空にしておきましょう。
開発環境が Docker の場合は以前に記事をエントリーしているのでご参考ください。
はじめてのGit Hub④(Docker環境下に Laravel プロジェクトを Git Hub から入れる)
# すでに何かデータがある場合クローンできないので、事前に削除しておく
$ 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
ターミナルを日本語化
直前にコミットしたメッセージを変更する
$ git add -all
# 間違えた!修正したい!!
$ git commit -m "HTMLを修正"
# ↓でコミットメッセージが変わる
$ git commit --amend -m "CSSを修正"
直前のコミットとの差分を見る
$ git diff HEAD~ HEAD
# 省略形
# HEAD を省略すると自動的に最新のコミットと比較
$ git diff HEAD~
「~」をつけると一世代前をさす。
ちなみに「~~」が二個だと二世代前。
パスワードを毎回聞かれる問題を解決(HTTPS)
HTTPS でクローンしたリポジトリで、以下のコマンドを実行すると、ユーザ名、パスワードをキャッシュさせることができます。
最初に一度だけ、ユーザ名、パスワードを入力すれば、それ以降は聞かれなくなります。
# cache モードにすると認証情報が一定の期間だけメモリーに記憶される
# 15分経つとメモリーから除去される
$ git config credential.helper cache
# sotre モードにすると認証情報がテキストファイルでディスクに保存される
# 有効期限はない
$ git config credential.helper store
コミットの取り消し
$ git reset --soft HEAD^
--soft
: ワークディレクトリの内容はそのままでコミットだけを取り消したい場合。--hard
: コミット取り消した上でワークディレクトリの内容も書き換えたい場合。HEAD^
: 直前のコミットを意味する。
git push で 403 error が出た時の対処法
git init して初めて git push したときに以下のようなエラーが出ました。
エラーの内容としては「アクセス権限がありません」と言われています。
・100番台 → 案内
・200番台 → 正常処理
・300番台 → 移転通知
・400番台 → 処理失敗
・500番台 → サーバーエラー
400番台と500番台がいわゆるエラーコードになります。
・404 Not Found(リソースが見つからなかった)
などがよく見られるエラーコードになります。
解決策
1)自分のリポジトリを作ったアカウントのユーザ名とメールアドレスを登録していなかった場合、以下のコードで設定。
$ git config --global user.name "ユーザ名"
$ git config --global user.email "メールアドレス"
2)push する際にリモートのURLを設定
# Git Hub用
$ git remote set-url origin https://ユーザ名@github.com/ユーザ名/リポジトリ名.git
# Bit Bucket用
$ git remote set-url origin https://ユーザ名@bitbucket.org/ユーザ名/リポジトリ名.git
はじめてリモートリポジトリのURLをセットする場合は git remote add を使います。
$ git remote add origin https://ユーザ名@github.com/ユーザ名/リポジトリ名.git
これで push するとパスワードを求められるのでパスワードを入れると push できるようになります。
僕自身、何か "やらかしたら" ここに追加していく予定です。
以上です。
Udemyを使ったLaravel学習方法
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。