Gitの基本的な操作

はじめに

私がTAを担当している講義のカリキュラムにGit入門という回があったので、具体的に何を講義でするのかはまだわかりませんが、基本的な操作についてまとめてみました。

ローカルにある3つのエリア

ワークツリー

ファイルを編集し、作業を行うディレクトリ。ここにあるファイルはまだGitの追跡下には置かれておらず、変更内容もコミットされていない。

ステージ

ワークツリーで変更したファイルの中から、次のコミットに含めたい変更を選択してステージするエリア。ここに追加された変更はGitに追跡されているが、まだローカルリポジトリの履歴には含まれていない。

ローカルリポジトリ

ローカル上にあるリポジトリで、ここにコミットされた変更はバージョン履歴に保存される。ステージされた変更をコミットすると、それらはローカルリポジトリに永続的に記録される。

コミット:ワークツリーでの変更をローカルリポジトリの履歴に記録するプロセス

コマンド

リポジトリの作成

# ローカルリポジトリを作成
$ git init

# リモートリポジトリのコピーを作成
$ git clone <リモートリポジトリパス>

変更をステージに追加

# 指定したファイルをステージに追加
$ git add <ファイル名>

# 指定したディレクトリにあるファイルを全てステージに追加
$ git add <ディレクトリ名>

# カレントディレクトリにあるファイルを全てステージに追加
$ git add .

コミット(変更を記録)

$ git commit

# gitエディタを立ち上げることなくメッセージ付きで変更を記録できるオプション
$ git commit -m "<メッセージ>"

# gitエディタでファイルに変更内容(どのような変更か)を表示させるオプション
$ git commit -v

現在の変更状況を確認する

$ git status

表示内容

  • ワークツリーとステージの間で変更されたファイル
  • ステージとローカルリポジトリの間で変更されたファイル

ファイル間の変更差分を確認する

# ステージに追加する(git addする)前の変更分
$ git diff

# 指定したファイルのステージに追加する(git addする)前の変更分
$ git diff <ファイル名>

# ステージに追加した(git addした)後の変更分を表示するオプション
$ git diff --staged

リポジトリのコミット履歴を確認する

$ git log

# 1行で表示するオプション
$ git log --oneline

# ファイルの変更差分を表示
$ git log -p <ファイル名>

# 表示するコミット数を制限
$ git log -n <コミット数>

ファイルの削除を記録する

# 指定したファイルを削除(ワークツリーからもファイルが削除される)
$ git rm <ファイル名>

# 指定したディレクトリを削除(ワークツリーからもディレクトリが削除される)
$ git rm -r <ディレクトリ名>

# ワークツリーにファイルを残すオプション
$ git rm --cached <ファイル名>

ファイルの移動を記録する

$ git mv <旧ファイル> <新ファイル>

同様の操作を行うコマンド

$ mv <旧ファイル> <新ファイル>
$ git rm <旧ファイル>
$ git add <新ファイル>

リモートリポジトリ(GitHub)にpushする

# リモートリポジトリを新規追加する
$ git remote add <リモートリポジトリ名> <リモートリポジトリURL>
  • 指定したリモートリポジトリ名でリモートリポジトリとのやりとりが可能になる
  • 慣習として「origin」と命名する
# リモートリポジトリへ送信する
$ git push <リモートリポジトリ名> <ブランチ名>

コマンドにエイリアスを付ける

$ git config --global alias.<エイリアス> <コマンド>
  • エイリアス:別名
  • コマンドの入力を短縮することが目的

バージョン管理しないファイルを無視する

「.gitignoreファイル」に無視するものを指定する

# ファイル指定
ignore.txt

# ディレクトリ以下を指定
ignore_dir/

# 拡張子を指定
*.txt

# 無視しないファイルを指定
!index.html

ファイルの変更を取り消す

# 指定したファイルの変更を取り消す
$ git checkout -- <ファイル名>

# 指定したディレクトリにあるファイルの変更を取り消す
$ git checkout -- <ディレクトリ名>

# 全てのファイルの変更を取り消す
$ git checkout -- .

ステージに追加した変更を取り消す

# 指定したファイルの変更をステージから取り消す
$ git reset HEAD <ファイル名>

# 指定したディレクトリにあるファイルの変更をステージから取り消す
$ git reset HEAD <ディレクトリ名>

# 全てのファイルの変更をステージから取り消す
$ git reset HEAD .

直前のコミットを修正する

# ファイルを修正しステージに追加(git add)してから
$ git commit --amend

リモートリポジトリの情報を表示する

# リモートリポジトリ名を表示
$ git remote

# 対応するURLを表示するオプション
$ git remote -v

リモートリポジトリから情報を取得する(フェッチ)

# リモートリポジトリの情報をローカルリポジトリに取得する
$ git fetch

# 指定したリモートリポジトリの情報をローカルリポジトリに取得する
$ git fetch <リモートリポジトリ名>

# 指定したブランチの情報をローカルリポジトリに取得する
$ git fetch <リモートリポジトリ名> <ブランチ名>

# 取得したリモートリポジトリの情報をワークツリーに反映させる
$ git merge <リモートリポジトリ名>/<ブランチ名>

リモートリポジトリから情報を取得する(プル)

# リモートリポジトリの情報をローカルリポジトリに取得してワークツリーに反映させる
$ git pull <リモートリポジトリ名> <ブランチ名>

# コマンドは省略可能
$ git pull

同様の操作を行うコマンド

$ git fetch <リモートリポジトリ名> <ブランチ名>
$ git merge <リモートリポジトリ名>/<ブランチ名>

リモートリポジトリの詳細情報を取得する

$ git remote show <リモートリポジトリ名>

表示される情報

  • fetchとpushのURL
  • リモートブランチ
  • git pullの動き
  • git pushの動き

リモートリポジトリを変更・削除する

# リモートリポジトリを変更する
$ git remote rename <旧リモートリポジトリ名> <新リモートリポジトリ名>

# リモートリポジトリを削除する
$ git remote rm <リモートリポジトリ名>

ブランチを新規追加する

# ブランチを作成する
$ git branch <ブランチ名>

ブランチの一覧を表示する

$ git branch

# リモートリポジトリを含めた全てのブランチを表示するオプション
$ git branch -a

ブランチを切り替える

$ git checkout <既存ブランチ名>

# ブランチを新規作成して切り替える
$ git checkout -b <新ブランチ名>

変更を取り込む(マージ)

$ git merge <ブランチ名>

# リモートリポジトリにあるブランチの変更を取り込む
$ git merge <リモートリポジトリ名/ブランチ名>

ブランチ名を変更する

作業ブランチの名前を変更する
$ git branch -m <ブランチ名>

ブランチを削除する

# maseter(main)にマージされていない変更が残っている場合ブランチを削除しないオプション
$ git branch -d <ブランチ名>

# 強制削除するオプション
$ git branch -D <ブランチ名>

コンフリクトの解決

  • コンフリクト:管理する複数のデータに、重複や競合が発生している状態
  • コンフリクトを起こしたファイルの内容を書き換える
<<<<<<< HEAD
<p>コンフリクト</p>
=======
<p>conflict</p>
>>>>>>> feature

ファイルが表すもの

  • << HEAD から == が表すもの:HEAD(作業ブランチ)の変更分
  • == から >> feature が表すもの:マージしてきたブランチ(feature)の変更分

変更を取り込む(リベース)

# 親となるコミットを移動して変更を取り込む
$ git rebase <ブランチ名>

マージとの違い

  • マージ:変更内容の履歴(コミット)はそのまま残るが、履歴が複雑化する
  • リベース:履歴は単純になるが、元の変更内容の履歴が消える

タグを付ける

コミットを参照しやすくするために、名前を付ける

# 注釈付きタグ(名前、コメント、署名を付けることができる)
$ git tag -a [タグ名] -m "[メッセージ]"

# 軽量タグ(名前を付けることができる)
$ git tag [タグ名]

# 昔のコミットに後からタグを付ける
$ git tag [タグ名] [コミット名]

# タグのデータを表示する
$ git show [タグ名]

# タグをリモートリポジトリに送信する
$ git push [リモート名] [タグ名]

# タグを一斉に送信する
$ git push origin --tags

作業を一時退避する

作業が途中でコミットしたくないが、別のブランチで作業しないといけない時に使う

$ git stash

# 退避した作業を確認する
$ git stash list

# 退避した作業を復元する(ステージの状況は復元されない)
$ git stash apply

# 特定の作業を復元する(ステージの状況は復元されない)
$ git stash apply [スタッシュ名]

# ステージの状況も復元する
# git stash apply --index

# 退避した作業を削除する
$ git stash drop

# 特定の作業を削除する
$ git stash drop [スタッシュ名]

# 全作業を削除する
$ git stash clear