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

1,416 views
1,263 views

Published on

0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,416
On SlideShare
0
From Embeds
0
Number of Embeds
17
Actions
Shares
0
Downloads
14
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

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

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

×