いつやるの?Git入門 v1.1.0

130,335 views
151,015 views

Published on

Frontrend Vol.6 powered by CyberAgent, Inc.
http://frontrend.doorkeeper.jp/events/6907

で発表したプレゼン資料です。

こういう資料に対する投げ銭的なのがどうなるのか気になっていたので、もしよろしければ・・・!15円からできるソーシャルカンパサービスだそうですm(_ _)m
http://kampa.me/t/dev

Published in: Technology, Art & Photos
3 Comments
380 Likes
Statistics
Notes
  • Pro Git --- http://amzn.to/1RsRDKI
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Version Control with Git: Powerful tools and techniques for collaborative software development --- http://amzn.to/22qrnWK
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Ry's Git Tutorial --- http://amzn.to/25cZS1F
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
130,335
On SlideShare
0
From Embeds
0
Number of Embeds
49,017
Actions
Shares
0
Downloads
752
Comments
3
Likes
380
Embeds 0
No embeds

No notes for slide

いつやるの?Git入門 v1.1.0

  1. 1. 2013/11/16 @matsukaz 入門 いつやるの? 1.1.0
  2. 2. 修正履歴 ・「データ領域を指定commitに戻す」のコマンドが  このページだけ誤植 (P113) ・「ブランチの作成」のコマンドを修正 (P147) ・「Gitのブランチを作成して切り替える」のコマンドを  修正 (P153、P154)
  3. 3. @matsukaz 松下 雅和 サイバーエージェント エンジニア DevLOVEスタッフ
  4. 4. 今日のゴール http://www.flickr.com/photos/flavijus/3635413767/
  5. 5. のコマンドと 裏の仕組みを理解
  6. 6. ただのコマンド 紹介じゃないよ!! http://www.flickr.com/photos/aschultz/3407606139/
  7. 7. 仕組みを知らずに 使っていると、
  8. 8. とんでもないこと やらかしちゃう かも?
  9. 9. つい先日は Jenkinsの 開発者が...
  10. 10. https://groups.google.com/forum/#!msg/jenkinsci-dev/-myjRIPcVwU/ t4nkXONp8qgJ Hi all, I have triggered an involuntary "forced push" last night on the list of Jenkins-CI plugins indicated below in this e-mail. My apology I did not realise that I actually had forced push permissions and I do apologise for the inconvenience caused. The operations pushed back the all the branches to around 1 month. The history is not lost and is still on the GitHub server but on detached branches. The solution I can raise a request to GitHub to provide the "reflog" of those repositories and restore the branches to the point before my forced push. Alternatively the owners of those repositories can still perform a "forced push" to restore the correct position of the branches. (if you would like to do so, please write to the mailing list so that we do not overlap the recovery operations) AW - *PLEASE READ* Re: strange pushes on GitHub lucamilanesio
  11. 11. antexec-plugin.git artifactory-plugin.git associated-files-plugin.git audit2db-plugin.git audit-trail-plugin.git backend-pull-request-greeter.git beaker-builder-plugin.git branch-api-plugin.git build-flow-plugin.git buildgraph-view.git build-pipeline-plugin.git build-timeout-plugin.git buildtriggerbadge-plugin.git bytecode-compatibility-transformer.git ci-game-plugin.git clearcase-plugin.git clearcase-ucm-plugin.git cloudbees-folder-plugin.git cloudbees-plugin-gateway.git cloudtest-plugin.git clover-plugin.git cobertura-plugin.git collabnet-plugin.git collapsing-console-sections-plugin.git compact-columns-plugin.git compress-artifacts-plugin.git conditional-buildstep-plugin.git config-file-provider-plugin.git configurationslicing-plugin.git copyartifact-plugin.git copy-project-link-plugin.git copy-to-slave-plugin.git cppcheck-plugin.git credentials-plugin.git crowd2-plugin.git crowd-plugin.git customtools-plugin.git cvsclient.git cvs-plugin.git dashboard-view-plugin.git datical-db-plugin.git dependency-check-plugin.git deploy-plugin.git disable-failed-job-plugin.git disk-usage-plugin.git doclinks-plugin.gitugin.git dry-plugin.git dynamic-axis-plugin.git ec2-plugin.git elastic-axis-plugin.git email-ext-plugin.git envinject-lib.git envinject-plugin.git extended-choice-parameter-plugin.git extra-columns-plugin.git extras-executable-war.git extreme-feedback-plugin.git gearman-plugin.git gerrit-trigger-plugin.git gitbucket-plugin.git git-chooser-alternative-plugin.git git-client-plugin.git git-plugin.git global-build-stats-plugin.git global-variable-string-parameter-plugin.git gradle-jpi-plugin.git grails-plugin.git greenballs-plugin.git groovy-postbuild-plugin.git heavy-job-plugin.git hockeyapp-plugin.git http-request-plugin.git humbug-plugin.git instant-messaging-plugin.git integrity-plugin.git ironmq-notifier-plugin.git ivytrigger-plugin.git jacoco-plugin.git jclouds-plugin.git jira-plugin.git jobConfigHistory-plugin.git job-dsl-plugin.git job-import-plugin.git job-poll-action-plugin.git jquery-plugin.git jquery-ui-plugin.git json-lib.git kiuwan-plugin.git label-verifier-plugin.git ldap-plugin.git leiningen-plugin.git lib-annotation-indexer.git lib-task-reactor.git lib-windows-remote-command.git literate-cli.git logfilesizechecker-plugin.git m2release-plugin.git m2-repo-reaper-plugin.git mailer-plugin.git matrix-auth-plugin.git maven-hpi-plugin.git maven-info-plugin.git mercurial-plugin.git mesos-plugin.git metadata-plugin.git mock-security-realm-plugin.git msbuild-plugin.git naginator-plugin.git nerrvana-plugin.git nested-view-plugin.git next-build-number-plugin.git next-executions-plugin.git parameterized-trigger-plugin.git perforce-plugin.git performance-plugin.git persona-plugin.git pitmutation-plugin.git plain-credentials-plugin.git plugin-compat-tester.git postbuildscript-plugin.git promoted-builds-plugin.git prqa-plugin.git publish-over-cifs-plugin.git puppet-jenkins.git radiatorview-plugin.git rapiddeploy-plugin.git release-plugin.git repo-plugin.git rich-text-publisher-plugin.git robot-plugin.git run-condition-plugin.git rvm-plugin.git scm2job-plugin.git scm-api-plugin.git scoring-load-balancer-plugin.git script-scm-plugin.git selenium-axis-plugin.git selenium-builder-plugin.git selenium-tests.git skype-im-plugin.git skytap-cloud-plugin.git smartfrog-plugin.git sms-plugin.git sounds-plugin.git ssh-agent-plugin.git ssh-credentials-plugin.git sshd-module.git ssh-slaves-plugin.git starteam-plugin.git stashnotifier-plugin.git subversion-plugin.git suppress-stack-trace-plugin.git swarm-plugin.git synergy_scm-plugin.git tap-plugin.git teamconcert-plugin.git testlink-plugin.git tfs-plugin.git thin-backup-plugin.git throttle-concurrent-builds-plugin.git tikal-multijob-plugin.git timestamper-plugin.git token-macro-plugin.git transifex-plugin.git translation-plugin.git trilead-ssh2.git unity3d-plugin.git veracode-scanner-plugin.git view-job-filters-plugin.git virtualbox-plugin.git vsphere-cloud-plugin.git vstestrunner-plugin.git walldisplay-plugin.git warnings-plugin.git weblogic-deployer-plugin.git winstone.git wix-plugin.git ws-cleanup-plugin.git xcode-plugin.git xstream.git xtrigger-lib.git xunit-plugin.git xvfb-plugin.git xvnc-plugin.git リビジョンが戻ったリポジトリたち 全部で184...(´;ω;`)ブワッ
  12. 12. 不安を感じながら 使いたく ないよね? http://www.flickr.com/photos/tjflex/233579552/
  13. 13. 仕組みが分かれば どんなツールも 使いこなせる http://www.flickr.com/photos/pennuja/5363515039/
  14. 14. 仕組みから しっかりと 理解しよう!! ※ といっても入門なので、深過ぎない程度で http://www.flickr.com/photos/danielygo/7357503268/
  15. 15. Agenda Gitの内部構造 ブ ラ ン チ リモートリポジトリ Gitっておいしいの?
  16. 16. Gitの内部構造 ブ ラ ン チ リモートリポジトリ Gitっておいしいの? Agenda
  17. 17. Gitを 一言で言うと、
  18. 18. 分散型 バージョン 管理システム http://www.google.com/about/datacenters/gallery/#/tech/12
  19. 19. 分散型じゃない バージョン 管理システム といえば・・・
  20. 20. http://cmpilato.blogspot.jp/2009/02/subversion-desktop-wallpaper.html
  21. 21. Subversion の全体構成
  22. 22. ローカル ディレクトリ リポジトリ ローカル ディレクトリ commit ファイル 更新 update (merge)
  23. 23. ローカル ディレクトリ リポジトリ ローカル ディレクトリ commit ファイル 更新 update (merge) ローカルは ある時点の 変更履歴のみ
  24. 24. ローカル ディレクトリ リポジトリ ローカル ディレクトリ commit ファイル 更新 update (merge) リポジトリに 変更内容を反映
  25. 25. ローカル ディレクトリ リポジトリ ローカル ディレクトリ commit ファイル 更新 update (merge) リポジトリの 変更内容を取得
  26. 26. ローカル ディレクトリ リポジトリ ローカル ディレクトリ commit ファイル 更新 update (merge) Subversionで 一番気をつけるのは commit
  27. 27. Subversion の問題点
  28. 28. commit対象を 指定しづらい (全て/個別)
  29. 29. commitの 取り消しは大変
  30. 30. いくつかの操作は オンライン必須 ・commit ・update ・log
  31. 31. リポジトリが 肥大化する
  32. 32. 一方 Gitの場合は、
  33. 33. Gitの 全体構成
  34. 34. ローカル ディレクトリ リモート リポジトリ ローカル ディレクトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push (merge/ rebase) fetch
  35. 35. ローカル ディレクトリ リモート リポジトリ ローカル ディレクトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push (merge/ rebase) fetch ローカルリポジトリは リモートリポジトリの 完全な複製
  36. 36. ローカル ディレクトリ リモート リポジトリ ローカル ディレクトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push (merge/ rebase) fetch ローカル リポジトリに 変更内容を反映
  37. 37. ローカル ディレクトリ リモート リポジトリ ローカル ディレクトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push (merge/ rebase) fetch リモート リポジトリに 変更内容を反映
  38. 38. ローカル ディレクトリ リモート リポジトリ ローカル ディレクトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push (merge/ rebase) fetch リモート リポジトリから 変更内容を取得
  39. 39. ローカル ディレクトリ リモート リポジトリ ローカル ディレクトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push (merge/ rebase) fetch リモート リポジトリの 変更内容を反映
  40. 40. ローカル ディレクトリ リモート リポジトリ ローカル ディレクトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push (merge/ rebase) fetch fetch + merge/rebase pull
  41. 41. ローカル ディレクトリ リモート リポジトリ ローカル ディレクトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push (merge/ rebase) fetch Gitで一番 気をつけるのは merge/rebase
  42. 42. Gitのメリット
  43. 43. commit対象の 管理が簡単
  44. 44. コミット内容を 後から修正可能
  45. 45. ほとんどの操作が ローカルで完結 (push/fetch以外)
  46. 46. ブランチや タグ操作が高速
  47. 47. 効率的に リポジトリ内の データを保持
  48. 48. 要は、従来の バージョン管理 システムよりも
  49. 49. 管理対象に 合わせて様々な ワークフローで 利用されている
  50. 50. ※ 書籍「Pro Git」より 代表的な例
  51. 51. 中央集権型
  52. 52. Subversionに近い運用 共有リポジトリ と常に同期 共有 リポジトリ developer developer developer
  53. 53. 統合 マネージャー型
  54. 54. pull request メイン リポジトリ developer public developer public developer private developer private integration manager 変更を公開 &反映依頼変更を 反映 変更 変更を マージ
  55. 55. 独裁者と 若頭型
  56. 56. Linuxなど巨大プロジェクト メイン リポジトリ developer public developer public developer public 若頭 独裁者 若頭分を マージ developer 分をマージ 変更を 反映 変更
  57. 57. Gitの可能性は∞!! http://www.flickr.com/photos/llamnuds/2723112918/
  58. 58. ブランチ・タグの 運用ルールも いろいろ
  59. 59. GitHub Flow git-flow https://github.com/darashi/horesa.se
  60. 60. Agenda Gitの内部構造 ブ ラ ン チ リモートリポジトリ Gitっておいしいの?
  61. 61. Gitで大事なのは 3つのデータ領域 作業ディレクトリ (ワークツリー) Gitディレクトリ ステージング・エリア (インデックス)
  62. 62. この3つを 理解出来れば Gitは怖くない!! http://www.flickr.com/photos/myke/2998073342/
  63. 63. もう一度 Gitの全体図
  64. 64. ローカル ディレクトリ リモート リポジトリ ローカル ディレクトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push (merge/ rebase) fetch
  65. 65. ローカル ディレクトリ ローカル ディレクトリ リモート リポジトリ ファイル 更新 ローカル リポジトリ ローカル リポジトリ commit push fetch (merge/ rebase) ローカル環境 ローカル環境
  66. 66. ローカル環境の 内部構造
  67. 67. 物理構造 git-root parent child.txt hello.txt 論理構造 .git ※ 物理構造は参考程度で
  68. 68. 物理構造 git-root parent child.txt hello.txt 論理構造 .git Gitディレクトリ 作業ディレクトリ (ワークツリー) ※ 物理構造は参考程度で
  69. 69. 物理構造 git-root parent child.txt hello.txt 論理構造 .git Gitが管理して いるディレクトリ Gitディレクトリ 作業ディレクトリ (ワークツリー) 実際に作業中の ディレクトリ ※ 物理構造は参考程度で
  70. 70. 物理構造 git-root parent child.txt hello.txt … .git objects config 論理構造 Gitディレクトリ 作業ディレクトリ (ワークツリー) index ※ 物理構造は参考程度で
  71. 71. 物理構造 git-root parent child.txt hello.txt … .git objects index config 論理構造 Gitディレクトリ 作業ディレクトリ (ワークツリー) ステージング・エリア (インデックス) ※ 物理構造は参考程度で
  72. 72. ※ 物理構造は参考程度で 物理構造 git-root parent child.txt hello.txt … .git objects index config 論理構造 Gitディレクトリ 作業ディレクトリ (ワークツリー) ステージング・エリア (インデックス) 3つの データ領域で 構成されている
  73. 73. Gitコマンド = データ領域間の ファイルの操作
  74. 74. Gitコマンドを 実行してみよう! http://www.flickr.com/photos/pdstahl/3469156022/
  75. 75. 作業 ディレクトリ 初期状態のローカル環境
  76. 76. 作業 ディレクトリ 初期状態のローカル環境 file2 file1 dir1 file3 新しい ファイルを 作成
  77. 77. Git管理を 開始する git init
  78. 78. 作業 ディレクトリ file2 file1 dir1 file3 git init
  79. 79. 作業 ディレクトリ ステージング エリア Gitディレクトリ git init 領域準備 領域準備 file2 file1 dir1 file3
  80. 80. リポジトリに 追加したい対象を 指定する git add <filepattern>...
  81. 81. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 file1 dir1 file3 git add file1 dir1/file2
  82. 82. file2 file1 file2 file1 dir1 file3 作業 ディレクトリ ステージング エリア Gitディレクトリ git add file1 dir1/file2 ステージ される ステージ される dir1 ディレクトリは 独自の ツリー構造
  83. 83. 更新内容を リポジトリに 登録する git commit -m <msg>
  84. 84. file2 file1 file2 file1 dir1 file3 作業 ディレクトリ ステージング エリア Gitディレクトリ git commit -m 'コミットするよ。' dir1
  85. 85. 作業 ディレクトリ ステージング エリア Gitディレクトリ git commit -m 'コミットするよ。' file2 1a401e file1 file2 file1 file2 file1 dir1 file3 更新内容 を登録 コミットID を発行 dir1 dir1
  86. 86. ファイルを 修正した場合も git add
  87. 87. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 file2 file1 file2 file1’ dir1 file3 ファイル を修正 dir1 dir1
  88. 88. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 file2 file1 file2 dir1 file3 git add . dir1 dir1 file1’
  89. 89. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 file2file2 dir1 file3 git add . file3 「.」は全ての 未登録ファイルが ステージされる dir1 dir1 file1’ file1’
  90. 90. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 file2file2 dir1 file3 file3 git commit -m 'もっとコミット。' dir1 dir1 file1’ file1’
  91. 91. file1’ 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 file3file2 file3file2 dir1 file3 git commit -m 'もっとコミット。' dir1 dir1 更新内容 を登録 file1’ file1’
  92. 92. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 file3file2 file3file2 dir1 file3 git commit -m 'もっとコミット。' 前のcommitが 親となる dir1 dir1 file1’file1’ file1’
  93. 93. ファイルを 削除する git rm <file>...
  94. 94. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 file3 file1’ file2 file1’ file3file2 file1’ dir1 file3 git rm dir1/file2 dir1 dir1
  95. 95. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 file3 file1’file1’ file3 file1’ dir1 file3 git rm dir1/file2 dir1 dir1 ファイルが 削除される
  96. 96. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 file3 file1’file1’ file3 file1’ dir1 file3 git commit -m '削除情報をコミット。' dir1 dir1
  97. 97. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3 file1’ dir1 file3 git commit -m '削除情報をコミット。' 更新内容 を登録 dir1 dir1
  98. 98. ステージングエリア をGitリポジトリの HEAD状態に戻す git reset HEAD <file> ※ HEAD=Gitリポジトリが見ている最新のcommit位置
  99. 99. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3’ file1’ dir1 file3’ dir1 dir1 ステージ されてる git addした直後
  100. 100. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’file1’ dir1 git reset HEAD dir1/file3 dir1 dir1 file3’file3’
  101. 101. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3 file1’ dir1 git reset HEAD dir1/file3 dir1 dir1 ステージする前の 状態に戻される file3’
  102. 102. 作業ディレクトリを ステージングエリア の状態に戻す git checkout -- <file>
  103. 103. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3 file1’ dir1 ファイル を修正 dir1 dir1 ファイルを変更した直後 file3’
  104. 104. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3 file1’ dir1 git checkout -- dir1/file3 dir1 dir1 file3’
  105. 105. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3 file1’ dir1 file3 git checkout -- dir1/file3 修正する前の 状態に戻る dir1 dir1
  106. 106. ここまでの流れを 整理すると
  107. 107. Gitディレクトリ 作業 ディレクトリ ステージング エリア git reset HEAD <file> git add/rm/mv git checkout -- <file> git commit git init ファイル更新
  108. 108. その他の 基本コマンド
  109. 109. ファイルや ディレクトリを 移動する git mv
  110. 110. データ領域を 指定commitの 状態に戻す git reset --<mode> <commit> git resetのオプションなどは以下の説明が分かりやすいので詳細はそちらで http://d.hatena.ne.jp/murank/20110327/1301224770 (soft / hard / mixed)
  111. 111. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3 file1’ dir1 file3 git reset --hard HEAD^ dir1 dir1
  112. 112. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3 file1’ dir1 file3 git reset --hard HEAD^ file2file2 HEADの一つ 前のcommitの 状態に戻る dir1 dir1
  113. 113. 作業ディレクトリ の状態を見る git status
  114. 114. コミットログを 見る git log --graph --color --graphオプションをつけるとコミットの流れをグラフ表示してくれる
  115. 115. Gitリポジトリを 閲覧するための GUI起動 gitk
  116. 116. Agenda Gitの内部構造 ブ ラ ン チ リモートリポジトリ Gitっておいしいの?
  117. 117. ブランチとは
  118. 118. メインとは 別の流れで 作業を続ける機能
  119. 119. Subversionの場合 /trunk /1.0 1.0.0 /1.1 1.0.1 1.0.2 trunkへ マージ END trunk 1.0.0/1.0/trunk branch tag
  120. 120. Gitには trunkがなく、 全てがブランチ
  121. 121. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3 file1’ dir1 file3 dir1 dir1
  122. 122. 作業 ディレクトリ ステージング エリア Gitディレクトリ file2 1a401e file1 510db8 6ccfda file3 file1’file1’ file3 file1’ dir1 file3 dir1 dir1 master Git管理を開始すると masterブランチが デフォルトで用意される
  123. 123. ブランチの 一覧を表示する git branch -a -aオプションをつけると、後述するリモートブランチも一覧で表示される
  124. 124. コミットグラフで 表現すると
  125. 125. A B master
  126. 126. A B master ブランチは commitの位置を 指すだけ
  127. 127. commitすると masterの位置も 移動するmaster A B C
  128. 128. developブランチを 切った場合も、 同じcommitを指す master A B C develop developブランチの切り方は後述
  129. 129. master A B C D masterでcommit するとmasterだけ 移動する develop
  130. 130. master A B C D E develop developも masterとは別で 移動する
  131. 131. master A B C D E developの変更を masterにmergeする場合 develop
  132. 132. master A B C D E masterで developを merge develop developの変更を masterにmergeする場合
  133. 133. master A B C D E F DとEの両方の commitが 親となる conflict する場合は 対応 develop developの変更を masterにmergeする場合
  134. 134. develop master A B C D E F G H developの変更を masterにmergeする場合 その後も commitできる
  135. 135. master A B C D E develop でmasterを rebase develop masterの変更を developにrebaseする場合
  136. 136. master A B C D E developと masterの共通先祖に 移動、そこからEの diffを取得 develop masterの変更を developにrebaseする場合
  137. 137. master A B C D E’E 取得した diffをmasterに 適用して新たな commitを作成 develop masterの変更を developにrebaseする場合
  138. 138. master A B C D E’ conflict する場合は 対応develop masterの変更を developにrebaseする場合
  139. 139. A B C D E’ master F G develop masterの変更を developにrebaseする場合 その後も commitできる
  140. 140. merge or rebase ?
  141. 141. いろいろ論争が あるので 適材適所で http://www.flickr.com/photos/bastiaanssen/4628611135/
  142. 142. ブランチを 操作してみよう! http://www.flickr.com/photos/statkraft/4077416680/
  143. 143. 作業 ディレクトリ ステージング エリア Gitディレクトリ A file1 master HEAD B file1’file1’file1’ 少しcommitしたローカル環境
  144. 144. 作業 ディレクトリ ステージング エリア Gitディレクトリ A file1 master HEAD B file1’file1’file1’ 少しcommitしたローカル環境 現在作業中の ブランチを 表す ステージングエリアは HEADとの差分で 更新を判断
  145. 145. Gitのブランチを 作成する git branch <new_branch> [<start_point>]
  146. 146. 作業 ディレクトリ ステージング エリア Gitディレクトリ git branch develop A file1 master HEAD B file1’file1’file1’
  147. 147. 作業 ディレクトリ ステージング エリア Gitディレクトリ git branch develop A file1 master HEAD B develop file1’file1’file1’ develop ブランチが 出来るHEAD の位置は 変わらない
  148. 148. 作業中の ブランチを 切り替える git checkout <branch>
  149. 149. 作業 ディレクトリ ステージング エリア Gitディレクトリ git checkout develop A file1 master HEAD B file2 file1’ C file1’file1’ develop
  150. 150. 作業 ディレクトリ ステージング エリア Gitディレクトリ git checkout develop A file1 master HEAD B develop file2 file1’ C HEADの位置 が変わる file2file2 HEADに 合わせて復元 file1 file1
  151. 151. git checkout -b <new_branch> [<start_point>] Gitのブランチを 作成して 切り替える
  152. 152. git checkout -b <new_branch> [<start_point>] git checkout <new_branch> git branch <new_branch> [<start_point>] + =
  153. 153. git merge <branch> 現在のブランチに 指定ブランチを マージする
  154. 154. 作業 ディレクトリ ステージング エリア Gitディレクトリ git merge develop file1’file1’ A file1 master HEAD B develop file2 file1’ C
  155. 155. 作業 ディレクトリ ステージング エリア Gitディレクトリ git merge develop file2 file1’ file2 file1’ merge commitが 作られる A file1 master HEAD B develop file2 file1’ D C Cの変更も 反映される
  156. 156. git rebase <branch> 現在のブランチを 指定ブランチから リベースする
  157. 157. 作業 ディレクトリ ステージング エリア Gitディレクトリ A git rebase master file1 file2file2 file1file1 master HEAD B develop C file2 file1’
  158. 158. 作業 ディレクトリ ステージング エリア Gitディレクトリ A master HEAD git rebase master B develop C’ file2 file1 file1’ file2file2 file1’file1’ masterの 最新commitに rebaseされる Bの変更も 反映される
  159. 159. Agenda Gitの内部構造 ブ ラ ン チ リモートリポジトリ Gitっておいしいの?
  160. 160. リモート リポジトリは ブランチで連携
  161. 161. コミットグラフで 表現すると
  162. 162. ローカルリポジトリリモートリポジトリ master A B
  163. 163. ローカルリポジトリリモートリポジトリ master A B origin/master master A B cloneで リモートリポジトリが ローカルにコピー される
  164. 164. ローカルリポジトリリモートリポジトリ master A B origin/master master A B リモートブランチ (リモートを追跡する) 同名の ローカルブランチも 出来る
  165. 165. ローカルリポジトリリモートリポジトリ master A B origin/master master A B リモートリポジトリ /ブランチ名
  166. 166. ローカルリポジトリリモートリポジトリ master A B origin/master master C A B リモート が先に進んだ 場合は
  167. 167. ローカルリポジトリリモートリポジトリ master A B origin/master master C A B C fetchすると リモートブランチ も同じ状態に
  168. 168. ローカルリポジトリリモートリポジトリ master A B origin/master master C A B C ローカルブランチ はリモートブランチと merge/rebase
  169. 169. ローカルリポジトリリモートリポジトリ master A B origin/master master C A B pull= fetch+merge/rebase なので
  170. 170. ローカルリポジトリリモートリポジトリ master A B origin/master master C A B C pullなら ローカルブランチも リモートブランチも 同時に更新
  171. 171. ローカルリポジトリリモートリポジトリ master A B origin/master master C A B C D commit した場合は
  172. 172. ローカルリポジトリリモートリポジトリ master A B origin/master master C D A B C D push!! リモートブランチと リモートリポジトリに 反映
  173. 173. ローカルリポジトリリモートリポジトリ master A B origin/master master C D F A B C D E 両方 更新された 場合は
  174. 174. ローカルリポジトリリモートリポジトリ master A B origin/master master C D F A B C D E G F 一度 mergeして
  175. 175. ローカルリポジトリリモートリポジトリ master A B origin/master master C D F push!! G A B C D E G F E
  176. 176. ローカルリポジトリリモートリポジトリ master A B origin/master master C D F A B C D E 他の方法 としては
  177. 177. ローカルリポジトリリモートリポジトリ master A B origin/master master C D F A B C D F E rebase もアリ E’
  178. 178. ローカルリポジトリリモートリポジトリ master A B origin/master master C D F push!! E’ A B C D F E’
  179. 179. ローカルリポジトリリモートリポジトリ master A B C E F D G H develop master A B C E F I D G develop origin/master origin/develop だんだん複雑 になる...
  180. 180. リモート リポジトリを 操作してみよう! http://www.flickr.com/photos/loozrboy/7311781992/
  181. 181. リモートリポジトリ をローカルに複製 git clone <url>
  182. 182. リモートリポジトリ A B master git clone git@github.com:a/b.git
  183. 183. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file1’file1’ A B master file1 file1’ master A B HEAD origin/master データ領域が 作られる git clone git@github.com:a/b.git ファイルも 復元される
  184. 184. リモートリポジト リに変更を送信 git push <remote> <refspec>
  185. 185. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file1’file1’ A B master file1’ master A B HEAD origin/master file1
  186. 186. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file1’file1’ A B master file2 file1’ master A B HEAD origin/masterファイル 作成 file1
  187. 187. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file1’file1’ A B master file2 file2 file1’ master A B HEAD origin/master git add git add file2 file1
  188. 188. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file1’file1’ A B master file2 file2 file1’ master A B HEAD origin/master C file2 git commit git commit -m 'add file2' file1
  189. 189. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file1’file1’ A B C master master A B HEAD origin/master C リモートリ ポジトリ反映 file2 file2 git push origin master file1’ file2file1
  190. 190. リモートブランチ を最新に更新 git fetch <remote> <refspec>
  191. 191. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file1’file1’ A B C git fetch origin master master master A B HEAD origin/master file1’file1
  192. 192. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file1’file1’ A B C git fetch origin master master master A B HEAD origin/master C リモート ブランチ更新 file1’ file2file1
  193. 193. git pull <remote> <refspec> git merge <branch> git fetch <remote> <refspec> = +
  194. 194. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file2file2 A B C git pull origin master master masterA B HEAD origin/master D file2file1’file1
  195. 195. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ master A B HEAD origin/master C D E A B C master git pull origin master file2 file3 file3file3 file2file2 リモート ブランチ更新 merge file1’file1
  196. 196. git pull <remote> <refspec> --rebase git rebase <branch> git fetch <remote> <refspec> +
  197. 197. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file2file2 A B C git pull origin master --rebase master masterA B HEAD origin/master D file2file1’file1
  198. 198. 作業 ディレクトリ ステージング エリア ローカルリポジトリ リモートリポジトリ file2file2 A B C git pull origin master --rebase master file1 file1’ masterA B HEAD origin/master D’ file2 C file3 file3file3 rebase リモート ブランチ更新
  199. 199. まとめ
  200. 200. 細かいコマンドは まだまだあるので ググってね
  201. 201. まずは ローカルでの 操作に慣れよう!!
  202. 202. リモートとの やりとりは pushとpullを使う
  203. 203. fetchや個別の merge/rebaseは 慣れてから
  204. 204. 普段から リモートとの ズレを抑える ように心がける
  205. 205. おかしくなったら データ領域の 状態を冷静に見る
  206. 206. 大事なのは データ領域!!
  207. 207. これで Gitも 余裕だね!!
  208. 208. 参考URL - Git初心者が見るべきサイトまとめ - http://matome.naver.jp/odai/2136491451473222801 - いろいろオススメサイトをまとめました!
  209. 209. ご清聴 ありがとう ございました こういう資料に対する投げ銭的なものを試してみたいと思ってたので、 もしよろしければ・・・!15円からできるソーシャルカンパサービスだそうです。 http://kampa.me/t/dev

×