SlideShare une entreprise Scribd logo
1  sur  60
Télécharger pour lire hors ligne
Git 道場



心:Git総論、心構え
     Nobuhiro Iwamatsu
 E-Mail: iwamatsu@nigauri.org
     Twitter: @iwamatsu
自己紹介
●
    岩松 信洋です。
●
    Twitter は @iwamatsu です。
●
    Gitによるバージョン管理 著者の一人です。
●
    普段はLinuxカーネルの開発とか、Debian とい
    うOSの開発をしています。
●
    師範らしいです。
はじめに
●
    ようこそ!Git道場へ。
●
    今日Git道場の門を叩いた方
    ●
        今のブームはGitらしい→使えるとモテるかも!?
        –   「彼がmergeやrebaseができなかった。別れたい。」
    ●
        Subversion派やCVS派から足を洗いたいが、merge
        / rebase がよくわからない。
        –   Git道場は他の流派も受け入れる心が広い道場。
はじめに
●
    講義・実技訓練の前に不安があるかも?
    ●
        今までの知識で実技訓練に望めるのか?
    ●
        俺はGit を選んでいいのだろうか....?
        –   よいです。正解。大正解。
●
    そんな方々に安心してGitを使えるように心構
    えを簡単に説明します。
Git は分散
Gitは分散
●
    Gitは中央管理用リポジトリを必要としない
    バージョン管理システム。分散バージョン管理
    システム。
●
    今までは中央管理用リポジトリを必要とする
    Subversion などが主流だった。
●
    Gitにはリモートリポジトリとローカルリポジ
    トリがある。
集中型の場合
           リポジトリ




                       ・コミット




     ・チェックアウト
     ・アップデート
     ・履歴の参照
     ・履歴差分の確認


ワーキングコピー            ワーキングコピー
分散型(Git)の場合
                   リモートリポジトリ




          プル                   プッシュ


  コミット                                コミット

   ワーキングコピー        ローカルリポジトリ     ワーキングコピー


チェックアウト                               チェックアウト


               ・履歴の参照
               ・履歴差分の確認
分散型(Git)の場合
                   リモートリポジトリ




          プル                   プッシュ
                      プル


  コミット                                コミット

   ワーキングコピー        ローカルリポジトリ     ワーキングコピー


チェックアウト                               チェックアウト
                          プル

               ・履歴の参照
               ・履歴差分の確認
集中型の場合
●
    ローカルリポジトリとリモートリポジトリの区
    別がない。
●
    リポジトリ
    ●
        共有するバージョン管理用のデータが格納されてい
        る。
    ●
        履歴の参照、履歴差分の確認、コミットなどを行う
        場合、リポジトリへアクセスが必要
●
                 分散型(Git)の場合
●
    リモートリポジトリとローカルリポジトリがある。
●
    主な作業はローカルリポジトリで行う。
    ●
        コミット、ブランチの作成、マージ etc...
    ●
        自分に必要な管理データをローカルリポジトリで管理できる。
    ●
        リモートリポジトリにアクセスできなくても作業ができる。
    ●
        必要なデータがローカルにあるので動作が早い。
●
    プッシュでローカルリポジトリからリモートリポジトリに反映し
    て初めて、他のユーザと履歴共有する。
●
    リモートリポジトリ
    ●
        共有するバージョン管理用のデータが格納されてい
        る。
●
    ローカルリポジトリ
    ●
        リモートリポジトリのデータと自分の行ったバー
        ジョン管理用のデータが格納されている。
●
    ローカルリポジトリは俺のもの、リモートリポ
    ジトリはみんなのもの。
Gitで操作した時、各リポジトリが
    どのように変化するのか
リモートリポジトリをクローン
git clone test.git

リモートリポジトリ(test.git)
               HEAD



1      2       master
リモートリポジトリをクローン
git clone test.git
                                        HEAD

リモートリポジトリ(test.git)     ローカルリポジトリ
               HEAD                     master



1      2       master    1   2




                                    origin/master
変更してコミット(A)
edit ; git commt -sm “Add commit A”
                                          HEAD

リモートリポジトリ(test.git)       ローカルリポジトリ
             HEAD                         master



1     2      master         1     2




                                      origin/master
変更してコミット(A)
edit ; git commt -sm “Add commit A”
                                              HEAD

リモートリポジトリ(test.git)       ローカルリポジトリ
             HEAD                     A       master



1     2      master         1     2




                                          origin/master
コミット2からtestブランチを
     作成してチェックアウト
git checkout -b test commit-2
                                                HEAD

リモートリポジトリ(test.git)        ローカルリポジトリ
             HEAD                       A       master



1     2      master             1   2




                                            origin/master
コミット2からtestブランチを
     作成してチェックアウト
git checkout -b test commit-2
                                                HEAD

リモートリポジトリ(test.git)        ローカルリポジトリ
             HEAD                       A       master



1     2      master             1   2            test




                                            origin/master
変更してコミット(B)
edit ; git commit -am “Add commit B”
                                               HEAD

リモートリポジトリ(test.git)       ローカルリポジトリ
             HEAD                      A       master



1     2      master          1    2             test




                                           origin/master
変更してコミット(B)
edit ; git commit -am “Add commit B”
                                               HEAD

リモートリポジトリ(test.git)       ローカルリポジトリ
             HEAD                      A       master



1     2      master          1    2    B        test




                                           origin/master
masterブランチをチェックアウト
git checkout master
                                          HEAD

リモートリポジトリ(test.git)   ローカルリポジトリ
             HEAD                 A       master



1     2      master    1   2      B        test




                                      origin/master
masterブランチをチェックアウト
git checkout master
                                          HEAD

リモートリポジトリ(test.git)   ローカルリポジトリ
             HEAD                 A       master



1     2      master    1   2      B        test




                                      origin/master
testブランチを削除
git branch -D test
                                           HEAD

リモートリポジトリ(test.git)    ローカルリポジトリ
              HEAD                 A       master



1     2       master    1   2      B        test




                                       origin/master
testブランチを削除
git branch -D test
                                           HEAD

リモートリポジトリ(test.git)    ローカルリポジトリ
              HEAD                 A       master



1     2       master    1   2      B




                                       origin/master
変更してコミット(C)
edit ; git commit -am “Add commit C”
                                               HEAD

リモートリポジトリ(test.git)       ローカルリポジトリ
             HEAD                      A       master



1     2      master         1     2    B




                                           origin/master
変更してコミット(C)
edit ; git commit -am “Add commit C”
                                                   HEAD

リモートリポジトリ(test.git)       ローカルリポジトリ
             HEAD                      A   C       master



1     2      master         1     2    B




                                               origin/master
作業している間に誰かコミットを
         プッシュした
                                              HEAD

リモートリポジトリ(test.git)   ローカルリポジトリ
             HEAD                 A   C       master



1     2      master    1   2      B




                                          origin/master
作業している間に誰かコミットを
         プッシュした
                                                       HEAD

リモートリポジトリ(test.git)            ローカルリポジトリ
                      HEAD                 A   C       master



1     2     3         master    1   2      B




                                                   origin/master
作業している間に誰かコミットを
         プッシュした
                                                       HEAD

リモートリポジトリ(test.git)            ローカルリポジトリ
                      HEAD                 A   C       master



1     2     3         master    1   2      B




                                                   origin/master


    この後は どうするの?rebase ? merge?
    小川師範の講義で説明します。
Git は分散
●
    コミットしてもローカルリポジトリにしか影響は
    ない。
●
    プッシュするまでローカルリポジトリの情報はリ
    モートリポジトリに反映されない。
●
    コミットしたからといって他の人に影響が出るわ
    けでもないので、気にせずにコミットしましょ
    う。
●
    ローカルリポジトリは俺のもの、リモートリポジ
    トリはみんなのもの。
Git は頑健
Git は頑健
●
    Gitは乱暴に言うとスナップショット。
    ●
        コミットすると全体のツリー構造と内容を保存す
        る。
●
    これらは SHA1 ハッシュで管理されている。
    ●
        コミット ← ツリー構造 ← 実際のファイル
        –   どれかが変更されると、ハッシュ値が変更される。
コミット1         コミット   :コミット

     T1         T     :ツリー情報

F1        T2
                F     :ファイル

     F2
ディレクトリT2にFile3を作成し、
     コミットする
 コミット1



     T1



F1        T2



     F2
ディレクトリT2にFile3を作成し、
     コミットする
 コミット1



     T1



F1        T2



     F2        F3
ディレクトリT2にFile3を作成し、
     コミットする
 コミット1



     T1



F1        T2    T2'



     F2        F3
ディレクトリT2にFile3を作成し、
     コミットする
 コミット1



     T1        T1'



F1        T2         T2'



     F2          F3
ディレクトリT2にFile3を作成し、
     コミットする
 コミット1         コミット2



     T1         T1'



F1        T2          T2'



     F2           F3
File1を編集し、コミットする

 コミット1         コミット2



     T1         T1'



F1        T2          T2'



     F2           F3
File1を編集し、コミットする

 コミット1         コミット2



     T1         T1'



F1        T2          T2'   F1'



     F2           F3
File1を編集し、コミットする

 コミット1         コミット2



     T1         T1'



F1        T2          T2'   F1'



     F2           F3
File1を編集し、コミットする

 コミット1         コミット2



     T1         T1'               T1''
                                  T1'



F1        T2          T2'   F1'



     F2           F3
File1を編集し、コミットする

 コミット1         コミット2              コミット3



     T1         T1'                T1''
                                   T1'



F1        T2          T2'   F1'



     F2           F3
Git は頑健
●
    Gitは乱暴に言うとスナップショット。
    ●
        コミットすると全体のツリー構造と内容を保存す
        る。
●
    これらは SHA1 ハッシュで管理されている。
    ●
        コミット ← ツリー構造 ← 実際のファイル
    ●
        コミットは前のコミットのハッシュ値を持つ。
    ●
        最新のコミットのハッシュ値は、過去の履歴すべて
        のコミット、ツリー、ファイルのハッシュを確認し
        ていることになる。
Git は頑健
●
    意図的に衝突を起こそうとしていない限り、正
    しいコミットハッシュが分かれば、それはツ
    リーの構造、およびそのツリーに含まれている
    ファイルの中身のハッシュ、および過去からそ
    の状態に至るまですべての履歴の状態を反映し
    たハッシュ値になる。
●
    ファイルの中身が一つでも違う値であれば異な
    るハッシュ値になる。
Gitは時間的な変遷を管理する
Gitは時間的な変遷を管理する
●
    このコミットの前はどうなってのか
●
    前日のこの時間にした作業はどのような作業を
    行なっていたのか
●
    Gitはこれらを管理し、その状態に戻すことが
    できる。
Gitは時間的な変遷を管理する
●
    Gitの作業履歴が残っている。
HEAD

リモートリポジトリ(test.git)   ローカルリポジトリ
             HEAD                 A       master



1     2      master    1   2      B        test




                                      origin/master
testブランチを削除
git branch -D test
                                           HEAD

リモートリポジトリ(test.git)    ローカルリポジトリ
              HEAD                 A       master



1     2       master    1   2      B        test




                                       origin/master
testブランチを削除
git branch -D test
                                           HEAD

リモートリポジトリ(test.git)    ローカルリポジトリ
              HEAD                 A       master



1     2       master    1   2      B




                                       origin/master
変更してコミット(C)
edit ; git commit -am “Add commit C”
                                               HEAD

リモートリポジトリ(test.git)       ローカルリポジトリ
             HEAD                      A       master



1     2      master         1     2    B




                                           origin/master
変更してコミット(C)
edit ; git commit -am “Add commit C”
                                                   HEAD

リモートリポジトリ(test.git)       ローカルリポジトリ
             HEAD                      A   C       master



1     2      master         1     2    B




                                               origin/master
変更してコミット(C)
edit ; git commit -am “Add commit C”
                                                   HEAD

リモートリポジトリ(test.git)       ローカルリポジトリ
             HEAD                      A   C       master



1     2      master         1     2    B




                                               origin/master



    やっぱりコミットBが必要だった....
Gitは時間的な変遷を管理する
●
    Gitの作業履歴が残っている。
●
    git reflog で過去の作業履歴を参照できる。
$ git reflog
4341590 HEAD@{0}: commit: Commit-C
e6703af HEAD@{1}: checkout: moving from test
to master
1b3e6dc HEAD@{2}: commit: Commit-B
5b2ff15 HEAD@{3}: checkout: moving from
master to test
e6703af HEAD@{4}: commit: Commit-A
5b2ff15 HEAD@{5}: clone: from /tmp/test.git
Gitは時間的な変遷を管理する
●
    Gitの作業履歴が残っている。
●
    git reflog で過去の作業履歴を参照できる。
    ●
        ただし90日以内又はgit gcを実行しない/されない場合。
    ●
        不安ならGCを無効にする。
        –   git config --global gc.auto 0
    ●
        全てコミットしましょう。
        –   ローカルリポジトリ内で完結するので他の利用者には影響は
            ない。
        –   コミットしていれば救われる。
まとめ
●
    Gitは分散
    ●
        作業はローカルリポジトリで管理される。
    ●
        リモートリポジトリへの影響はあまり気にしない。
●
    Gitは頑健
●
    Gitは時間的な変遷を管理する
    ●
        コミットしていれば、過去を取り戻せる(こともあ
        る)。
    ●
        コミットしていれば、失敗は怖くない。
質問




なにか質問はありますか?

Contenu connexe

En vedette

Introduction to Yocto Project - Let's make customized embedded linux
Introduction to Yocto Project - Let's make customized embedded linuxIntroduction to Yocto Project - Let's make customized embedded linux
Introduction to Yocto Project - Let's make customized embedded linuxHiroshi Sakate
 
Introduction to yocto
Introduction to yoctoIntroduction to yocto
Introduction to yoctoAlex Gonzalez
 
Osc2016 tokyo-spring-geeklog
Osc2016 tokyo-spring-geeklogOsc2016 tokyo-spring-geeklog
Osc2016 tokyo-spring-geeklogTetsuko Komma
 
小江戸らぐ9月のオフな集まり(第98回) -東京電機大学神田キャンパス-
小江戸らぐ9月のオフな集まり(第98回) -東京電機大学神田キャンパス-小江戸らぐ9月のオフな集まり(第98回) -東京電機大学神田キャンパス-
小江戸らぐ9月のオフな集まり(第98回) -東京電機大学神田キャンパス-Kenichiro MATOHARA
 
アドベントカレンダー「愉悦について」
アドベントカレンダー「愉悦について」アドベントカレンダー「愉悦について」
アドベントカレンダー「愉悦について」Masataka Kondo
 
芸人を 目指すわけでは ないけれど…(n575)
芸人を 目指すわけでは ないけれど…(n575)芸人を 目指すわけでは ないけれど…(n575)
芸人を 目指すわけでは ないけれど…(n575)Masataka Kondo
 
LibreOfficeの品質向上活動について
LibreOfficeの品質向上活動についてLibreOfficeの品質向上活動について
LibreOfficeの品質向上活動についてMasataka Kondo
 
ベジェ曲線を使ってみよう
ベジェ曲線を使ってみようベジェ曲線を使ってみよう
ベジェ曲線を使ってみようMasataka Kondo
 
鹿児島らぐはじめました(オープンソースカンファレンス2015大分LT)
鹿児島らぐはじめました(オープンソースカンファレンス2015大分LT)鹿児島らぐはじめました(オープンソースカンファレンス2015大分LT)
鹿児島らぐはじめました(オープンソースカンファレンス2015大分LT)Kenichiro MATOHARA
 
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介Kazuhiro Takahashi
 
U38Nの WiFiモジュールを換装したハナシ
U38Nの WiFiモジュールを換装したハナシU38Nの WiFiモジュールを換装したハナシ
U38Nの WiFiモジュールを換装したハナシMasataka Kondo
 
Introduce Yocto Project Japan and What want to make using Yocto Project
Introduce Yocto Project Japan and What want to make using Yocto ProjectIntroduce Yocto Project Japan and What want to make using Yocto Project
Introduce Yocto Project Japan and What want to make using Yocto ProjectHiroshi Sakate
 
ゲーミングプラットホームのLutris
ゲーミングプラットホームのLutrisゲーミングプラットホームのLutris
ゲーミングプラットホームのLutrisKenichiro MATOHARA
 
Build your own embedded linux distributions by yocto project
Build your own embedded linux distributions by yocto projectBuild your own embedded linux distributions by yocto project
Build your own embedded linux distributions by yocto projectYen-Chin Lee
 
LibreOffice Conference 2016 Brno 参加レポート
LibreOffice Conference 2016 Brno 参加レポートLibreOffice Conference 2016 Brno 参加レポート
LibreOffice Conference 2016 Brno 参加レポートShinji Enoki
 
ビジネスモデル・キャンバスワークショップ 2015-05-30
ビジネスモデル・キャンバスワークショップ 2015-05-30ビジネスモデル・キャンバスワークショップ 2015-05-30
ビジネスモデル・キャンバスワークショップ 2015-05-30Shinji Enoki
 
Building LibreOffice local community in Japan through event handling
Building LibreOffice local community in Japan through event handlingBuilding LibreOffice local community in Japan through event handling
Building LibreOffice local community in Japan through event handlingShinji Enoki
 
鹿児島に引っ越しました
鹿児島に引っ越しました鹿児島に引っ越しました
鹿児島に引っ越しましたKenichiro MATOHARA
 
バグ報告・翻訳・パッケージング・コード修正・広報活動などなど―OSS に貢献してみるには?
バグ報告・翻訳・パッケージング・コード修正・広報活動などなど―OSS に貢献してみるには?バグ報告・翻訳・パッケージング・コード修正・広報活動などなど―OSS に貢献してみるには?
バグ報告・翻訳・パッケージング・コード修正・広報活動などなど―OSS に貢献してみるには?Fuminobu Takeyama
 
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)Fuminobu Takeyama
 

En vedette (20)

Introduction to Yocto Project - Let's make customized embedded linux
Introduction to Yocto Project - Let's make customized embedded linuxIntroduction to Yocto Project - Let's make customized embedded linux
Introduction to Yocto Project - Let's make customized embedded linux
 
Introduction to yocto
Introduction to yoctoIntroduction to yocto
Introduction to yocto
 
Osc2016 tokyo-spring-geeklog
Osc2016 tokyo-spring-geeklogOsc2016 tokyo-spring-geeklog
Osc2016 tokyo-spring-geeklog
 
小江戸らぐ9月のオフな集まり(第98回) -東京電機大学神田キャンパス-
小江戸らぐ9月のオフな集まり(第98回) -東京電機大学神田キャンパス-小江戸らぐ9月のオフな集まり(第98回) -東京電機大学神田キャンパス-
小江戸らぐ9月のオフな集まり(第98回) -東京電機大学神田キャンパス-
 
アドベントカレンダー「愉悦について」
アドベントカレンダー「愉悦について」アドベントカレンダー「愉悦について」
アドベントカレンダー「愉悦について」
 
芸人を 目指すわけでは ないけれど…(n575)
芸人を 目指すわけでは ないけれど…(n575)芸人を 目指すわけでは ないけれど…(n575)
芸人を 目指すわけでは ないけれど…(n575)
 
LibreOfficeの品質向上活動について
LibreOfficeの品質向上活動についてLibreOfficeの品質向上活動について
LibreOfficeの品質向上活動について
 
ベジェ曲線を使ってみよう
ベジェ曲線を使ってみようベジェ曲線を使ってみよう
ベジェ曲線を使ってみよう
 
鹿児島らぐはじめました(オープンソースカンファレンス2015大分LT)
鹿児島らぐはじめました(オープンソースカンファレンス2015大分LT)鹿児島らぐはじめました(オープンソースカンファレンス2015大分LT)
鹿児島らぐはじめました(オープンソースカンファレンス2015大分LT)
 
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
 
U38Nの WiFiモジュールを換装したハナシ
U38Nの WiFiモジュールを換装したハナシU38Nの WiFiモジュールを換装したハナシ
U38Nの WiFiモジュールを換装したハナシ
 
Introduce Yocto Project Japan and What want to make using Yocto Project
Introduce Yocto Project Japan and What want to make using Yocto ProjectIntroduce Yocto Project Japan and What want to make using Yocto Project
Introduce Yocto Project Japan and What want to make using Yocto Project
 
ゲーミングプラットホームのLutris
ゲーミングプラットホームのLutrisゲーミングプラットホームのLutris
ゲーミングプラットホームのLutris
 
Build your own embedded linux distributions by yocto project
Build your own embedded linux distributions by yocto projectBuild your own embedded linux distributions by yocto project
Build your own embedded linux distributions by yocto project
 
LibreOffice Conference 2016 Brno 参加レポート
LibreOffice Conference 2016 Brno 参加レポートLibreOffice Conference 2016 Brno 参加レポート
LibreOffice Conference 2016 Brno 参加レポート
 
ビジネスモデル・キャンバスワークショップ 2015-05-30
ビジネスモデル・キャンバスワークショップ 2015-05-30ビジネスモデル・キャンバスワークショップ 2015-05-30
ビジネスモデル・キャンバスワークショップ 2015-05-30
 
Building LibreOffice local community in Japan through event handling
Building LibreOffice local community in Japan through event handlingBuilding LibreOffice local community in Japan through event handling
Building LibreOffice local community in Japan through event handling
 
鹿児島に引っ越しました
鹿児島に引っ越しました鹿児島に引っ越しました
鹿児島に引っ越しました
 
バグ報告・翻訳・パッケージング・コード修正・広報活動などなど―OSS に貢献してみるには?
バグ報告・翻訳・パッケージング・コード修正・広報活動などなど―OSS に貢献してみるには?バグ報告・翻訳・パッケージング・コード修正・広報活動などなど―OSS に貢献してみるには?
バグ報告・翻訳・パッケージング・コード修正・広報活動などなど―OSS に貢献してみるには?
 
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
 

Similaire à Git 道場 心:Git総論、心構え

Gitを使ってみよう
Gitを使ってみようGitを使ってみよう
Gitを使ってみようTamotsu Furuya
 
ソフトウェア工学2023 08 GitHub
ソフトウェア工学2023 08 GitHubソフトウェア工学2023 08 GitHub
ソフトウェア工学2023 08 GitHubToru Tamaki
 
Git 入門
Git 入門Git 入門
Git 入門y-uti
 
(工事中) Git の仕組み
(工事中) Git の仕組み(工事中) Git の仕組み
(工事中) Git の仕組みTeloo
 
(工事中) Git の仕組み
(工事中) Git の仕組み(工事中) Git の仕組み
(工事中) Git の仕組みTeloo
 
Git-dojo In Sendagaya.rb
Git-dojo In Sendagaya.rbGit-dojo In Sendagaya.rb
Git-dojo In Sendagaya.rbJun Fukaya
 
Git lev 1-おひとりさま用-
Git lev 1-おひとりさま用-Git lev 1-おひとりさま用-
Git lev 1-おひとりさま用-Kentarou Kurashige
 
GitHubの機能を活用したGitHub Flowによる開発の進め方
GitHubの機能を活用したGitHub Flowによる開発の進め方GitHubの機能を活用したGitHub Flowによる開発の進め方
GitHubの機能を活用したGitHub Flowによる開発の進め方Takeshi Mikami
 
Gitのよく使うコマンド
Gitのよく使うコマンドGitのよく使うコマンド
Gitのよく使うコマンドYUKI Kaoru
 
Git introduction2
Git introduction2Git introduction2
Git introduction2Misa Kondo
 
gitを使う準備をしよう - 初級編
gitを使う準備をしよう - 初級編gitを使う準備をしよう - 初級編
gitを使う準備をしよう - 初級編Sanae Yamashita
 

Similaire à Git 道場 心:Git総論、心構え (20)

Gitを使ってみよう
Gitを使ってみようGitを使ってみよう
Gitを使ってみよう
 
ソフトウェア工学2023 08 GitHub
ソフトウェア工学2023 08 GitHubソフトウェア工学2023 08 GitHub
ソフトウェア工学2023 08 GitHub
 
Git (実践入門編)
Git (実践入門編)Git (実践入門編)
Git (実践入門編)
 
Git overview (v 0.96)
Git overview (v 0.96)Git overview (v 0.96)
Git overview (v 0.96)
 
Git 実践入門
Git 実践入門Git 実践入門
Git 実践入門
 
Git for beginners
Git for beginnersGit for beginners
Git for beginners
 
Git 入門
Git 入門Git 入門
Git 入門
 
Git
GitGit
Git
 
(工事中) Git の仕組み
(工事中) Git の仕組み(工事中) Git の仕組み
(工事中) Git の仕組み
 
(工事中) Git の仕組み
(工事中) Git の仕組み(工事中) Git の仕組み
(工事中) Git の仕組み
 
Git
GitGit
Git
 
Git-dojo In Sendagaya.rb
Git-dojo In Sendagaya.rbGit-dojo In Sendagaya.rb
Git-dojo In Sendagaya.rb
 
Git lev 1-おひとりさま用-
Git lev 1-おひとりさま用-Git lev 1-おひとりさま用-
Git lev 1-おひとりさま用-
 
GitHubの機能を活用したGitHub Flowによる開発の進め方
GitHubの機能を活用したGitHub Flowによる開発の進め方GitHubの機能を活用したGitHub Flowによる開発の進め方
GitHubの機能を活用したGitHub Flowによる開発の進め方
 
Git/GitHub
Git/GitHubGit/GitHub
Git/GitHub
 
Gitのよく使うコマンド
Gitのよく使うコマンドGitのよく使うコマンド
Gitのよく使うコマンド
 
Git地図
Git地図Git地図
Git地図
 
Github第4章
Github第4章Github第4章
Github第4章
 
Git introduction2
Git introduction2Git introduction2
Git introduction2
 
gitを使う準備をしよう - 初級編
gitを使う準備をしよう - 初級編gitを使う準備をしよう - 初級編
gitを使う準備をしよう - 初級編
 

Git 道場 心:Git総論、心構え

  • 1. Git 道場 心:Git総論、心構え Nobuhiro Iwamatsu E-Mail: iwamatsu@nigauri.org Twitter: @iwamatsu
  • 2. 自己紹介 ● 岩松 信洋です。 ● Twitter は @iwamatsu です。 ● Gitによるバージョン管理 著者の一人です。 ● 普段はLinuxカーネルの開発とか、Debian とい うOSの開発をしています。 ● 師範らしいです。
  • 3. はじめに ● ようこそ!Git道場へ。 ● 今日Git道場の門を叩いた方 ● 今のブームはGitらしい→使えるとモテるかも!? – 「彼がmergeやrebaseができなかった。別れたい。」 ● Subversion派やCVS派から足を洗いたいが、merge / rebase がよくわからない。 – Git道場は他の流派も受け入れる心が広い道場。
  • 4. はじめに ● 講義・実技訓練の前に不安があるかも? ● 今までの知識で実技訓練に望めるのか? ● 俺はGit を選んでいいのだろうか....? – よいです。正解。大正解。 ● そんな方々に安心してGitを使えるように心構 えを簡単に説明します。
  • 6. Gitは分散 ● Gitは中央管理用リポジトリを必要としない バージョン管理システム。分散バージョン管理 システム。 ● 今までは中央管理用リポジトリを必要とする Subversion などが主流だった。 ● Gitにはリモートリポジトリとローカルリポジ トリがある。
  • 7. 集中型の場合 リポジトリ ・コミット ・チェックアウト ・アップデート ・履歴の参照 ・履歴差分の確認 ワーキングコピー ワーキングコピー
  • 8. 分散型(Git)の場合 リモートリポジトリ プル プッシュ コミット コミット ワーキングコピー ローカルリポジトリ ワーキングコピー チェックアウト チェックアウト ・履歴の参照 ・履歴差分の確認
  • 9. 分散型(Git)の場合 リモートリポジトリ プル プッシュ プル コミット コミット ワーキングコピー ローカルリポジトリ ワーキングコピー チェックアウト チェックアウト プル ・履歴の参照 ・履歴差分の確認
  • 10. 集中型の場合 ● ローカルリポジトリとリモートリポジトリの区 別がない。 ● リポジトリ ● 共有するバージョン管理用のデータが格納されてい る。 ● 履歴の参照、履歴差分の確認、コミットなどを行う 場合、リポジトリへアクセスが必要
  • 11. 分散型(Git)の場合 ● リモートリポジトリとローカルリポジトリがある。 ● 主な作業はローカルリポジトリで行う。 ● コミット、ブランチの作成、マージ etc... ● 自分に必要な管理データをローカルリポジトリで管理できる。 ● リモートリポジトリにアクセスできなくても作業ができる。 ● 必要なデータがローカルにあるので動作が早い。 ● プッシュでローカルリポジトリからリモートリポジトリに反映し て初めて、他のユーザと履歴共有する。
  • 12. リモートリポジトリ ● 共有するバージョン管理用のデータが格納されてい る。 ● ローカルリポジトリ ● リモートリポジトリのデータと自分の行ったバー ジョン管理用のデータが格納されている。 ● ローカルリポジトリは俺のもの、リモートリポ ジトリはみんなのもの。
  • 13. Gitで操作した時、各リポジトリが どのように変化するのか
  • 15. リモートリポジトリをクローン git clone test.git HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD master 1 2 master 1 2 origin/master
  • 16. 変更してコミット(A) edit ; git commt -sm “Add commit A” HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD master 1 2 master 1 2 origin/master
  • 17. 変更してコミット(A) edit ; git commt -sm “Add commit A” HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 origin/master
  • 18. コミット2からtestブランチを 作成してチェックアウト git checkout -b test commit-2 HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 origin/master
  • 19. コミット2からtestブランチを 作成してチェックアウト git checkout -b test commit-2 HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 test origin/master
  • 20. 変更してコミット(B) edit ; git commit -am “Add commit B” HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 test origin/master
  • 21. 変更してコミット(B) edit ; git commit -am “Add commit B” HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B test origin/master
  • 22. masterブランチをチェックアウト git checkout master HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B test origin/master
  • 23. masterブランチをチェックアウト git checkout master HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B test origin/master
  • 24. testブランチを削除 git branch -D test HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B test origin/master
  • 25. testブランチを削除 git branch -D test HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B origin/master
  • 26. 変更してコミット(C) edit ; git commit -am “Add commit C” HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B origin/master
  • 27. 変更してコミット(C) edit ; git commit -am “Add commit C” HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A C master 1 2 master 1 2 B origin/master
  • 28. 作業している間に誰かコミットを プッシュした HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A C master 1 2 master 1 2 B origin/master
  • 29. 作業している間に誰かコミットを プッシュした HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A C master 1 2 3 master 1 2 B origin/master
  • 30. 作業している間に誰かコミットを プッシュした HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A C master 1 2 3 master 1 2 B origin/master この後は どうするの?rebase ? merge? 小川師範の講義で説明します。
  • 31. Git は分散 ● コミットしてもローカルリポジトリにしか影響は ない。 ● プッシュするまでローカルリポジトリの情報はリ モートリポジトリに反映されない。 ● コミットしたからといって他の人に影響が出るわ けでもないので、気にせずにコミットしましょ う。 ● ローカルリポジトリは俺のもの、リモートリポジ トリはみんなのもの。
  • 33. Git は頑健 ● Gitは乱暴に言うとスナップショット。 ● コミットすると全体のツリー構造と内容を保存す る。 ● これらは SHA1 ハッシュで管理されている。 ● コミット ← ツリー構造 ← 実際のファイル – どれかが変更されると、ハッシュ値が変更される。
  • 34. コミット1 コミット :コミット T1 T :ツリー情報 F1 T2 F :ファイル F2
  • 35. ディレクトリT2にFile3を作成し、 コミットする コミット1 T1 F1 T2 F2
  • 36. ディレクトリT2にFile3を作成し、 コミットする コミット1 T1 F1 T2 F2 F3
  • 37. ディレクトリT2にFile3を作成し、 コミットする コミット1 T1 F1 T2 T2' F2 F3
  • 38. ディレクトリT2にFile3を作成し、 コミットする コミット1 T1 T1' F1 T2 T2' F2 F3
  • 39. ディレクトリT2にFile3を作成し、 コミットする コミット1 コミット2 T1 T1' F1 T2 T2' F2 F3
  • 40. File1を編集し、コミットする コミット1 コミット2 T1 T1' F1 T2 T2' F2 F3
  • 41. File1を編集し、コミットする コミット1 コミット2 T1 T1' F1 T2 T2' F1' F2 F3
  • 42. File1を編集し、コミットする コミット1 コミット2 T1 T1' F1 T2 T2' F1' F2 F3
  • 43. File1を編集し、コミットする コミット1 コミット2 T1 T1' T1'' T1' F1 T2 T2' F1' F2 F3
  • 44. File1を編集し、コミットする コミット1 コミット2 コミット3 T1 T1' T1'' T1' F1 T2 T2' F1' F2 F3
  • 45. Git は頑健 ● Gitは乱暴に言うとスナップショット。 ● コミットすると全体のツリー構造と内容を保存す る。 ● これらは SHA1 ハッシュで管理されている。 ● コミット ← ツリー構造 ← 実際のファイル ● コミットは前のコミットのハッシュ値を持つ。 ● 最新のコミットのハッシュ値は、過去の履歴すべて のコミット、ツリー、ファイルのハッシュを確認し ていることになる。
  • 46. Git は頑健 ● 意図的に衝突を起こそうとしていない限り、正 しいコミットハッシュが分かれば、それはツ リーの構造、およびそのツリーに含まれている ファイルの中身のハッシュ、および過去からそ の状態に至るまですべての履歴の状態を反映し たハッシュ値になる。 ● ファイルの中身が一つでも違う値であれば異な るハッシュ値になる。
  • 48. Gitは時間的な変遷を管理する ● このコミットの前はどうなってのか ● 前日のこの時間にした作業はどのような作業を 行なっていたのか ● Gitはこれらを管理し、その状態に戻すことが できる。
  • 49. Gitは時間的な変遷を管理する ● Gitの作業履歴が残っている。
  • 50. HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B test origin/master
  • 51. testブランチを削除 git branch -D test HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B test origin/master
  • 52. testブランチを削除 git branch -D test HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B origin/master
  • 53. 変更してコミット(C) edit ; git commit -am “Add commit C” HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A master 1 2 master 1 2 B origin/master
  • 54. 変更してコミット(C) edit ; git commit -am “Add commit C” HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A C master 1 2 master 1 2 B origin/master
  • 55. 変更してコミット(C) edit ; git commit -am “Add commit C” HEAD リモートリポジトリ(test.git) ローカルリポジトリ HEAD A C master 1 2 master 1 2 B origin/master やっぱりコミットBが必要だった....
  • 56. Gitは時間的な変遷を管理する ● Gitの作業履歴が残っている。 ● git reflog で過去の作業履歴を参照できる。
  • 57. $ git reflog 4341590 HEAD@{0}: commit: Commit-C e6703af HEAD@{1}: checkout: moving from test to master 1b3e6dc HEAD@{2}: commit: Commit-B 5b2ff15 HEAD@{3}: checkout: moving from master to test e6703af HEAD@{4}: commit: Commit-A 5b2ff15 HEAD@{5}: clone: from /tmp/test.git
  • 58. Gitは時間的な変遷を管理する ● Gitの作業履歴が残っている。 ● git reflog で過去の作業履歴を参照できる。 ● ただし90日以内又はgit gcを実行しない/されない場合。 ● 不安ならGCを無効にする。 – git config --global gc.auto 0 ● 全てコミットしましょう。 – ローカルリポジトリ内で完結するので他の利用者には影響は ない。 – コミットしていれば救われる。
  • 59. まとめ ● Gitは分散 ● 作業はローカルリポジトリで管理される。 ● リモートリポジトリへの影響はあまり気にしない。 ● Gitは頑健 ● Gitは時間的な変遷を管理する ● コミットしていれば、過去を取り戻せる(こともあ る)。 ● コミットしていれば、失敗は怖くない。