Closed15

Git入門

Hiroki MatsumotoHiroki Matsumoto

Git 基礎

Git はスナップショットを記録している。決して差分ではない!
変更されたファイルをそのまま保存し、変更のないファイルは保存しない仕組み。

参考になる動画

https://www.udemy.com/course/unscared_git/

参考になりそうな記事

https://www.r-staffing.co.jp/engineer/entry/20190621_1

Hiroki MatsumotoHiroki Matsumoto

操作の流れ

ローカルリポジトリ

ワークツリー

ファイルを変更する場所。
MacでいうとFinderの中の特定のフォルダという認識でよかろう。

ステージ

ステージは少しややこしい概念。
コミットする変更を準備する場所。

実際にはファイルそのものをステージに上げるのではなく、(リポジトリに上げた)ハッシュ化された圧縮ファイルとファイル名を紐付けた情報を記録している場所。

git add {FILE_NAME}

でワークツリーのデータをステージに上げることができる。

リポジトリ

コミットの情報の保存場所。
ステージで紐付けた情報をもとにファイル構成を表したファイルを作成して、コミットした情報(誰がいつどんなこと)を保存する。

ローカルリポジトリは、.gitフォルダのことという認識でOKぴ?

git commit -m "optional message"

でステージからリポジトリに変更を記録する

リモートリポジトリ

Hiroki MatsumotoHiroki Matsumoto

ブランチとは

ブランチを切ることで、複数人で他の人の干渉を受けずに開発できる。

現在の作業ブランチのポインタ。
自分が今、どのブランチにいるかがわかるマーク。

Hiroki MatsumotoHiroki Matsumoto

業務ででた意味不明な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
Hiroki MatsumotoHiroki Matsumoto

コミットについて

コミットは直前のコミットの内容を記録している。
だから、履歴をたどって復元できる。

Hiroki MatsumotoHiroki Matsumoto

Gitのデータ構造

  • 圧縮ファイル→git add時に作成される
    追加・変更されたファイルをひとずつ圧縮してリポジトリに保存して、ステージのインデックスと紐付ける
  • ツリー→git commit時に作成される
    データの構造(ファイルやディレクトリなど)を記録したファイル
  • コミット→git commit時に作成される
    誰が何日にどんな変更を行ったと、親コミットを記録したファイル
Hiroki MatsumotoHiroki Matsumoto

基礎

以下のコマンドは省略

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

ステージとコミットの差分を見ることができる。

Hiroki MatsumotoHiroki Matsumoto

エラーコワイ

コンフリクトを解消して、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.

https://qiita.com/chiaki-kjwr/items/118a5b3237c78d720582#状況

エラーメッセージと👆のリンクを参考に、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.
Hiroki MatsumotoHiroki Matsumoto

git checkout

ブランチの変更とファイルの変更両方できるコマンド

--をつけることでファイル名と認識する。ブランチの場合はつけないでOK。

# ファイルを変更する場合
git checkout -- <file name>

# ブランチを変更する場合
git checkout <branch name>

ファイルの変更する場合

変更状態を取り消す。
実態は、ワークツリーをステージと同じ状態にしている。

Hiroki MatsumotoHiroki Matsumoto

ステージした変更を取り消すには

# 直前のステージを全部取り消す
git reset HEAD .

ファイルやディレクトリを指定する場合は.をファイル名またはディレクトリ名にすればOK。

ちなみにHEADとは

最新のコミットのこと

Hiroki MatsumotoHiroki Matsumoto

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 mergegit fetchを同時に行うコマンド。
基本的には使うのは避けたほうがよさげ。

意図しないマージが起こる可能性がある。
使う場合は、自分がいるブランチとgit pullするリモートブランチを確認してやるべき。

基本的にはgit fetchをつかえ!

Hiroki MatsumotoHiroki Matsumoto

ブランチとマージを知るお

最初はつまずきやすい難し概念

ブランチを知るお

ブランチを利用するメリットは、複数人で同時に違う部分・機能を開発・修正できること。
また、ブランチは他のブランチの変更に影響が出ない。これが大きい。

ブランチを理解するお

その前に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種類のマージ

  1. 基本的なマージ
  • 枝分かれしたときのマージ
  1. 早送りになるマージ
  • ポインタを前にすすめるだけのマージ
  • 分岐しなかったときのマージ
  1. コンフリクト
このスクラップは2022/04/13にクローズされました