Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git入門

mina
July 23, 2021

 Git入門

大学サークルのイントロ用資料です
Gitに入門します
resetやrevertも入れたらよかった気がしています

mina

July 23, 2021
Tweet

More Decks by mina

Other Decks in Technology

Transcript

  1. Git入門
    SecPrj Intro-phase

    View Slide

  2. Gitとは
    Gitとは、オープンソースの分散バージョン管理システムの一つ。複数の
    開発者が共同で一つのソフトウェアを開発する際などに、ソースコード
    やドキュメントなどの編集履歴を統一的に管理するのに用いられる。
    Gitとは - IT用語辞典 e-Words https://e-words.jp/w/Git.html

    View Slide

  3. ソフトウェアのバージョン管理
    Gitがない世界
    ファイル名 最終変更日
    app.py 2021/03/01
    app_ver2.py 2021/05/20
    app_ver3.py 2021/05/10
    app_latest.py 2021/06/02
    app_latest2.py 2021/05/30
    で,結局どれが
    最新なんすか?

    View Slide

  4. ソフトウェアのバージョン管理
    Gitがない世界 Gitがある世界
    ファイル名 最終変更日
    app.py 2021/03/01
    app_ver2.py 2021/05/20
    app_ver3.py 2021/05/10
    app_latest.py 2021/06/02
    app_latest2.py 2021/05/30
    で,結局どれが
    最新なんすか?
    ファイル名 最終変更日
    .git/ 2021/06/02
    app.py 2021/06/02
    変更履歴(コミットログ)
    機能Bを実装
    関数bを実装
    機能Aを修正
    関数aを実装
    機能Aを実装
    任意の変更点を
    打ち消したり
    戻したりできる

    View Slide

  5. 複数人での作業
    Gitがない世界
    ファイル名 変更点
    app.py 機能A,B
    app_func1.py 機能A
    app_func2.py 機能B
    app_func1.py
    機能A実装
    app_func2.py
    機能B実装
    app_func1.py
    app.py
    app_func2.py
    A
    B
    A B
    機能A,B統合

    View Slide

  6. 複数人での作業
    Gitがない世界 Gitがある世界
    ファイル名 変更点
    app.py 機能A,B
    app_func1.py 機能A
    app_func2.py 機能B
    app_func1.py
    機能A実装
    ファイル名 変更点
    .git/ --
    app.py 機能A,B
    app_func2.py
    機能B実装
    app_func1.py
    app.py
    app_func2.py
    A
    B
    ブランチによる管理
    main
    func1
    func2
    commit
    ブランチ
    merge
    A B
    機能A,B統合

    View Slide

  7. Gitの基本的な操作
    - ステージング(add)
    - コミット(commit)
    - ステータス(status)
    - ブランチ(branch)
    - 移動(switch)
    - マージ(merge)
    - プッシュ(push)
    - プル(pull)
    - クローン(clone)

    View Slide

  8. Gitでコミットする
    コミットツリー
    未コミットの変更点A,B
    があるファイル群
    ステージ
    A
    B

    View Slide

  9. Gitでコミットする
    コミットツリー
    未コミットの変更点A,B
    があるファイル群
    ステージ
    A
    B
    A
    B
    ステージング

    View Slide

  10. Gitでコミットする
    コミットツリー
    未コミットの変更点A,B
    があるファイル群
    ステージ
    A
    B
    コミット
    A
    B
    ステージング
    コミットするとGitに
    変更が記録される
    (コミットオブジェクトの生成)

    View Slide

  11. Gitのコミット(コミットオブジェクト)
    A2
    A1 A3
    コミットはスナップショット(その時点のディレクトリ/ファイルのコピー)
    コミットしたファイルと各種情報を持つオブジェクトがコミットオブジェクト

    View Slide

  12. Gitのコミット(コミットオブジェクト)
    A2
    A1 A3
    コミット(コミットオブジェクト)にはそれぞれコミットハッシュとよばれる
    SHA1ハッシュ(40文字)が振られる
    コミットハッシュでコミット(コミットオブジェクト)を一意に指定できる
    87e9293cefb2a50ba945
    7f5c79553d74eeb360fc
    5b9e980753180e96ab40
    41cb43c507d86bfff3f6
    66e5c0862066a1c0809a
    5ff693a8123ea3f6e6e5

    View Slide

  13. Gitにおけるファイルのステータス
    ファイルには4つの状態がある
    Untracked(追跡されてない)/Unmodified(変更なし)/
    Modified(変更あり/ステージングされていない)/Staged(ステージングされている)
    Git - 変更内容のリポジトリへの記録 https://git-scm.com/book/ja/v2/Git-の基本-変更内容のリポジトリへの記録

    View Slide

  14. Gitでブランチを使う
    a
    b
    コミット
    ブランチ
    c
    それぞれのコミット(変更)が
    他のブランチに影響していない
    ブランチはいわば「世界線」。あるブランチは他ブランチの変更に影響されない
    ex) 関数Aを実装した世界線/関数Bを実装した世界線
    実装する機能やバージョンごとにブランチを切るのが一般的

    View Slide

  15. ブランチを
    移動して作業
    Gitでブランチを使う
    ブランチはいわば「世界線」。あるブランチは他ブランチの変更に影響されない
    ex) 関数Aを実装した世界線/関数Bを実装した世界線
    実装する機能やバージョンごとにブランチを切るのが一般的
    a
    b
    コミット
    ブランチ
    c
    それぞれのコミット(変更)が
    他のブランチに影響していない

    View Slide

  16. ブランチを
    割振って作業
    Gitでブランチを使う
    a
    b
    コミット
    ブランチ
    c
    それぞれのコミット(変更)が
    他のブランチに影響していない
    ブランチはいわば「世界線」。あるブランチは他ブランチの変更に影響されない
    ex) 関数Aを実装した世界線/関数Bを実装した世界線
    実装する機能やバージョンごとにブランチを切るのが一般的

    View Slide

  17. 実装する機能
    によって分離
    Gitでブランチを使う
    a
    b
    コミット
    ブランチ
    c
    それぞれのコミット(変更)が
    他のブランチに影響していない
    ブランチはいわば「世界線」。あるブランチは他ブランチの変更に影響されない
    ex) 関数Aを実装した世界線/関数Bを実装した世界線
    実装する機能やバージョンごとにブランチを切るのが一般的
    A
    B

    View Slide

  18. ブランチをマージする
    a
    b
    コミット マージ
    あるブランチの変更と別のブランチを統合/反映する
    反映は基本自動で行われるが,変更の重複点のみコンフリクトを起こす
    コンフリクトは手動で解消する必要がある.

    View Slide

  19. ブランチをマージする
    あるブランチの変更と別のブランチを統合/反映する
    反映は基本自動で行われるが,変更の重複点のみコンフリクトを起こす
    コンフリクトは手動で解消する必要がある.
    a
    b
    コミット マージ
    変更が重複すると
    コンフリクト

    View Slide

  20. リポジトリ
    Git管理されているディレクトリをリポジトリ(repository)と呼ぶ
    ローカルリポジトリ - 手元(ローカル)にあるリポジトリ
    リモートリポジトリ - インターネット上などのサーバ上にあるリポジトリ
    リモートリポジトリ
    開発者A 開発者B
    複製/反映 複製/反映
    変更 変更

    View Slide

  21. リポジトリ
    Git管理されているディレクトリをリポジトリ(repository)と呼ぶ
    ローカルリポジトリ - 手元(ローカル)にあるリポジトリ
    リモートリポジトリ - インターネット上などのサーバ上にあるリポジトリ
    複製がどこかにあればリモートリポジトリが死んでもある程度は復元可能
    リモートリポジトリ
    開発者A 開発者B
    複製/反映 複製/反映
    変更 変更

    View Slide

  22. リポジトリ
    Git管理されているディレクトリをリポジトリ(repository)と呼ぶ
    ローカルリポジトリ - 手元(ローカル)にあるリポジトリ
    リモートリポジトリ - インターネット上などのサーバ上にあるリポジトリ
    GitHubやGitLabなどはリモートリポジトリの実装の1つ
    リモートリポジトリ
    開発者A 開発者B
    複製/反映 複製/反映
    変更 変更

    View Slide

  23. リモートリポジトリへの操作
    リポジトリを複製(Clone)
    リモートリポジトリ
    clone
    ローカルの変更反映/リモートの変更反映
    リモートリポジトリ
    pull
    push
    cloneはデフォルトで
    デフォルトブランチを複
    製する
    push/pullは任意の
    ブランチに対して実行
    (b1だけpush...など)

    View Slide

  24. ハンズオン1
    ローカルリポジトリを作成する

    View Slide

  25. リポジトリを初期化する
    ディレクトリにあるファイルはそのままで,
    カレントディレクトリをGit管理下に置く
    .git/ が生成され,既にあるファイルは
    追跡されていない未コミットファイルとなる
    $ git init
    $ git status

    View Slide

  26. Gitでコミットする
    未コミットの変更点A
    があるファイル
    ステージ
    A
    $ git diff
    コミットツリー
    Untrackedなファイルは差分表示されない

    View Slide

  27. Gitでコミットする
    未コミットの変更点A
    があるファイル
    ステージ
    A A
    ステージング
    $ git add
    コミットツリー

    View Slide

  28. Gitでコミットする
    ユーザ情報の設定
    コミットユーザの情報として利用される
    $ git config --global user.email “your email”
    $ git config --global user.name “your name”
    $ git config --global core.editor “nano”

    View Slide

  29. Gitでコミットする
    未コミットの変更点A
    があるファイル
    ステージ
    A
    コミット
    A
    $ git commit
    $ git commit -m “...”
    or
    コミットツリー
    ステージング

    View Slide

  30. Gitでコミットする
    コミットツリー
    未コミットの変更点A
    があるファイル
    ステージ
    A A
    コミット
    $ git log
    ステージング

    View Slide

  31. Trackedなファイルであれば差分が表示される

    View Slide

  32. Gitでブランチを使う
    master
    ブランチを確認する
    $ git branch

    View Slide

  33. Gitでブランチを使う
    master
    b1
    ブランチを作成する
    作成したカレントブランチの情報を引き継ぐ
    $ git branch b1

    View Slide

  34. Gitでブランチを使う
    master
    b1
    カレントブランチを移動する
    master → b1 $ git switch b1
    $ git switch -c b1 で作成&移動も可能

    View Slide

  35. Gitでブランチを使う
    master
    b1
    b1で何かを変更し、コミットする
    このコミットはmasterに続く形になる
    (b1はmasterから切られているので)
    $ git add
    $ git commit
    -任意の編集-

    View Slide

  36. Gitでブランチを使う
    master
    b1
    b1で何かを変更し、コミットする
    このコミットはmasterに続く形になる
    (b1はmasterから切られているので)
    $ git log

    View Slide

  37. Gitでブランチを使う
    master
    b1
    カレントブランチをmasterに移動
    1つめのコミットしかみえない
    $ git switch master

    View Slide

  38. Gitでブランチを使う
    master
    b1
    b1ブランチをmasterブランチにマージ
    変更がb1でコミットした変更が反映されている $ git merge b1

    View Slide

  39. ハンズオン2
    リモートリポジトリの作成/Clone/Push/Pull

    View Slide

  40. リモートリポジトリのクローン,プッシュ,プル
    まず自分のGitHubページで新しいリポジトリを作る

    View Slide

  41. リモートリポジトリのクローン,プッシュ,プル

    View Slide

  42. 最初のコミットがされた状態でリモートリポジトリが生成される
    リモートリポジトリのクローン,プッシュ,プル

    View Slide

  43. $ git clone https://github.com/silmin/git-test.git
    リモートリポジトリのクローン,プッシュ,プル

    View Slide

  44. リモートリポジトリのクローン,プッシュ,プル
    cloneしてきたリポジトリに変更点を加えて,コミットする

    View Slide

  45. リモートリポジトリのクローン,プッシュ,プル

    View Slide

  46. helloが追加されている
    $ git push origin main
    リモートリポジトリのクローン,プッシュ,プル

    View Slide

  47. $ git push origin main
    リモートリポジトリ
    ブランチ

    View Slide

  48. リモートリポジトリのクローン,プッシュ,プル
    WebUIから直接変更してみる

    View Slide

  49. リモートリポジトリのクローン,プッシュ,プル
    リモートでの変更をローカルにプルして反映

    View Slide

  50. ハンズオンおわり

    View Slide

  51. gitconfigについて
    それぞれのリポジトリにはその設定ファイルとして .git/config がある
    全てのリポジトリに適用されるグローバルな設定 ~/.gitconfig もある
    さっきGitHubで作った
    リポジトリの.git/config
    originはリモートリポジトリに
    つけられた名前

    View Slide

  52. Gitのブランチ
    main
    ブランチポインタ
    カレントブランチ(HEAD)
    ブランチの実態はただのコミットへの参照(ポインタ)
    ブランチの数 ≒ ブランチポインタの数
    ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

    View Slide

  53. Gitのブランチ
    temp
    main
    ブランチの実態はただのコミットへの参照(ポインタ)
    ブランチの数 ≒ ブランチポインタの数
    ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している
    ブランチポインタ
    カレントブランチ(HEAD)
    $ git switch -c temp

    View Slide

  54. Gitのブランチ
    temp
    main
    ブランチポインタ
    カレントブランチ(HEAD)
    $ git commit ...
    ブランチの実態はただのコミットへの参照(ポインタ)
    ブランチの数 ≒ ブランチポインタの数
    ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

    View Slide

  55. Gitのブランチ
    temp
    main
    ブランチポインタ
    カレントブランチ(HEAD)
    $ git switch main
    ブランチの実態はただのコミットへの参照(ポインタ)
    ブランチの数 ≒ ブランチポインタの数
    ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

    View Slide

  56. Gitのブランチ
    temp
    main
    ブランチポインタ
    カレントブランチ(HEAD)
    $ git commit ...
    ブランチの実態はただのコミットへの参照(ポインタ)
    ブランチの数 ≒ ブランチポインタの数
    ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

    View Slide

  57. Gitのブランチ
    temp
    main
    ブランチポインタ
    カレントブランチ(HEAD)
    $ git merge temp
    ブランチの実態はただのコミットへの参照(ポインタ)
    ブランチの数 ≒ ブランチポインタの数
    ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

    View Slide

  58. Gitのブランチ
    a
    2
    a
    1
    a
    3
    temp
    main
    b
    1
    a
    4
    a
    5
    ブランチポインタ
    カレントブランチ(HEAD)
    a
    1
    a
    2
    a
    3
    b
    1
    a
    4
    a
    5
    main
    temp

    View Slide