📄

「gitなんもわからん」から脱却するための備忘録

2022/07/23に公開

※注意:現在git勉強中につき、この記事には誤りが含まれている可能性があります。

基礎知識

ワークツリー

・gitで使う作業用ディレクトリのこと
・ワークツリーには.gitディレクトリが存在する
 ・.gitディレクトリはgit initgit cloneをすることで作成される
・git上で管理するファイル、ディレクトリはすべてこのワークツリーに配置する

インデックス

・ローカルリポジトリに反映させたいファイル、ディレクトリを保持しておく領域
・ワークツリーからインデックスにファイル、ディレクトリを反映させることになる
 ・この操作をステージングという
・(git commitによって)インデックスからローカルリポジトリに内容を反映させると、反映したファイル及びディレクトリはワークツリー及びインデックスから削除される(ただしgit commitをすることで、作業ブランチの最新コミットにそのディレクトリ及びファイルの情報が反映されるため、他のブランチにチェックアウトしない限りはワークツリーからは削除されない)

ローカルリポジトリ

・ローカルマシン上にあるリポジトリのこと(ここでいうリポジトリとはいわばgit用記憶領域)
 ・一郎さんと二郎さんがそれぞれ自身のパソコンを使った場合、両者は異なるローカルリポジトリを使用することになる
・ファイルやディレクトリの変更情報の集合体 (この変更情報のことをコミットと呼ぶ)
・ローカルリポジトリの内容はWeb上には公開されない
 ・ローカルリポジトリの内容をリモートリポジトリに反映させることでリポジトリがWeb上に公開される

リモートリポジトリ

・Web上に存在するリポジトリ
・このリポジトリに反映済みの内容がWeb上に公開される

ローカルブランチ

・ローカルリポジトリにあるブランチ
・その正体はローカルリポジトリの特定のコミットを指すポインタ
・一郎さんと二郎さんがそれぞれ自身のパソコンを使い、両者ともにAブランチというローカルブランチを作成したとしても、両者のAブランチがともに同じローカルリポジトリのコミットを指すとは限らない
・複数のローカルブランチを作成し、そのうちの一つを作業ブランチとするが、適宜作業ブランチは切り替え可能
・作業ブランチによってワークツリーの内容が変更される

リモート追跡ブランチ

・ローカルリポジトリ内にorigin/master等の名称で作成されるブランチ
・リモートリポジトリ上にあるブランチを追う

リモートブランチ

・リモートリポジトリ上にあるブランチ
・ローカルリポジトリ上にあるorigin/<ブランチ名>で追跡される

ローカルリポジトリの情報をリモートリポジトリに追加反映するまでの流れ

git add <ファイル名orディレクトリ名>(変更をリモートリポジトリに反映させたいファイル、ディレクトリをインデックスに登録する)
git status(リモートリポジトリに反映したいファイルがステージングされていることに加え、ないファイル、ディレクトリに覚えのない差分が生じていないことを確認)
※ ここで覚えのない差分を発見した場合、git diff --cached <ファイル名orディレクトリ名>を実行し、差分の詳細を確認する
git commit -m "コミットメッセージ"(現在ステージングされているファイル、ディレクトリをチェックアウト中ブランチの指すコミットよりも一つ新しいコミットとしてローカルリポジトリに反映する)
git log --all(チェックアウト中のブランチが指すコミットを確認 ※先程のgit commit -m "コミットメッセージ"の内容が表示され、そのコミットがHEADになっていることを確認する)
git push(チェックアウト中のブランチが指すローカルリポジトリ中のコミットを、対応するリモートブランチが指すコミットとして反映させる)

押さえておきたいこと

git checkout <ブランチ名>

・作業ブランチを<ブランチ名>に切り替える

・ブランチが切り替わるだけでなく、切り替え先(チェックアウト先)のブランチが指すコミット(最新コミット)にしたがってワークツリーの内容が変更されることに留意すること
・つまり、切り替え前のブランチが指すコミットには存在するが切り替え後のブランチが指すコミットには存在しないといったファイルは、ブランチを切り替えた際にワークツリー上から消える
 ・元のブランチに切り替えるとワークツリー上に復活する

・切り替え前のブランチと切り替え後のブランチに同じ名称で"中身も同一"のファイルが存在し、片方のブランチでそのファイルを編集もしくは削除した後、"コミットをせずに"ブランチを切り替えると、ワークツリー上でそのファイルへの編集内容もしくは削除した事実は維持される

・切り替え前のブランチと切り替え後のブランチに同じ名称の"中身が異なる"ファイルが存在し、片方のブランチでそのファイルを編集もしくは削除した後、"コミットをせずに"ブランチを切り替えようとするとエラーになる

・当然だが、gitの管理下にないファイルについてはブランチ切り替えによる影響を受けない

・なお、git checkout .を実行すると、ワークツリーの変更を元に戻すことができる

git pull <origin ブランチ名>

git fetch origin <他のリモートブランチ名>をしてからgit merge FETCH_HEADをすることに等しい
・過去にはgit fetch origin <他のリモートブランチ名>をしてからgit merge <origin/チェックアウト中ブランチ名>をすることに等しかったかも
git fetch <他のリモートブランチ名>で取得した情報がFETCH_HEADの指すコミットとなるか、origin/<チェックアウト中のブランチ名>の指すコミットとなるかの違いがあった?

git fetch origin <他のリモートブランチ名>は、指定された名前のリモートブランチが指すコミットを、チェックアウト中のブランチに対応するリモート追跡ブランチが指すコミットに対して追加反映する操作

git merge FETCH_HEADは、FETCH_HEADの指すコミットにしたがってワークツリーの内容を変更した後、ステージング(gid add)及びローカルリポジトリへの適用(git commit)を行ってくれる

・以上を踏まえると、git pull <origin 他のリモートブランチ名>によって生じた差分をリモートのブランチに反映する場合、git merge FETCH_HEADが行われることでチェックアウト中のブランチがFETCH_HEADと同じコミットを指すように変更されるため、addcommitはせずにpushできることがわかる

git pushgit pullで後ろに何も付けずに実行することはorigin <チェックアウト中のブランチ名>を後ろに付けて実行した場合とおそらく等しい

git branch -u origin/<チェックアウト中のブランチ名>

・チェックアウト中のブランチがorigin/<チェックアウト中のブランチ名>の追跡するリモートブランチを追跡するようになる
・origin/<チェックアウト中のブランチ名>を追跡するようになるわけではない
・これにより、リモート追跡設定されたブランチについてはorigin表記を省略することが可能となる
例1) git push origin <チェックアウト中のブランチ名> --> git push
例2) git pull origin <チェックアウト中のブランチ名> --> git pull

よく使うコマンド

git log --all

--allを付けない場合には、現在チェックアウト中のローカルブランチが指すコミットまでのログを表示する
・その場合、ログの一番上に表示されるものはあくまでチェックアウト中のブランチにおける最新のコミットまでであり、それよりも先に進んでいるブランチや、枝分かれしている他のブランチが指す最新のコミットまでのログが表示されるわけではないことに注意すること
--allを付けることでローカルリポジトリ全体における最新のコミットまでのログが表示される。そのため、基本的には--allを付けることが望ましい
・また、git log --graph --allとすることでビジュアルなログを表示することができる

git merge -Xtheirs <ブランチ名>

・マージしてコンフリクトする箇所があるなら、その箇所について<ブランチ名>の内容を優先してマージを行う。オートマージ出来る部分についてはオートマージされる
・なお、<ブランチ名>ではなく、現在チェックアウト中のブランチの内容を優先する場合には-Xoursを指定してやればよい

git stash

・変更内容をgit commitせずに、専用領域に保持する。わかりやすくまとめられている記事を見つけたので紹介
https://qiita.com/chihiro/items/f373873d5c2dfbd03250

git rm <ファイル名>

・ワークツリーに存在するファイルを消し、リモートリポジトリ上からも当該ファイルを削除する
git rmコマンド自体に「ファイルをワークツリーから消して、"ワークツリーから当該ファイルを消した"という情報をaddする」といった工程があるため、addは不要でcommit -> pushしてよい
・なお、ワークツリーからファイル自体は消さずにリモートリポジトリからは削除したい(gitでの管理をやめたい)場合には、gir rm --cached <ファイル名>コマンドを用いればよい

git blame <ファイル名>

・指定したファイルの中身を1行ごとに表示し、各行のコミット履歴情報を確認できる
・左から順に コミット識別子、(コミットした者の名前、日付 時刻、当該行数)、中身

1st.txtの中身
ファーストコミットだよ~
1st.txtの中身を修正~

git blame 1st.txtの実行結果
^83c4220 (squid0729 2022-07-23 04:55:48 +0900 1) ファーストコミットだよ~
0fad7057 (squid0729 2022-07-23 05:17:04 +0900 2) 1st.txtの中身を修正~

気が向いたら続きを書きます。
ここまでで誤りや不足があればご指摘頂けると、とーってもよろこびます。

Discussion