🐾

初心者がGitについてまとめてみた

2022/05/03に公開

まえがき

背景

プログラミング学習において、GitとGitHubは早い段階で覚えた方がよいと思い取り入れてみたものの、中身をよく理解できないまま当たり障りのないコマンドを使うだけになっている。このままでは意味がないため、アウトプットにより理解を深めるべく、まずはGitについてまとめてみることにする。

目的

  • 自分自身の頭の中を整理し、Gitのコマンドに対する理解を深める。
  • アウトプットすることにより、有識者からのご指導ご鞭撻を期待する。

基本編

リポジトリの初期化

git init

プロジェクトを管理するために、まず実行するコマンド。対象のディレクトリに移動して上記コマンドを実行すると、ディレクトリの中に「.git」という隠しディレクトリが作られる。これがいわゆる「リポジトリ」で、リポジトリの中にファイルの変更履歴を保存していく。
実際に作業しているディレクトリのことをワークツリーと呼ぶ。

ステージング

git add <ファイル名>

ファイルの変更履歴をリポジトリに保存するために、まずはgitで管理したいファイルやフォルダをインデックスと呼ばれるエリアに追加する。これをステージングと呼ぶ。ファイル名に.を指定すれば、ワークツリー内のファイルやフォルダをすべて追加できる。

コミット

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

ファイルの変更履歴をリポジトリに保存するためのコマンド。実行すると、インデックスにあるファイルやフォルダの状態をコミットとしてリポジトリに保存する。「-m」オプションはコミットメッセージを登録するためのもの。
1番新しいコミットを指し示すポインタを「ブランチ」と呼び、現在操作中のブランチを指し示すポインタを「HEAD」と呼ぶ。

確認編

変更履歴

git log

コミットの履歴を表示する。上記コマンドをそのまま実行すると、新しいコミット順に以下のものが表示される。表示を終了するにはqを入力する。

  • コミットID(のようなもの)
  • 編集者の名前とアドレス
  • 登録日時
  • コミットメッセージ

git logには履歴を見やすくするためのオプションがたくさんある。

ワークツリーの状態

git status

ファイルやフォルダを以下の状態ごとに分類して表示する。

  • ステージングしたけどコミットしていないもの
  • 編集したけど、ステージングしていないもの
  • 作成してから一度もステージングしておらず、gitの管理対象外となっているもの
    (あえて外したものを除く)

差分確認

git diff

インデックスとワークツリーとの差分を表示する。

git diff HEAD

ワークツリーとリポジトリのHEADが指し示すコミットとの差分を表示する。

git diff --staged

git diffに「--staged」オプションをつけると、リポジトリとインデックスとの差分を表示する。

git diff <コミットID> <コミットID>

コミット間の差分を表示する。HEADとの差分を確認したい時は、コミットIDを1つだけ指定すればよい。

ブランチ編

ブランチを切る

git branch <ブランチ名>

このコマンドを実行しただけだと、新しくブランチ(コミットを指し示すポインタ)を作るだけでHEADは動かない。

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

git branch

ブランチの一覧を表示する。branchの後ろに「-a」オプションをつけることで、リモート追跡用ブランチの一覧も表示する。
リモート追跡用ブランチについて、詳しくはGitHubについてまとめる時に。

ブランチを切換える

git checkout <ブランチ名>
git switch <ブランチ名>

checkeoutには機能が多く複雑なため、現在、実験的にcheckoutの機能を分割したswitchrestoreが作られている。switchcheckoutの機能のうち、ブランチ切換え機能を持つ。

ちなみに、
ブランチを切り替えると、切り替えた先のコミットの状態がインデックスやワークツリーに反映されるため、手元にコミットしていない作業があれば、一旦コミットするか、一時退避を行う必要がある。

一時退避と復元

手元の作業状態を一時退避させるためには、stashコマンドを使う。ここでは最低限、一時退避とそこからの復元のみ紹介する。

git stash (save)

stash saveで一時退避のコマンドとなる。saveは省略可能。

git stash pop

stash popで一番新しい一時退避データを手元に復元することができる。

ブランチ作成と切換えを同時に行う

git checkout -b <ブランチ名>
git switch -c <ブランチ名>

checkoutコマンドには「-b」オプション、switchコマンドには「-c」オプションをつけることで、それぞれブランチ作成と同時に切換えを行うことができる。

他のブランチの変更を取り込む①merge

 git merge <取り込みたいブランチ名>

mergeは取り込む側のブランチで実行する。取り込む側のブランチの先に、取り込みたいブランチの変更を取り込んだコミットを新しく作成することで、変更を取り込む。

なお、マージしたいブランチ同士で同じ箇所を変更していた場合、コンフリクトが起こり、コンフリクトを解消する必要がある。コンフリクトの解消については経験が浅いため、まとめるのはまたの機会に。

fast-forward(早送り)マージについて

取り込む側のブランチに、取り込みたいブランチとの分岐時点より新しいコミットがなければ、mergeコマンドを実行することで取り込む側のブランチを取り込みたいブランチへ移動させるだけで変更の取り込みができる。これをfast-forward(早送り)マージと呼ぶ。

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

fast-forwrdマージできる場合でも、「--no--ff」オプションをつけることでコミットを作成することができる。

他のブランチの変更を取り込む②rebase

git rebase <取り込む側のブランチ名>

rebaseは、取り込みたいブランチで実行する。実行すると、取り込みたいブランチの過去のコミットの差分を、取り込む側のブランチの先に順番に適用していって、新しいコミットとして移動させる。rebase実行後のブランチは、fast-forwrdマージができる状態となる。

ブランチを削除する

git -d <ブランチ名>

git branchに「-d」オプションをつけることでブランチを削除できる。ただし、安全策としてmergeしていないブランチは削除できなくなっているため、mergeしていないブランチを強制的に削除したい場合には大文字の「-D」とする。

バージョン管理編

ワークツリーをインデックスの状態に戻す

git checkout --<ファイル名>
git restore <ファイル名>

インデックスの状態をワークツリーに反映させる。restorecheckoutの機能のうち、ファイルの復元機能を持つ。checkoutのファイル名の前につける「--」は、その後に指定するものがファイル名かブランチ名かを区別するためのもの。

ワークツリーをHEADの状態に戻す

git restore --staged --worktree

restoreに「--staged --worktree」オプションをつけるとHEADの状態をインデックスとワークツリーに反映させる。

インデックスをHEADの状態に戻す

git reset
git restore --staged

restoreに「--staged」オプションをつけるとHEADの状態をインデックスに反映させる。

resetについて補足

git reset [モード] <コミットの指定>

resetは指定したコミットにHEADを動かすコマンドであり、コミットの指定がない場合、デフォルトは現在のHEADである。また、オプションのモードによりHEADの状態をどこまで反映させるか選ぶことができ、「--soft」(HEADを動かすだけ)、「--mixed」(状態をインデックスにまで反映させる)、「--hard」(状態をワークツリーにまで反映させる)などが選べる。モードを何も指定しない状態では「--mixed」モードとなるため、git resetだけで実行すると、HAEDは動かず、その状態をインデックスに反映させるという動きになる。

指定したコミットの変更を取消す

git revert <コミットの指定>

指定したコミットを取り消した状態のコミットを新しく作成する。

あとがき

自分自身の理解が浅い上にコマンドそれぞれに大量にオプションがあり、ひとつのコマンドでできることがたくさんあるので、どこまでをどうまとめるかや、どう説明するかが悩ましかった。
 また、あらためてアウトプットしてみて、Gitの仕組みは非常に奥深く、今の自分ではまだまだ理解できない部分が多いなと感じた。
 今後もGitを触りながら気づいた点を更新しつつ、次はGitHumとのやりとりについてもまとめたい。

最後に…
ここまで読んでいただいただきありがとうございました。
内容についてお気づきの点などあれば、コメントいただけるとうれしいです🐾

Discussion