⌨️

開発現場でよく使うgitコマンド個人的まとめ

に公開

開発現場で個人的によく使うgitコマンド(と基本的なコマンド)をまとめました。

【リモート-ローカル間の操作】

◼︎clone

$ git clone <クローンしたいリポジトリのURL>

デフォルトの作業ブランチ(主にmainブランチ)のみローカルに作成される。その他のブランチの情報はリモート追跡ブランチに情報のみ取得される。

◼︎fetch

$ git fetch [--prune]

リモート追跡ブランチを更新する(リモートの変更情報をローカルに持ってくる)。
デフォルトではブランチの削除は反映されない。[--prune]オプションをつけることで削除も反映する。
リモート追跡ブランチが更新されるだけでローカルブランチは変化なし。

◼︎pull

$ git pull [--no-ff] origin <取り込みたいブランチ名>

「fetch」+「merge」の動作。
⚠️fetchではリモートに存在する全てのブランチを取得するがpullでは対象は指定したブランチのみ

◼︎リモートのブランチをローカルに持ってくる(厳密にはリモート追跡ブランチから)

$ git branch <ブランチ名> origin/<ブランチ名>

リモート追跡ブランチの情報に基づくので先に「fetch」をする必要がある。
チェックアウトもする場合は以下の通り

$ git checkout -b <ブランチ名> origin/<ブランチ名>

◼︎push

git push origin <ローカルブランチ名>

ローカルリポジトリに加えた変更をリモートリポジトリへ反映

【ブランチ操作】

◼︎ブランチの作成

$ git branch <ブランチ名>

◼︎ブランチの切り替え

$ git checkout <切り替えたいブランチ名>

◼︎ブランチの作成と切り替えを同時に行う

$ git checkout -b <ブランチ名>

◼︎ブランチの削除

▼ローカルブランチ

git branch -d <ブランチ名>

masterブランチにマージされていないブランチは削除できない。「-d」オプションを「-D」に変えることでマージされていないものも強制的に削除できる。

▼リモートブランチ

git push -d origin <ブランチ名>

⚠️リモートブランチを削除してもローカルブランチは削除したという情報を持っていないため「git fetch --prune」するまで見かけ上はブランチが存在しているままに見える

◼︎ブランチの一覧の出力/現在のブランチの確認

$ git branch

[-r]でリモートブランチの一覧を出力

◼︎ブランチのこれまでのコミットの情報を表示する(log)

$ git log

表示される情報は以下の4つ

  1. commit:コミットの識別子(コミットハッシュ)
  2. Author:コミットの作成者の名前とメールアドレス
  3. Date:コミットが作成された日時
  4. コミットメッセージ

◼︎ローカルブランチ名の変更

$ git branch -m <新しいブランチ名>

「-m」はmoveの¥m

◼︎merge

現在の作業対象のブランチに他のブランチを取り込む

$ git merge [--no-ff] <取り込みたいブランチ名>

デフォルトではFast-Forward、[--no-ff]オプションを付ければNon-Fast-Forwardでマージ。
コミットメッセージの入力を求められるが、デフォルトで「Merge remote-tracking branch <ブランチ名>」というコミットメッセージが入力済みなので「:wq」を入力して終了

[コンフリクトの解消]

  1. コンフリクトが発生しマージに失敗した場合メッセージの「CONFLICT(content):」の右に競合したファイルが表示される
  2. 競合しているファイルを編集する
  3. add、commitを行う

◼︎特定のコミットを別のブランチに適用(cherry-pick)

$ git cherry-pick <コミットハッシュ>

◼︎分岐後に親ブランチに加えられた変更を作業ブランチに取り込む(rebase)

⚠️コミットハッシュは変わる。

$ git rebase <親ブランチ>

○rebaseのイメージ図
rebaseの図

rebaseの全体の流れ

  1. 現在の作業ブランチにcommitされていないファイルがない状態にする。(commit,stash)
  2. 親ブランチにcheckoutし、pullで最新の状態にする。
  3. 作業ブランチにcheckoutし、親ブランチを対象にrebaseする。
    <以降はコンフリクトが起きた場合>
  4. コンフリクトが発生しているファイルを修正する。
  5. 「$ git add <修正したファイル>」
  6. 「$ git rebase --continue」
  7. コミットメッセージの編集画面が表示されるので「:wq」で「Enter」
  8. 別コミットでもコンフリクトが発生すれば4~8を繰り返す。

【変更の記録】

◼︎ワーキングツリーのファイルの状態を表示する(status)

$ git status

①Changes not staged for commit
→編集・削除後にインデックスに追加していない
②Untracked files
→新規追加後にインデックスに追加していない
③Changes to be committed
→インデックスに追加済みでコミットしていない

◼︎add

ワーキングツリーからインデックスに追加。
ファイル単位で追加。

$ git add <ファイルパス> <ファイルパス>

全て追加

$ git add .

◼︎commit

インデックスの変更をローカルリポジトリに反映。

$ git commit -m "コミットメッセージ"

◼︎変更内容の一時的な待避(stash)

$ git stash [save "メッセージ"]

▼待避した変更の一覧を表示する

$ git stash list

▼待避した変更を取り込む

$ git stash pop [stash @<番号>]
$ git stash apply [stash @<番号>]

popは待避リストから削除する。applyは削除しない。
[stash @<番号>]でインデックスを指定しない場合は最新の待避が対象となる。

▼待避した変更を削除する

$ git stash drop [stash @<番号>]
$ git stash clear

[stash @<番号>]でインデックスを指定しない場合は最新の待避が対象となる。
clearは全て削除

◼︎直前のコミットを修正

$ git commit --amend [-m "コミットメッセージ"]

「-m」オプションをつけない場合は修正前のコミットメッセージが入力されたVimが開くので「:wq」で閉じる
⚠️pushする前に限る→push後だと「git push -f」が必要になる。

【作業の取り消し】

◼︎commitしていないローカルの変更を取り消して元の状態に戻す

$ git checkout .

◼︎リモートにpushしていないコミットをリセットする(reset)

$ git reset <オプション> <コミット識別子>

コミット識別子で指定したコミットまで戻る。
オプションは以下の3種類。省略時は--mixedとなる。

  1. --soft
    ワーキングツリー、インデックスはそのままでコミットのみリセット
  2. --mixed
    ワーキングツリーはそのままでインデックス、コミットをリセット
  3. --hard
    ワーキングツリー、インデックス、コミットの全てをリセット

コミット識別子は「git log」で確認できる。

リモートにpush済みのコミットをリセットする(revert)

$ git revert <コミット識別子>

コミット識別子で指定したコミットを打ち消す。
resetは削除したことがログに残らないがrevertは「コミットxxxを打ち消したコミット」という風にログに残る。

$ git reset <オプション> <コミット識別子>
$ git push --force origin <ブランチ名>

上記の組み合わせでもコミットを無かったことにできるが履歴が残らず万が一間違えても元に戻せないのでpush --forceは開発現場ではあまり推奨されない。

Discussion