見出し画像

【これだけは知っておきたい】Gitの頻出コマンド&Tips集

今回のテックブログは、知っておいて損はない「Gitのコマンド&Tips集」です。なんとなく使ってたけど、そもそも「HEAD」「ブランチ」「タグ」って何だっけ?「.gitconfig」の設定してる?おすすめの設定項目とは?
この親切まとめで、ぜーんぶ解説します!

はじめに

こんにちは。メディア研究開発センターの松原です。
弊社では先日、新人研修が終わり、フレッシュな新人が配属されてきました。今回は新人向けに知っておきたいGitの基礎的なコマンドやGitに関するTipsなどについて紹介しようと思います。​

想定読者

・Gitをなんとなく使うようになったけどよく分からない人
・cloneとaddとcommitとpullとpushくらいしか使ったことない人

押さえておきたい用語

リポジトリ
 Git push origin masterの変更が記録されている場所のことです。Gitは分散型のVCSで、中央のリモートリポジトリを中心に、各ユーザーがそれぞれのローカルリポジトリを持ちます。

1. 各ユーザーがcloneでローカルリポジトリを複製する
2. 各ユーザーがcommitやmergeを行いローカルに変更を記録する
3. 各ユーザーがリモートリポジトリ(ベアリポジトリとも呼ばれる)にpushすることで変更を反映する
4. 各ユーザーがfetchやpullなどを行いリモートに記録された変更をローカルに反映する
(=> 2, 3, 4の繰り返し)

というサイクルを通じて分散的に協調しながら変更を行なっていきます。
リモートリポジトリはGitHub、GitLab、BitBucket、CodeCommitなどのサービスで用意されたものを使うことが一般的です。

コミット
 Git push origin masterに記録される変更のことです。全てのコミットはハッシュ(SHA-1)としてGitに記録されています。
例) 6576c9d2de2413a0bbd78d47c822232586f279ba

HEAD、ブランチ、タグなどは特定のコミットに対するハッシュへのポインタに付けるエイリアス(別名)です。
ただし、ブランチの場合はコミットによってそのポインタが更新されていきます。まさしくブランチ(枝)の如くツリーから分岐していき、成長していくイメージです。​

git branch fuga origin/hoge は「リモートブランチのorigin/hogeが指す何らかのコミットハッシュに対してfugaという名前のブランチを作成する」といった意味となります。
git checkout -B hoge 6576c9 も同様に「特定のコミットハッシュ`6576c9`に対して`hoge`というブランチを作成し、さらにチェックアウトする」となります。

ブランチ
 git push origin master の変更を記録していく名前付きのワークスペースです。
Gitの運用フローにもよりますが、main(master)、feature/xxx、develop、release、といった名前を付けて役割を持たせたりします。

また、以下のように属性によって名前を分けて呼ぶこともあります。

カレントブランチ: 現在自分がチェックアウトしているブランチ(HEAD = 何らかのブランチ)
ローカルブランチ: ローカルリポジトリにあるブランチ(mainなど)
リモートブランチ: リモートリポジトリにあるブランチのコピー(origin/mainなど)

タグ
 Git push origin masterのある特定の時点のコミットを示す名前付きのアーカイブです。
リリースバージョンと連動させて作ったりします。(v1.0.0など)

HEAD
 現在自分が作業している場所(コミット)を示すポインタです。
大体の場合、カレントブランチと等しくなります。

抑えておきたいGitコマンド

モチベーション
VSCodeやSourcetreeなどGUIベースのツールを通じてGitの作業を行っている場合、あまり直接使う機会は多くないかもしれません。自分もaddやcommitなどはVSCode上で作業することが多いです。が、特定のUIに依存せずに使えるので、覚えておいて損はないです。

git status
 HEADの状態を取得します。

git branch
 git branch でローカルブランチを表示します。
 git branch -r でリモートブランチを表示します。
 git branch ${ブランチ名} origin/${ブランチ名} でリモートブランチからローカルブランチを作成します。
 git branch -m ${変更前ブランチ名} ${変更後ブランチ名} でローカルリポジトリのブランチ名を変更します。

git checkout
 git checkout ${ブランチ名} でカレントブランチを対象のブランチに切り替えます。
 git checkout -B ${ブランチ名} origin/${リモートブランチ名} でリモートブランチをベースに新しいブランチを作成し、カレントブランチを切り替えます。

git fetch
 リモートリポジトリから最新のリモートブランチの取得をします。
pullと違い、現在の作業ファイルには変更はありません。
 git fetch -p で既にリモートリポジトリから削除されたブランチをローカルリポジトリから削除することが出来ます。(prune)

git pull
 カレントブランチに紐づいているupstreamのリモートブランチを取得し、カレントブランチにマージします。
upstreamのリモートブランチは`git branch -vv`で確認することができます。
upstreamが意図したものと異なっていたりすると意図しないマージが発生することがあるかもしれません。(configで制御できます)

git merge
 ローカルブランチやリモートブランチなどをカレントブランチにマージします。マージコミットが発生しないfast-forward(早送り)マージとマージコミットが発生するnon-fast-forwardマージがあります。

git init
 現在のディレクトリに.git ディレクトリを作成し、配下のファイルをGitでバージョン管理出来るようにします。

git add
 ステージング(コミット対象)にファイルを追加します。

git commit
 ファイルの変更をローカルに記録します。
 コミット後に修正したいファイルをaddした後、
 git commit --amend すると直前のコミットを修正することが出来ます。

git revert
 直前のコミットを取り消すコミットを新しく作ります。
 直前のコミットがマージコミットだった場合、
 git revert -m 1 といったオプションの指定を行います。

git reset
 ファイルの変更を伴わないソフトリセット(--hard オプションなし)
 ファイルの変更を伴うハードリセット(--hard オプションあり)
 の2種類があります。

 ・git reset の場合、ステージング(addしたもの)状態がリセットされます。現在の作業ファイルに変更はありません。
 ・git reset HEAD^ の場合、ステージング状態がリセットされ、カレントブランチのコミットが1つ戻ります。現在の作業ファイルに変更はありません。
 ・git reset --hard の場合、ステージング状態がリセットされます。現在の作業ファイルが現在のコミットの状態に戻ります。

git push
 ローカルブランチ・タグなどをリモートリポジトリに記録します。
 ・git push origin ${ブランチ名} で対象のブランチをpushします。
 ・git push origin head で現在のブランチをpushします。
 ・git push origin head:${ブランチ名} で現在のブランチを任意のブランチ名でpushします。
 ・git push origin :${ブランチ名} でリモートブランチを削除します。(空を送信するイメージ)
 ・git push origin --delete ${ブランチ名1} ${ブランチ名2} でリモートブランチを複数削除できます。

git merge
 特定のブランチをカレントブランチにマージします。

Gitに関するTips

gitalias
 Gitのエイリアス集です。
  git branch -> git b
  git checkout -> git o
 など、よく使うGitコマンドの入力を省略化出来ます。
 コマンドラインでGitよく使う方には是非おすすめ。

 GitHubリポジトリ: https://github.com/GitAlias/gitalias

hub
 GitHubに特化したcliツールです。
  hub pr checkout ${PR番号}
 など、対象のプルリクエストをチェックアウトしたり出来ます。

 Gitコマンドと統合して
  git pr checkour ${PR番号}
 とすることもできます。

 GitHubリポジトリ: https://github.com/github/hub

.gitconfig
 $HOME に配置するGitの設定ファイルです。
 dotfile化などしておくと良いかもしれません。
 以下は自分の中での推奨設定項目となります。(一部省略)

[user]
  name = Your Name
  email = example@example.com
[core]
  # ファイル名の大文字小文字を区別する
  # デフォルトでは区別してくれないため、リネーム時に問題が起きやすい
  ignorecase = false
  # 改行コードを自動で変更しない
  autocrlf = false 
  # 改行コードの混在を許可しない
  safecrlf = true
[color]
  ui = auto
[fetch]
  # fetchした時にリモートリポジトリから削除済みのブランチの参照を削除する
  prune = true
[include]
  # gitaliasの読み込み
  path = gitalias/gitalias.txt
[pull]
  # git pull時にfast-forwardな状態のみマージを行う
  ff = only
[init]
  defaultBranch = main

まとめ

つらつらとよく使うコマンドなどやTipsなどを挙げてみました。

日々プログラミング言語やフレームワーク、各種ツールの流行が変化していく中、Gitは十数年において使われ続けていますし、今後もしばらくは使われ続けるんじゃないかと思っています。

序盤の方にも書きましたが、「HEAD、ブランチ、タグなどは特定のコミットに対するハッシュへのポインタに付けるエイリアス(別名)です。
というのが自分の中で腹落ちしたときに、Gitがチョットワカル状態になりました。また、SourceTree、GitKraken、Fork、TortoiseGitなどGUIベースのツールを使い、実際にGitのコミットグラフを眺めながら作業することも理解を助けると思います。

ここでは取り上げませんでしたが、fast-forwardの概念なども理解しておくとより作業しやすくなると思います。良きGitライフを!

(メディア研究開発センター・松原浩平)