「gitなんもわからん」から脱却するための備忘録
※注意:現在git勉強中につき、この記事には誤りが含まれている可能性があります。
基礎知識
ワークツリー
・gitで使う作業用ディレクトリのこと
・ワークツリーには.gitディレクトリが存在する
・.gitディレクトリはgit init
かgit 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と同じコミットを指すように変更されるため、add
やcommit
はせずにpush
できることがわかる
・git push
やgit 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
せずに、専用領域に保持する。わかりやすくまとめられている記事を見つけたので紹介
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