Gitの基本

はじめに

今までGitHub含め仕組みを一切理解せず使ってきたので、そろそろ理解したいなと思い勉強してみました。

※7/7 3か月ぶりに追記しました。(読み返したところ、当時はほんとに理解できていなかったので。。。)

👇関連記事

Gitを複数のアカウントで利用(プルリク)してみる。

Git

✅Gitとは

バージョン管理システム。コミットというセーブポイントを沢山設けることができ、以前の状態に戻すこともできる。

※GitHubはGitのホスティングをしてくれるサービス。

✅特徴

分散型バージョン管理システム(複数人が並行して作業を進められる。)

✅メリット

共同作業の実現。ファイルを1まとめにしてくれる。
修正の履歴がバックアップされる。前の状態に戻せる。

基本的な使い方(流れ)

コミット編

リポジトリ作成
→コミットしたいファイルをステージ(add)
→メッセージを記載してコミット(ローカルではこれでコミットが保存される)

コミットメッセージの書き方はコチラ参照  1行目概要、3行目に詳細(理由)

ブランチ編

ブランチ作成
→ブランチを切り替える(チェックアウトと呼ぶ)
→コミット

大事→新しいブランチを作成する際はブランチ元にチェックアウト(切替)して、最新かつクリーンの状態を確認すること

知っておくと良さそうなこと

・最初のローカルブランチは必ずmasterと命名される。(リモートブランチはorigin)
・HEADは現在作業している場所を示すポインタ。

👇.gitignoreでリポジトリで変更を検知しないファイルを指定できる。

test.md // 特定のファイル
test/ // 特定のディレクトリ
test/test2.md // 特定のファイルを相対パスで設定
!test.md // 指定から外す
*.md // .mdファイルをすべて除外

ざっと用語まとめ

ヘッド:現在チェックアウトされているコミット(作業中のコミット)を指す単語。普段は、ブランチ名を指す。

リポジトリ:Gitによって管理されているフォルダのこと(.gitが含まれる)。PC上にあるものをローカルリポジトリ、GitHubなどサーバ上にあるものをリモートリポジトリと呼ぶ。

コミット:ファイルやフォルダの追加・変更をリポジトリに記録する。実行すると差分を記録した「コミット」が作成される。

ステージングエリア(登録する作業をインデックス):次にコミットされるファイルを保存しておく場所。※コマンドは”git add”

※stage(ステージ)はindex(インデックス)と呼んだりも。
※厳密にはstageした内容を保持する「index」

プッシュ:ローカルリポジトリでコミットした内容をGitHubのリポジトリ(リモートリポジトリ)に反映させる。

ブランチ:タスクごとに併行で作業を進めるためにコミットの流れを分岐させたもの。本流の開発を邪魔することなく開発できる。
※ブランチを作成する際にmasterブランチは最新の状態にしておくこと(ブランチもコミットを指すポインタであるため)。

マージ:ブランチを合体させること。

コンフリクト:複数の人が同じ場所を変更してGitがマージ(合体)できなくなった状態のこと。

クローン:リモートリポジトリをローカルリポジトリに複製すること。自身のパソコン上で作業できる。

フォーク:他人のリポジトリを自分のアカウントのリモートリポジトリにコピーすること。本流の開発に影響を与えずに開発できる。

プルリクエスト:共同作業する際に活用。作業を行っているブランチから、マージしたいブランチに対してマージを依頼すること。(※GitHubの機能)

フェッチ:リモートリポジトリにあるすべてのブランチの状態を、現在のローカルリポジトリに影響を与えることなくすべて取得する機能。

issue:ディスカッションに使え、Pull Requestやコミットと関連付けもできる。更に、Issue番号を記述すると、その課題に対する変更点や進行具合を一覧表示できる

コマンド

✅マストで使うもの(※個人開発・独学中も使った)

リポジトリの作成

git init

ファイルやディレクトリをステージに登録

次回のcommit対象にするコマンド

“.”を指定するとサブディレクトリも含めたすべてのファイルをステージングエリアに登録できる。-pや-iオプションあり。

git add <ファイル名>

※Aオプションはプロジェクト全体。”.”はカレントディレクトリ以下になるので注意。参考

ステージングエリアに追加されたファイルをコミット

-aオプションで変更されたファイル(新規ファイル除く)を検出してステージングエリアに追加し、コミットできる。-mでメッセージも付けられる。

git commit

ブランチの一覧表示

git branch

既存リモートリポジトリの複製

※ローカルで作業する際に使う。

git clone <URL>

リモートリポジトリの追加

git remote add <リモート名> <URL>

リモートリポジトリにブランチ作成/変更反映

コミットをアップロードして反映させる。-uオプションで対象のブランチをリモートリポジトリに追跡。

git push <リモート名> <ブランチ名> ※デフォルトは origin master

✅知っておくと便利(※現場では使うやつ)

変更内容を把握する

git diff

※前回コミットした時点からのファイル(※中身)の変更点を表示する。

変更されたファイルの一覧表示

git status

※前回コミット時から変更されたファイルのみ表示する。

赤字で表示されれば変更がコミットされていない。
緑で表示されれば変更が適用されている。

コミット履歴を表示する

> git log
commit 482fb7171~~~~~~~~ (HEAD -> master)
Author: cho <@yahoo.co.jp>
Date:   Tue Jul 7 22:52:39 2020 +0900
    test

※変更内容含めて表示したい場合はgit log -pを使えば表示できる。Qキーで終了。

✅リモートの変更を取得する際使うコマンド

remoteの登録リポジトリ確認

git remote -v
origin ssh://git-~~~~~~~~~~~~~~~~~~~~(fetch)
origin ssh://git-~~~~~~~~~~~~~~~~~~~ (push)

差分をfetch 参考

git fetch origin

※remote -vで確認できた対象のリモート名を指定

マージ

git merge origin/<マージしたいブランチ名>

取消関連深掘り

変更を元に戻すには”git reset”と”git revert”の2つの方法がある。

resetはブランチのポインタを後方に移動。

git reset HEAD~1

※前のコミット含め削除するので上書きのイメージ。
→ほかの人も使っているリモートのリポジトリに対してはできない。

revertは巻き戻した内容を新しいコミットとして作成する。

git revert HEAD

※新しいコミットは戻すのに必要な
→ほかの人と共有する場合はrevertを利用する。

ステージ編

参考:git ステージの取り消し

リポジトリのHEADの内容をステージにコピーする

git reset

特定のファイルだけHEADの状態に戻す

git reset --ファイル名

ステージングエリアへの移動だけでなくコミットも消す

git reset --hard (戻りたいコミットのコミットコード)

コミット編

参考:git commit を取り消して元に戻す方法、徹底まとめ

①直前のコミットを取り消す

git reset --soft HEAD^

softオプションで作業ツリーとインデックスをそのままに、ブランチの先頭のみ変更。

②過去のコミットの直後に戻す

git reset --hard HEAD^

HEADのみではなく、インデックスや作業ツリー上の変更もすべて取消。

※変更内容がすべて消えるため要注意

③直前コミットの上書き

git commit --amend

現在のHEADが指すコミットを破棄して、新しいコミットを作成。

マージに関して深掘り

※別のコミットを指している2つのブランチを統合。

git merge bugFix

※masterブランチで作業している場合、bugFixブランチをmasterブランチにマージしている。

※マージのイメージ
c0
│
c1  ┐
│  │
c2  c3 
│  │
└  c4

上記のようにc2(bugFix)とc3(master)が統合されてc4(master)が作成されている。

この状態だとbugFixブランチは最新の状態になっていないので最新化。
※内部的にはbugFixのポインターをc2からc4に移動させるだけ。

git checkout bugFix
git merge master

マージの代わりにリベース

マージするコミットのコピーを取ってどこかに落とすイメージ

git rebase master // bugFix上で行う
git checkout master
git rebase bugFix // master上で行うことで

🙄コマンドを打った際のブランチが指定したブランチに合体するという点は認識間違い起こりそうなので注意ですね!!

前述のマージのイメージではc2とc3が枝分かれしているが、リベースを使うとc2とc3が合体して、c3’として新しく作成される。

※リベースのイメージ
c0
│
c1
│ 
c2 (c3※合体する別ブランチのコミット)
│
c3'

 

コンフリクト編

参考:Git コンフリクト解消手順

大前提知識

【初心者向け】git fetch、git merge、git pullの違いについて

fetchもpullもリモートリポジトリから最新情報をローカルに持ってくる。

リモートから最新情報をローカルに持ってくるのですが、場所は「master」ブランチではなく、「origin/master」ブランチに取り込まれます。

  • 「master」ブランチ…ローカルの中心となる統合ブランチで、他のローカルの作業ブランチと繋がったもの。
  • 「origin/master」ブランチ…ローカルにある、リモートのmasterブランチを追跡するリモート追跡ブランチ

git pullはgit fetchとgit mergeを同時に行ってくれるコマンド

※リモートから取り込む際はプロジェクトリーダがだいたいgit管理するので、どちらのコマンドを使うかはプロジェクトごとに変わるとのこと。

HEADの分離

git checkout <ブランチ名>ではなくgit checkout <コミット名>とすることで分離される。

コミットのハッシュを確認するにはgit logを使う。

※ハッシュはユニークな存在だと確認できるだけの文字数のみでOK。

相対リファレンスを使うことも可能(HEADやbugFixブランチなど)。

1つずつ上へ移動させる^(カレット)

git checkout HEAD^

複数回上へ移動させる~<num>

git checkout HEAD~4

ブランチを強制的に移動

git branch -f master HEAD~3
git branch -f <移動したい対象ブランチ> <移動先>
// masterブランチを強制的にHEADより3つ前に移動する

※-fオプションでブランチを直接コミットに関連付けできる

 

その他なるほど!となったこと

✅なぜステージングが必要なのか?

コミットには、コミットメッセージにそぐわない無関係の変更を含むべきではありません。ですがときに作業の都合により、ワーキングツリーに大量の変更が積まれてしまうことがあります。ステージングはその中からコミットに含めたい変更を選別する作業といえます。

参考:git add ってなんのためにやるの? Gitの「ステージング」をイラストで解説します!

🙄普段”git add . “ですべてステージングしてしまっていたので、今後はコミットに含めるべき変更を選別して作業していきたいと思いました。

 

参考

💻Learn Git Branching

オプション含め一部非対応のコマンドもあるが、手を動かしながら学ぶことができる!!

※手順通りに打たないと正解にならないが、それも含めて勉強と思えばとても良い!!

📚サルでもわかるGIT入門
Sourcetreeを使ってGitHubの仕組みを理解していく。コマンドラインで学習したい方には向いていないかも。。。
ただ用語の理解とかはしやすい。
また、付録としてコマンドラインで使う方法を紹介。付録-2のコマンドリファレンスは便利。

📚Web制作者のためのGitHubの教科書
こちらもSourcetreeを使ってGitHubの仕組みを理解していきます。
前述の書籍との違いはSourcetreeを使いつつも並行してGitコマンドを紹介してくれているところ。
共同開発のイメージを付けるのであればこちらを読むほうが良さそう。より実践的。

GitのHEADとは何者なのか

Gitのコミットメッセージの書き方

リポジトリのcloneとforkの違い

Git – originとmasterとは何か(初心者向け)

git commit を取り消して元に戻す方法、徹底まとめ

ステージを理解して git をもっと便利に使う

おわりに

コマンドを使わずにGUIで操作できるSourcetreeを使うことが今は定番ぽい

備忘録

Learn Git Branch level rampup4

git reset HEAD~1 // もしくはHEAD^
git checkout pushed
git revert HEAD

コメントを残す