Git入門
Git 基礎
Git はスナップショットを記録している。決して差分ではない!
変更されたファイルをそのまま保存し、変更のないファイルは保存しない仕組み。
参考になる動画
参考になりそうな記事
操作の流れ
ローカルリポジトリ
ワークツリー
ファイルを変更する場所。
MacでいうとFinderの中の特定のフォルダという認識でよかろう。
ステージ
ステージは少しややこしい概念。
コミットする変更を準備する場所。
実際にはファイルそのものをステージに上げるのではなく、(リポジトリに上げた)ハッシュ化された圧縮ファイルとファイル名を紐付けた情報を記録している場所。
git add {FILE_NAME}
でワークツリーのデータをステージに上げることができる。
リポジトリ
コミットの情報の保存場所。
ステージで紐付けた情報をもとにファイル構成を表したファイルを作成して、コミットした情報(誰がいつどんなこと)を保存する。
ローカルリポジトリは、.git
フォルダのことという認識でOKぴ?
git commit -m "optional message"
でステージからリポジトリに変更を記録する
リモートリポジトリ
ブランチとは
ブランチを切ることで、複数人で他の人の干渉を受けずに開発できる。
HEAD
現在の作業ブランチのポインタ。
自分が今、どのブランチにいるかがわかるマーク。
git rebase とgit chery-pick について
git
コマンド
業務ででた意味不明なgit stash
git stash pop
git stash drop
git merge --continue
git rebase --abort
git rebase --continue
コンフリクトが起きた時にやった👇の流れは何をしているの?
// コンフリクト解消
git add .
git rebase --continue
変更取り込んだあとに👇の流れは何?
// VSCodeのソースコード管理→現在の変更を取り込む
git merge --continue
コミットについて
コミットは直前のコミットの内容を記録している。
だから、履歴をたどって復元できる。
Gitのデータ構造
- 圧縮ファイル→
git add
時に作成される
追加・変更されたファイルをひとずつ圧縮してリポジトリに保存して、ステージのインデックスと紐付ける - ツリー→
git commit
時に作成される
データの構造(ファイルやディレクトリなど)を記録したファイル - コミット→
git commit
時に作成される
誰が何日にどんな変更を行ったと、親コミットを記録したファイル
基礎
以下のコマンドは省略
git init
git add
git commit -m ""
git push
git commit
の真実
今になって知ったgit commit
をメッセージオプションなし、つまり無印の状態で実行するとvimエディターが立ち上がる。
メッセージは、iでインサートモードにして、一行目に書けば良い。
書き終わったらctrl + cもしくはescでインサートモードを終了して :qw コマンドでvimエディターを終了するとgit commitが完了する。
こんなの知らなかった!
vimを知った今、めちゃくちゃ便利に感じる。
しかも改行できるし。
git status
リポジトリとステージの状態を見ることができる。
VSCodeをだと、ステージングの状態が視覚的に見えるからあまり使わない?
git diff
リポジトリとステージの差分を見る事ができる。
オプションでファイル名を渡すことができる。
git diff --staged
ステージとコミットの差分を見ることができる。
git merge --rebase <ブランチ名>
をしてと言われて、わからなかったので調べたこと
業務で
エラーコワイ
コンフリクトを解消して、1コミット後pushしようとしたらエラーが…
error: failed to push some refs to 'url'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
エラーメッセージと👆のリンクを参考に、pullしたら再度エラーが…
hint: Pulling without specifying how to reconcile divergent branches is
hint: discouraged. You can squelch this message by running one of the following
hint: commands sometime before your next pull:
hint:
hint: git config pull.rebase false # merge (the default strategy)
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
git checkout
ブランチの変更とファイルの変更両方できるコマンド
--
をつけることでファイル名と認識する。ブランチの場合はつけないでOK。
# ファイルを変更する場合
git checkout -- <file name>
# ブランチを変更する場合
git checkout <branch name>
ファイルの変更する場合
変更状態を取り消す。
実態は、ワークツリーをステージと同じ状態にしている。
ステージした変更を取り消すには
# 直前のステージを全部取り消す
git reset HEAD .
ファイルやディレクトリを指定する場合は.
をファイル名またはディレクトリ名にすればOK。
ちなみにHEADとは
最新のコミットのこと
git commit <ahead>
GitHubを活用する
git remote
ローカルリポジトリと連携しているリモートリポジトリの情報を確認できる
git remote -v
リモートリポジトリを新規追加
一つのローカルリポジトリに複数のリモートリポジトリをつなげることができる。
git remote add <remote name> <remote url>
ローカルリポジトリのリモートリポジトリ名の変更と削除
git remote rename <repo name> <new repo name>
git remote rm <repo name>
リモートリポジトリの色んな情報が見れるshow
コマンド
git remote show origin
# こんな感じの情報が見れる
* remote origin
Fetch URL: git@github.com:hrkmtsmt/git-tutorial.git
Push URL: git@github.com:hrkmtsmt/git-tutorial.git
HEAD branch: main
Remote branch:
main tracked
Local ref configured for 'git push':
main pushes to main (up to date)
git fetch
ワークツリーには反映されない、リモートリポジトリの情報をローカルリポジトリの情報を更新するだけ
git fetch
git pull
git merge
とgit fetch
を同時に行うコマンド。
基本的には使うのは避けたほうがよさげ。
意図しないマージが起こる可能性がある。
使う場合は、自分がいるブランチとgit pull
するリモートブランチを確認してやるべき。
基本的にはgit fetch
をつかえ!
ブランチとマージを知るお
最初はつまずきやすい難し概念
ブランチを知るお
ブランチを利用するメリットは、複数人で同時に違う部分・機能を開発・修正できること。
また、ブランチは他のブランチの変更に影響が出ない。これが大きい。
ブランチを理解するお
その前にGitの仕組みを復習
- Gitはスナップショットでデータを保存している
- コミットはスナップショットと前コミットの情報を持っている
それにより過去のデータが辿れる
ブランチはコミットそのものを指し示すポインタ。コミットIDを記録したファイルのこと。
決してフォルダ的なものではない。
HEAD
とは今時分がいるブランチを指し示すポインタ。現在のブランチの情報を記録したファイルのこと。
ちなみに「コミットIDを記録したファイル」と「現在のブランチの情報を記録したファイル」はリポジトリの中に記載されている。
# コミットIDを記録したファイル
.git/HEAD
#現在のブランチの情報を記録したファイル
.git/refs/
git branch
# 新規ブランチを作成できるコマンド
# ただし、新規ブランチには移動しない
git branch <branch name>
# ブランチがどのコミットにいるか確認できる便利コマンド
git log --oneline --decorate
git checkout <branch name>
ブランチを変える = HEAD
が指すブランチを切り替える
# 新規ブランチを作成して新規ブランチに切り替える
git checkout -b <new branch name>
マージを知るお
他のブランチの内容を取り込む。
3種類のマージ
- 基本的なマージ
- 枝分かれしたときのマージ
- 早送りになるマージ
- ポインタを前にすすめるだけのマージ
- 分岐しなかったときのマージ
- コンフリクト