• Like
git 初めの一歩
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

git 初めの一歩

  • 661 views
Published

git の社内勉強会資料 …

git の社内勉強会資料

オリジナル資料
https://github.com/wbcchsyn/git-first-step

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
661
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
3
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. git 初めの一歩 February 20, 2014
  • 2. 目次 1 ローカルで使う 使ってみる branch を使用する 過去の履歴を活用する レポジトリの状態を確認する 2 リモートレポジトリを使う 使ってみる 複数人で開発する 更新が競合したら 3 その他 4 最後に
  • 3. introduction 目的 git を使い、man を読むための最低限の知識をつ ける 対象者 git を触った事が有るけれど、良く分からない人 注意 git はデフォルト設定で動作していると仮定 (設定次第では、この通りには動作しない) 注意 git の best practice ではありません
  • 4. ローカルで使う introduction 本章のスコープ workspace 作業ディレクトリ cached (index) staging 環境 repository git の本体
  • 5. init (ローカル) 使ってみる git を使い始める準備をする $ $ $ $ $ mkdir ˜/local rep cd ˜/local rep1 git init git config --global user.name ’Your Name’ git config --global user.email ’your@address’ 1 この後、しばらくは ˜/local rep で作業します
  • 6. 中で起きている事 使ってみる $ mkdir ˜/local rep $ cd ˜/local rep ここで作成するディレクトリが workspace
  • 7. 中で起きている事 使ってみる workspace $ mkdir ˜/local rep $ cd ˜/local rep ここで作成するディレクトリが workspace
  • 8. 中で起きている事 使ってみる workspace $ git config --global user.name ’Your Name’ $ git config --global user.email ’your@address’ home directory 直下の config file を編集 workspace, cached, repository には影響無し
  • 9. 中で起きている事 使ってみる workspace $ git init ワークスペース直下に .git ディレクトリを作成し、その中に cached や repository を初め git に必要な物を作成する
  • 10. 中で起きている事 使ってみる workspace repository cached (index) $ git init ワークスペース直下に .git ディレクトリを作成し、その中に cached や repository を初め git に必要な物を作成する
  • 11. 中で起きている事 使ってみる workspace repository cached (index) $ git init 今後、.git ディレクトリを直接触るか、git 以外のコマンドは、 基本的に workspace の作業と思ってよい。
  • 12. add, commit 使ってみる repository にファイル、ディレクトリを追加する workspace を更新 $ touch a b c
  • 13. add, commit 使ってみる repository にファイル、ディレクトリを追加する workspace を cached に反映 $ git add a b
  • 14. add, commit 使ってみる repository にファイル、ディレクトリを追加する cached を repository に反映 $ git commit -m ’Add a and b.’
  • 15. 中で起きている事 使ってみる workspace cached (index) repository
  • 16. 中で起きている事 使ってみる workspace repository cached (index) $ touch a b c .git ディレクトリは触っていないので、workspace のみ変更
  • 17. 中で起きている事 使ってみる workspace abc repository cached (index) $ touch a b c .git ディレクトリは触っていないので、workspace のみ変更
  • 18. 中で起きている事 使ってみる workspace abc repository cached (index) $ git add a b workspace から cached へファイル、ディレクトリをコピー
  • 19. 中で起きている事 使ってみる workspace abc repository cached (index) ab $ git add a b workspace から cached へファイル、ディレクトリをコピー
  • 20. 中で起きている事 使ってみる workspace abc repository cached (index) ab $ git commit -m ’Add a and b.’ cached を取り込み、message を添えて commit を作成
  • 21. 中で起きている事 使ってみる workspace abc repository Add a and b. cached (index) ab ab $ git commit -m ’Add a and b.’ cached を取り込み、message を添えて commit を作成
  • 22. 中で起きている事 使ってみる workspace abc repository cached (index) ab Add a and b. ab master $ git commit -m ’Add a and b.’ また、初回 commit 時のみ master branch を作成 (branch: commit へのリンクの様な物)
  • 23. 中で起きている事 使ってみる workspace abc repository cached (index) ab Add a and b. ab master←HEAD $ git commit -m ’Add a and b.’ 最初、HEAD は master へ向いている (HEAD: repository 内の現在の commit を指すリンクの様 な物) (この場合、HEAD はリンクのリンクとなる)
  • 24. git add コマンド補足 使ってみる git add path1 [path2 [path3 ...]]2 で複数の path を一度に workspace へコピー可能 path が ディレクトリの場合、そのディレクトリ以下の ファイルを再起的に git add する workspace のトップディレクトリで git add . と行うと全 ファイルを git add できる 2 [ ] でくくってあるパラメータは省略可能という意味
  • 25. git commit コマンド補足 git commit でエディタが立ち上がり、そこで commit message を入 力すると新 commit が作成される git commit -m message でエディタを立ち上げずに commit message を指定する 事も可能 message の無い commit を作成する事はできない
  • 26. mv, rm 使ってみる repository からファイルの削除、移動 (リネーム) workspace, cached でリネーム $ git mv a d
  • 27. mv, rm 使ってみる repository からファイルの削除、移動 (リネーム) workspace, cached で削除 $ git rm b
  • 28. mv, rm 使ってみる repository からファイルの削除、移動 (リネーム) cached を repository に反映 $ git commit -m ’Rename a to d and delete b.’
  • 29. 中で起きている事 使ってみる repository workspace abc cached (index) ab Add a and b. ab master←HEAD
  • 30. 中で起きている事 使ってみる repository workspace abc cached (index) ab Add a and b. ab master←HEAD $ git mv a d workspace, cached の両方でファイルを移動 (リネーム)
  • 31. 中で起きている事 使ってみる repository workspace bcd cached (index) b d Add a and b. ab master←HEAD $ git mv a d workspace, cached の両方でファイルを移動 (リネーム)
  • 32. 中で起きている事 使ってみる repository workspace bcd cached (index) b d Add a and b. ab master←HEAD $ git rm b workspace, cached の両方からファイルを削除
  • 33. 中で起きている事 使ってみる repository workspace cd cached (index) d Add a and b. ab master←HEAD $ git rm b workspace, cached の両方からファイルを削除
  • 34. 中で起きている事 使ってみる repository workspace cd cached (index) d Add a and b. ab master←HEAD $ git commit -m ’Rename a to d and delete b.’ cached を取り込み、message を添えて、現在の HEAD を親と する commit を作成
  • 35. 中で起きている事 使ってみる repository workspace cd cached (index) d Rename a to d and delete b. d Add a and b. ab master←HEAD $ git commit -m ’Rename a to d and delete b.’ cached を取り込み、message を添えて、現在の HEAD を親と する commit を作成
  • 36. 中で起きている事 使ってみる repository workspace cd cached (index) d Rename a to d and delete b. d Add a and b. ab master←HEAD $ git commit -m ’Rename a to d and delete b.’ HEAD が branch を指している時 (普通はこの状態) は、 その branch の向き先を新しい commit へ変更
  • 37. 中で起きている事 使ってみる repository workspace cd cached (index) d Rename a to d and delete b. d master←HEAD Add a and b. ab $ git commit -m ’Rename a to d and delete b.’ HEAD が branch を指している時 (普通はこの状態) は、 その branch の向き先を新しい commit へ変更
  • 38. 中で起きている事 使ってみる repository workspace cd Rename a to d and delete b. cached (index) d d master←HEAD Add a and b. ab $ git commit -m ’Rename a to d and delete b.’ HEAD は master へ向いているので、 結果的に新しい commit へ移動
  • 39. git mv コマンド補足 使ってみる git mv [-f] source destination で source を destination に移動 通常の mv コマンドのように、destination がディレクト リの場合、source は destination 以下のディレクトリに 移動 -f をつけると、既存のファイルを上書き出来る (-f が無い場合、エラーとなる)
  • 40. git rm コマンド補足 使ってみる git rm [-r] [-f] path1 [path2 [path3 ...]] で複数の path を削除可能 通常の rm コマンドのように、ディレクトリを削除する 場合は -r オプションが必要 workspace と cached の内容が違う時などは、誤操作防止 のために git rm はエラーになる そのような場合、-f を使うと正常に削除可能
  • 41. ここまでのまとめ 使ってみる git を始めたい場合、git init を実行 git add は workspace から cached へコピー git mv は workspace と cached 両方で移動、リネーム git rm は workspace と cached 両方で削除
  • 42. ここまでのまとめ 使ってみる git commit は cached に message を添えて commit を作成 HEAD が branch を向いている時は branch を新しい commit へ向ける branch は commit へのリンクの様な物 HEAD は現在の commit へのリンクの様な物 通常、HEAD は branch を指している事が多い
  • 43. branch (一覧、作成) branch を使用する branch の一覧表示、作成 現在の branch を確認 $ git branch * master
  • 44. branch (一覧、作成) branch を使用する branch の一覧表示、作成 新 branch の作成 $ git branch develop
  • 45. branch (一覧、作成) branch を使用する branch の一覧表示、作成 現在の branch を確認 $ git branch * master develop
  • 46. branch (一覧、作成) branch を使用する branch の一覧表示、作成 repository の更新を行ってみる $ git add c $ git commit -m ’Add c.’
  • 47. 中で起きている事 branch を使用する repository workspace cd cached (index) d Rename a to d and delete b. master←HEAD Add a and b.
  • 48. 中で起きている事 branch を使用する repository workspace cd cached (index) d Rename a to d and delete b. master←HEAD Add a and b. $ git branch 現在の branch 一覧を表示
  • 49. 中で起きている事 branch を使用する repository workspace cd cached (index) d Rename a to d and delete b. master←HEAD Add a and b. $ git branch * master * は HEAD が向いている branch の印
  • 50. 中で起きている事 branch を使用する repository workspace cd cached (index) d Rename a to d and delete b. master←HEAD Add a and b. $ git branch develop HEAD と同じ commit を指す branch を作成
  • 51. 中で起きている事 branch を使用する repository workspace cd cached (index) d Rename a to d and delete b. master←HEAD develop Add a and b. $ git branch develop HEAD と同じ commit を指す branch を作成
  • 52. 中で起きている事 branch を使用する repository workspace cd cached (index) d Rename a to d and delete b. master←HEAD develop Add a and b. $ git branch * master develop
  • 53. 中で起きている事 branch を使用する repository workspace cd cached (index) d Rename a to d and delete b. master←HEAD develop Add a and b. $ git add c c を cached へコピー
  • 54. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Rename a to d and delete b. master←HEAD develop Add a and b. $ git add c c を cached へコピー
  • 55. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Rename a to d and delete b. master←HEAD develop Add a and b. $ git commit -m ’Add c.’ cached を取り込み、message を添えて、現在の HEAD を親と する commit を作成
  • 56. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. Rename a to d and delete b. master←HEAD develop Add a and b. $ git commit -m ’Add c.’ cached を取り込み、message を添えて、現在の HEAD を親と する commit を作成
  • 57. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. Rename a to d and delete b. master←HEAD develop Add a and b. $ git commit -m ’Add c.’ HEAD が branch を指している時は その branch の向き先を新しい commit へ変更
  • 58. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. master←HEAD Rename a to d and delete b. develop Add a and b. $ git commit -m ’Add c.’ HEAD が branch を指している時は その branch の向き先を新しい commit へ変更
  • 59. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. master←HEAD Rename a to d and delete b. develop Add a and b. $ git commit -m ’Add c.’ HEAD が指しているのは master だけなので、develop は放置
  • 60. git branch コマンド補足 (一覧、作成) branch を使用する git branch [-a] で現在の branch 一覧を表示 -a オプションをつけると、remote branch3 も表示する git branch branch-name [start-point] で start-point をさす branch を作成 start-point は branch, HEAD, ハッシュ値 4 等で指定 start-point のデフォルト値は HEAD 3 4 後述 後述
  • 61. checkout branch を使用する HEAD の切り替えと、会わせて workspace と cached の変更 workspace のファイル確認 $ ls cd
  • 62. checkout branch を使用する HEAD の切り替えと、会わせて workspace と cached の変更 HEAD の切り替え実施 $ git checkout develop
  • 63. checkout branch を使用する HEAD の切り替えと、会わせて workspace と cached の変更 workspace のファイル再確認 $ ls d
  • 64. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. cd master←HEAD Rename a to d and delete b. d develop
  • 65. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. cd master←HEAD Rename a to d and delete b. d develop $ ls cd
  • 66. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. cd master←HEAD Rename a to d and delete b. d develop $ git checkout develop HEAD のリンクの向き先を develop に変更
  • 67. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. cd master Rename a to d and delete b. d develop←HEAD $ git checkout develop HEAD のリンクの向き先を develop に変更
  • 68. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. cd master Rename a to d and delete b. d develop←HEAD $ git checkout develop あわせて、workspace や cached に新旧 HEAD の差分も適用
  • 69. 中で起きている事 branch を使用する repository workspace d cached (index) d Add c. cd master Rename a to d and delete b. d develop←HEAD $ git checkout develop あわせて、workspace や cached に新旧 HEAD の差分も適用
  • 70. 中で起きている事 branch を使用する repository workspace d cached (index) d Add c. cd master Rename a to d and delete b. d develop←HEAD $ ls d
  • 71. git checkout コマンド補足 branch を使用する git checkout commit で HEAD の commit へ切り替え workspace, cached も会わせて変更 commit は branch, tag5 , ハッシュ値 6 等で指定 リリース時以外は HEAD はどこかの branch を指してい る状態にすると良い workspace や cached が clean でない場合 7 は 情報が失われる可能性があるので注意 5 後述 後述 7 未 commit のファイルがある場合 6
  • 72. merge branch を使用する 他のブランチの更新を取り込む develop を更新 $ touch e $ git add e $ git commit -m ’Add e.’
  • 73. merge branch を使用する 他のブランチの更新を取り込む master に develop の更新を反映 $ git checkout master $ git merge develop
  • 74. 中で起きている事 branch を使用する repository workspace d cached (index) d Add c. master Rename a to d and delete b. develop←HEAD
  • 75. 中で起きている事 branch を使用する repository workspace d cached (index) d Add c. master Rename a to d and delete b. develop←HEAD $ touch e $ git add e $ git commit -m ’Add e.’
  • 76. 中で起きている事 branch を使用する repository workspace de Add c. master cached (index) de Add e. develop←HEAD Rename a to d and delete b. $ touch e $ git add e $ git commit -m ’Add e.’
  • 77. 中で起きている事 branch を使用する repository workspace de Add c. master cached (index) de Add e. develop←HEAD Rename a to d and delete b. $ git checkout master
  • 78. 中で起きている事 branch を使用する repository workspace cd Add c. master←HEAD cached (index) cd Add e. develop Rename a to d and delete b. $ git checkout master
  • 79. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. master←HEAD Add e. develop Rename a to d and delete b. $ git merge develop HEAD と develop の共通の先祖の commit を探す “Rename a to d and delete b.” という commit が相当
  • 80. 中で起きている事 branch を使用する repository workspace cd cached (index) cd Add c. master←HEAD Add e. develop Rename a to d and delete b. $ git merge develop branch が分岐してから develop で行われた 全変更を workspace に適用
  • 81. 中で起きている事 branch を使用する repository workspace cde cached (index) cd Add c. master←HEAD Add e. develop Rename a to d and delete b. $ git merge develop branch が分岐してから develop で行われた 全変更を workspace に適用
  • 82. 中で起きている事 branch を使用する repository workspace cde cached (index) cd Add c. master←HEAD Add e. develop Rename a to d and delete b. $ git merge develop cached に適用
  • 83. 中で起きている事 branch を使用する repository workspace cde cached (index) cde Add c. master←HEAD Add e. develop Rename a to d and delete b. $ git merge develop cached に適用
  • 84. 中で起きている事 branch を使用する repository workspace cde cached (index) cde Add c. master←HEAD Add e. develop Rename a to d and delete b. $ git merge develop commit の作成
  • 85. 中で起きている事 branch を使用する repository workspace cde Merge branch ’develop’ master←HEAD Add e. cached (index) cde Add c. develop Rename a to d and delete b. $ git merge develop commit の作成
  • 86. git merge コマンド補足 branch を使用する 実際には branch の状態によって merge 後の repository の状態は異なる (ここで挙げた挙動は一例) コマンド実施後に message 入力画面が出てくる事と 出てこない事があるが 今回の範囲を超えるので詳細は割愛 いずれの場合でも、最新状態では 2 個の branch の 変更は全て含まれる
  • 87. branch (削除) branch を使用する 既存の branch を削除 現在の branch 一覧 $ git branch develop * master
  • 88. branch (削除) branch を使用する 既存の branch を削除 branch 削除 $ git branch -d develop
  • 89. branch (削除) branch を使用する 既存の branch を削除 現在の branch 一覧 $ git branch * master
  • 90. 中で起きている事 branch を使用する repository workspace cde cached (index) cde Merge branch ’develop’ master←HEAD Add c. Add e. develop Rename a to d and delete b.
  • 91. 中で起きている事 branch を使用する repository workspace cde cached (index) cde Merge branch ’develop’ master←HEAD Add c. Add e. develop Rename a to d and delete b. $ git branch develop * master
  • 92. 中で起きている事 branch を使用する repository Merge branch ’develop’ workspace cde master←HEAD cached (index) cde Add c. Add e. Add e. develop Rename a to d and delete b. $ git branch -d develop develop branch を削除 (commit は消えない)
  • 93. 中で起きている事 branch を使用する repository Merge branch ’develop’ workspace cde master←HEAD cached (index) cde Add c. Add e. Rename a to d and delete b. $ git branch -d develop develop branch を削除 (commit は消えない)
  • 94. 中で起きている事 branch を使用する repository workspace cde cached (index) cde Merge branch ’develop’ master←HEAD Add c. Add e. Rename a to d and delete b. $ git branch * master
  • 95. branch (削除) branch を使用する git branch -d branch1 [branch2 [branch3 ] ...] で複数 branch の削除が可能 branch を削除しても、commit は消えない branch を削除すると、その commit が 見つけにくくなる場合がある 8 そのような場合、誤操作防止の為に git branch -d はエラーとなる git branch -D を使用すると、上記の場合でも branch の強制削除可能 8 後述
  • 96. ここまでのまとめ branch を使用する git branch は branch の一覧、作成、削除 git checkout は HEAD の切り替え 会わせて、workspace, cached も変更 git merge は他の branch の変更を取り入れる branch の作成、削除で commit が 作成、削除される事は無い
  • 97. log 過去の履歴を活用する 過去の履歴を閲覧
  • 98. log 過去の履歴を活用する 過去の履歴を閲覧 $ git log --graph * commit 86ba5efc1bce4f65f517eb80a3cc5c21113bc637 | Merge: ac24086 365850a | | Author: Your Name <your@address> | | Date: Wed Jan 1 02:42:46 2014 +0900 || || Merge branch ’develop’ || | * commit 365850a9b09bb6fbcfc3f762b630380053b46575 | | Author: Your Name <your@address> | | Date: Wed Jan 1 02:42:32 2014 +0900 || || Add e. || ...
  • 99. log 過去の履歴を活用する 過去の履歴を閲覧 git log は less を使用しているので、長い場合は j,k で上下移 動、q で終了
  • 100. log 過去の履歴を活用する 過去の履歴を閲覧 — commit 86ba5efc1bce4f65f517eb80a3cc5c21113bc637 Merge: ac24086 365850a Author: Your Name <your@address> Date: Wed Jan 1 02:42:46 2014 +0900 Merge branch ’develop’ — これが一つの commit
  • 101. log 過去の履歴を活用する 過去の履歴を閲覧 — commit 86ba5efc1bce4f65f517eb80a3cc5c21113bc637 Merge: ac24086 365850a Author: Your Name <your@address> Date: Wed Jan 1 02:42:46 2014 +0900 Merge branch ’develop’ — “commit” の横に書いてあるのが、その commit のハッシュ値 (リンクでは無い、commit の本当の名前として使用)
  • 102. log 過去の履歴を活用する 過去の履歴を閲覧 — commit 86ba5efc1bce4f65f517eb80a3cc5c21113bc637 Merge: ac24086 365850a Author: Your Name <your@address> Date: Wed Jan 1 02:42:46 2014 +0900 Merge branch ’develop’ — 最後が commit message
  • 103. git log コマンド補足 過去の履歴を活用する git log --graph [commit] で commit の先祖を表示 commit は branch, HEAD, ハッシュ値等で指定 commit のデフォルトは HEAD ハッシュ値はその commit の本名の要な物 git branch や git checkout で使用可能 (自信が無い場合は、git checkout で commit のハッシュ 値を指定する事はやめた方が無難) git log で簡単に調べられるのは各 branch やその先祖 例えば、現在の最新状態の branch を削除すると最新 commit を見つける事が困難になる (git branch -d でエラーが出るのはそのような場合)
  • 104. reset 過去の履歴を活用する branch と HEAD を一度に切り替える (良く、過去のバージョンに戻すのに使用) 戻したいバージョン (例えば、“Add e.” という commit ) の commit のハッシュ値を確認 $ git log --graph ... (commit のハッシュ値 commit する度に異なるので注意) 今回は 365850a9b09bb6fbcfc3f762b630380053b46575 とする
  • 105. reset 過去の履歴を活用する branch と HEAD を一度に切り替える (良く、過去のバージョンに戻すのに使用) 準備 $ git branch for soft $ git branch for mixed $ git branch for hard
  • 106. reset 過去の履歴を活用する branch と HEAD を一度に切り替える (良く、過去のバージョンに戻すのに使用) HEAD だけ古いバージョンに戻す $ git checkout for soft $ git reset --soft 36589 9 重複が無ければ、hash 値は先頭 4 文字以上で大丈夫
  • 107. reset 過去の履歴を活用する branch と HEAD を一度に切り替える (良く、過去のバージョンに戻すのに使用) HEAD と cached を古いバージョンに戻す $ git checkout for mixed $ git reset --mixed 3658
  • 108. reset 過去の履歴を活用する branch と HEAD を一度に切り替える (良く、過去のバージョンに戻すのに使用) HEAD, cached, workspace の全てを古いバージョンに戻す $ git checkout for hard $ git reset --hard 3658
  • 109. reset 過去の履歴を活用する branch と HEAD を一度に切り替える (良く、過去のバージョンに戻すのに使用) テスト環境後始末 $ git checkout master $ git branch -d for soft for mixed for hard
  • 110. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master←HEAD cached (index) cde Add e. Add c. de
  • 111. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master←HEAD for soft for mixed for hard cached (index) cde Add e. Add c. $ git branch for soft $ git branch for mixed $ git branch for hard de
  • 112. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master←HEAD for soft for mixed for hard cached (index) cde Add e. Add c. $ git checkout for soft de
  • 113. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for soft←HEAD for mixed for hard cached (index) cde Add e. Add c. $ git checkout for soft de
  • 114. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for soft←HEAD for mixed for hard cached (index) cde Add e. Add c. de $ git reset --soft 3658 HEAD だけ変更する (HEAD が branch を指している時は branch を変更する)
  • 115. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for mixed for hard cached (index) cde Add e. de Add c. for soft←HEAD $ git reset --soft 3658 HEAD だけ変更する (HEAD が branch を指している時は branch を変更する)
  • 116. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for mixed for hard cached (index) cde Add e. de Add c. $ git checkout for mixed for soft←HEAD
  • 117. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for mixed←HEAD for hard cached (index) cde Add e. de Add c. $ git checkout for mixed for soft
  • 118. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for mixed←HEAD for hard cached (index) cde Add e. de Add c. $ git reset --mixed 3658 cached と HEAD を変更する for soft
  • 119. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for hard cached (index) de Add e. de Add c. $ git reset --mixed 3658 cached と HEAD を変更する for soft for mixed←HEAD
  • 120. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for hard cached (index) de Add e. de Add c. $ git checkout for hard for soft for mixed←HEAD
  • 121. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for hard←HEAD cached (index) cde Add e. de Add c. $ git checkout for hard for soft for mixed
  • 122. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master for hard←HEAD cached (index) cde Add e. de Add c. for soft for mixed $ git reset --hard 3658 workspace, cached, HEAD を変更する
  • 123. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace de cde master cached (index) de Add e. de Add c. for soft for mixed for hard←HEAD $ git reset --hard 3658 workspace, cached, HEAD を変更する
  • 124. 中で起きている事 過去の履歴を活用する repository Merge branch ’develop’ workspace cde cde master←HEAD cached (index) cde Add e. Add c. $ git checkout master $ git branch -d for soft for mixed for hard de
  • 125. git reset コマンド補足 過去の履歴を活用する git reset [--soft | --mixed | --hard] [comit] で HEAD, branch の切り替えと (オプションによって) workspace や cached の変更を実施 オプションのデフォルトは --mixed、 commit は branch, HEAD, ハッシュ値等で指定 commit のデフォルトは HEAD git reset とだけ実行すると、HEAD は変わらず cached が HEAD と同じ状態になる 間違えて git add してしまった場合などに使用 HEAD を切り替えるので、git reset は git checkout と少 し似ている 違いは、branch も一緒に切り替えるかどうか
  • 126. ここまでのまとめ git log は過去の履歴や commit のハッシュ値を表示 commit のハッシュ値はその commit の名前のように使用 git reset は HEAD の移動や workspace, cached のクリア 等を実施 (オプションによって挙動は異なる)
  • 127. status レポジトリの状態を確認する 現在の cached の状態を確認 workspace, cached の変更 $ touch f g $ git add f $ echo ’test’ >f
  • 128. status レポジトリの状態を確認する 現在の cached の状態を確認 $ git status Changes to be committed: (use ”git reset HEAD <file>...” to unstage) new file: f Changes not staged for commit: (use ”git add <file>...” to update what will be committed) (use ”git checkout -- <file>...” to discard changes in working directory) modified: f Untracked files: (use ”git add <file>...” to include in what will be committed) g
  • 129. status レポジトリの状態を確認する 現在の cached の状態を確認 上から、HEAD, cached 間の差分 Changes to be committed: (use ”git reset HEAD <file>...” to unstage) new file: f
  • 130. status レポジトリの状態を確認する 現在の cached の状態を確認 workspace と cached の差分 Changes not staged for commit: (use ”git add <file>...” to update what will be committed) (use ”git checkout -- <file>...” to discard changes in working directory) modified: f
  • 131. status レポジトリの状態を確認する 現在の cached の状態を確認 cached にも HEAD にも無いファイル Untracked files: (use ”git add <file>...” to include in what will be committed) g
  • 132. status レポジトリの状態を確認する 現在の cached の状態を確認 $ git add f $ git status Changes to be committed: (use ”git reset HEAD <file>...” to unstage) new file: f Untracked files: (use ”git add <file>...” to include in what will be committed) g workspace と cached の差分が無くなる
  • 133. diff レポジトリの状態を確認する workspace, cached, commit 間の差分をパッチレベルで表示 $ git diff workspace と cached の差分を表示 (差分は無いので何も表示されない)
  • 134. diff レポジトリの状態を確認する workspace, cached, commit 間の差分をパッチレベルで表示 $ git diff --cached cached と HEAD の差分を表示 diff --git a/f b/f new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/f @@ -0,0 +1 @@ +test
  • 135. diff レポジトリの状態を確認する workspace, cached, commit 間の差分をパッチレベルで表示 $ git diff 3658 workspace と commit の差分を表示 diff --git a/c b/c new file mode 100644 index 0000000..e69de29 diff --git a/f b/f new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/f @@ -0,0 +1 @@
  • 136. diff レポジトリの状態を確認する workspace, cached, commit 間の差分をパッチレベルで表示 $ git diff 3658 HEAD 3658 と HEAD の差分を表示 diff --git a/c b/c new file mode 100644 index 0000000..e69de29
  • 137. git diff コマンド補足 レポジトリの状態を確認する git diff [--]9 [path1 [path2 [...]]]10 で path の workspace と cached の差分を表示 git diff commit [--] [path1 [path2 [...]]] で path の workspace と commit の差分を表示 commit は HEAD や branch, ハッシュ値等で指定 git diff --cached commit [--] [path1 [path2 [...]]] で path の commit と cached の差分を表示 git diff commit1 commit2 [--] [path1 [path2 [...]]] で path の commit 間の差分を表示 9 10 曖昧さ回避の為のオプション、通常は必要ない path が省略されると、git 管理下の全ファイル
  • 138. ここまでのまとめ レポジトリの状態を確認する git status は workspace, cached, HEAD の状態を確認 git diff は workspace, cached, commit 間の差分を表示 git status はファイルの更新有無のみ、 git diff はパッチレベルの差分 (ファイルの中身) を表示 commit 前に git status で確認するのは良い習慣
  • 139. リモートレポジトリを使う introduction 本章のスコープ local 前章で作成した repository remote local repository から作成した remote repository clone remote repository を clone して作った repository
  • 140. init (リモート) 使ってみる remote repository を用意する remote repository の作成 $ mkdir ˜/remote rep $ cd ˜/remote rep $ git init --bare
  • 141. init (リモート) 使ってみる remote repository を用意する remote repository のエイリアス作成 $ cd ˜/local rep $ git remote add origin ˜/remote rep
  • 142. git init コマンド補足 (リモート) 使ってみる 多くの git server では URI を ssh や https で指定するが それはネットワーク的な問題 repository 自体はこの用法で作成している事も多い この方法で作成した remote repository は workspace が無いので 普通の local repository としては使用不可 その他、git の各種デフォルト設定が異なっている
  • 143. push 使ってみる local branch のコピーを git server に作成 master branch を転送 $ git push origin master
  • 144. push 使ってみる local branch のコピーを git server に作成 develop branch 作成 $ git branch develop
  • 145. push 使ってみる local branch のコピーを git server に作成 master branch の更新 (git add f は git status の説明時に実施済み) $ git commit -m ’Add f.’
  • 146. push 使ってみる local branch のコピーを git server に作成 master branch の再転送 $ git push origin master
  • 147. push 使ってみる local branch のコピーを git server に作成 develop branch の転送 $ git push origin develop
  • 148. 中で起きている事 使ってみる remote local Merge branch ’develop’ master←HEAD Add c. Add e.
  • 149. 中で起きている事 使ってみる remote local Merge branch ’develop’ master←HEAD Add c. Add e. $ git push origin master origin に master branch が有るか確認 (無い)
  • 150. 中で起きている事 使ってみる remote local Merge branch ’develop’ master←HEAD Add c. Add e. $ git push origin master origin に master branch の指す commit をコピー
  • 151. 中で起きている事 使ってみる remote local Merge branch ’develop’ Merge branch ’develop’ master←HEAD master Add c. Add e. Add c. $ git push origin master origin に master branch の指す commit をコピー Add e.
  • 152. 中で起きている事 使ってみる remote local Merge branch ’develop’ Merge branch ’develop’ master←HEAD master Add c. Add e. $ git branch develop Add c. Add e.
  • 153. 中で起きている事 使ってみる remote local Merge branch ’develop’ Merge branch ’develop’ master←HEAD develop master Add c. Add e. $ git branch develop Add c. Add e.
  • 154. 中で起きている事 使ってみる remote local Merge branch ’develop’ Merge branch ’develop’ master←HEAD develop master Add c. Add e. $ git commit -m ’Add f.’ Add c. Add e.
  • 155. 中で起きている事 使ってみる remote local Add f. master←HEAD Merge branch ’develop’ Merge branch ’develop’ develop master Add c. Add e. $ git commit -m ’Add f.’ Add c. Add e.
  • 156. 中で起きている事 使ってみる remote local Add f. master←HEAD Merge branch ’develop’ Merge branch ’develop’ develop master Add c. Add e. Add c. $ git push origin master origin に master branch が有るか確認 (有る) Add e.
  • 157. 中で起きている事 使ってみる remote local Add f. master←HEAD Merge branch ’develop’ Merge branch ’develop’ develop master Add c. Add e. Add c. Add e. $ git push origin master origin の master branch と同じ commit が local の master branch の 先祖か確認 (先祖である)
  • 158. 中で起きている事 使ってみる remote local Add f. master←HEAD Merge branch ’develop’ Merge branch ’develop’ develop master Add c. Add e. Add c. Add e. $ git push origin master origin に master branch をコピー (新しい commit, ファイルの転送と master branch の移動)
  • 159. 中で起きている事 使ってみる remote local Add f. master←HEAD Add f. master Merge branch ’develop’ Merge branch ’develop’ develop Add c. Add e. Add c. Add e. $ git push origin master origin に master branch をコピー (新しい commit, ファイルの転送と master branch の移動)
  • 160. 中で起きている事 使ってみる remote local Add f. master←HEAD Add f. master Merge branch ’develop’ Merge branch ’develop’ develop Add c. Add e. Add c. $ git push origin develop origin に develop branch が有るか確認 (無い) Add e.
  • 161. 中で起きている事 使ってみる remote local Add f. master←HEAD Add f. master Merge branch ’develop’ Merge branch ’develop’ develop Add c. Add e. $ git push origin develop origin に develop branch をコピー (branch の作成のみ) Add c. Add e.
  • 162. 中で起きている事 使ってみる remote local Add f. master←HEAD Add f. master Merge branch ’develop’ Merge branch ’develop’ develop develop Add c. Add e. $ git push origin develop origin に develop branch をコピー (branch の作成のみ) Add c. Add e.
  • 163. git push コマンド補足 使ってみる git push URI source-branch[:destination-branch] で source-branch を URI の destination-branch にコピー destination-branch のデフォルトは source-branch git push URI :destination-branch で URI の destination-branch を削除 (空の branch をコピーすると思えば良い) remote repository の branch を削除しても local repository の branch は残る commit のコピーとは、commit 自身, その先祖の全 commit, 各 commit で必要な全ファイル、ディレクトリ のコピー
  • 164. ここまでのまとめ 過去の履歴を活用する git init --bare で remote repository を作成 git remote は remote repository URI のエイリアスの一覧 表示、作成 git push は remote repository へ local repository のコピー を作成
  • 165. clone 複数人で開発する repository のコピーを作成 clone repository の作成 $ git clone ˜/remote rep ˜/clone rep $ cd ˜/clone rep
  • 166. clone 複数人で開発する repository のコピーを作成 現在の repository 一覧を表示 $ git branch -a * master remotes/origin/HEAD ->origin/master remotes/origin/master remotes/origin/develop
  • 167. clone 複数人で開発する repository のコピーを作成 develop branch の作成 $ git branch develop remotes/origin/develop
  • 168. 中で起きている事 複数人で開発する clone remote Add f. master←HEAD Merge branch ’develop’ develop $ git clone ˜/remote rep ˜/clone rep $ cd ˜/clone rep
  • 169. 中で起きている事 複数人で開発する clone remote Add f. master←HEAD Merge branch ’develop’ develop $ git clone ˜/remote rep ˜/clone rep $ cd ˜/clone rep remote rep の全 branch, HEAD を remote branch としてコピー
  • 170. 中で起きている事 複数人で開発する clone remote Add f. master←HEAD Add f. remotes/origin/master remotes/origin/HEAD Merge branch ’develop’ Merge branch ’develop’ develop remotes/origin/develop $ git clone ˜/remote rep ˜/clone rep $ cd ˜/clone rep remote rep の全 branch, HEAD を remote branch としてコピー
  • 171. 中で起きている事 複数人で開発する clone remote Add f. master←HEAD Add f. remotes/origin/master remotes/origin/HEAD Merge branch ’develop’ Merge branch ’develop’ develop remotes/origin/develop $ git clone ˜/remote rep ˜/clone rep $ cd ˜/clone rep remotes/origin/HEAD を元に master branch を作成
  • 172. 中で起きている事 複数人で開発する clone remote Add f. master←HEAD Add f. master←HEAD remotes/origin/master remotes/origin/HEAD Merge branch ’develop’ Merge branch ’develop’ develop remotes/origin/develop $ git clone ˜/remote rep ˜/clone rep $ cd ˜/clone rep remotes/origin/HEAD を元に master branch を作成
  • 173. 中で起きている事 複数人で開発する clone remote Add f. master←HEAD Add f. master←HEAD remotes/origin/master remotes/origin/HEAD Merge branch ’develop’ Merge branch ’develop’ develop remotes/origin/develop $ git branch -a * master remotes/origin/HEAD ->origin/master remotes/origin/develop remotes/origin/master
  • 174. 中で起きている事 複数人で開発する clone remote Add f. master←HEAD Add f. master←HEAD remotes/origin/master remotes/origin/HEAD Merge branch ’develop’ Merge branch ’develop’ develop remotes/origin/develop $ git branch develop remotes/origin/develop remotes/origin/develop を元に develop branch を作成
  • 175. 中で起きている事 複数人で開発する clone remote Add f. master←HEAD Add f. master←HEAD remotes/origin/master remotes/origin/HEAD Merge branch ’develop’ Merge branch ’develop’ develop develop remotes/origin/develop $ git branch develop remotes/origin/develop remotes/origin/develop を元に develop branch を作成
  • 176. git clone コマンド補足 複数人で開発する git clone URI [directory ] で remote repository の clone を directory に作成 directory のデフォルトは URI の reopsitory 名 git の top directory はいつでも変更してよい git clone 時に指定した URI は、origin というエイリアス で登録される git branch -a で全ての remote branch が閲覧可能 master 以外の必要な branch は git branch branch-name start-point で作成 (remote branch は閲覧専用として使用するべき)
  • 177. fetch 複数人で開発する remote repository の更新を反映 local rep で更新 $ $ $ $ cd ˜/local rep git add g git commit -m ’Add g.’ git push origin master
  • 178. fetch 複数人で開発する remote repository の更新を反映 clone rep に反映 $ cd ˜/clone rep $ git fetch --all -p $ git merge remotes/origin/master
  • 179. 中で起きている事 複数人で開発する remote local clone Add f. master←HEAD Add f. Add f. remotes/origin/master
  • 180. 中で起きている事 複数人で開発する remote local clone Add g. Add f. master←HEAD Add f. Add f. $ cd ˜/local rep $ git add g $ git commit -m ’Add g.’ remotes/origin/master
  • 181. 中で起きている事 複数人で開発する remote local Add g. clone Add g. Add f. master←HEAD Add f. Add f. $ git push origin master remotes/origin/master
  • 182. 中で起きている事 複数人で開発する remote local Add g. clone Add g. Add f. master←HEAD Add f. $ cd ˜/clone rep Add f. remotes/origin/master
  • 183. 中で起きている事 複数人で開発する remote local Add g. clone Add g. Add f. master←HEAD Add f. Add f. remotes/origin/master $ git fetch --all -p remotes 以下の branch を最新版にバージョンアップ
  • 184. 中で起きている事 複数人で開発する remote local Add g. Add g. clone Add g. remotes/origin/master Add f. Add f. Add f. master←HEAD $ git fetch --all -p remotes 以下の branch を最新版にバージョンアップ
  • 185. 中で起きている事 複数人で開発する remote local Add g. clone Add g. Add g. remotes/origin/master Add f. Add f. Add f. master←HEAD $ git merge remotes/origin/master master に remotes/origin/master の更新を適用
  • 186. 中で起きている事 複数人で開発する remote local Add g. clone Add g. Add g. master←HEAD remotes/origin/master Add f. Add f. $ git merge remotes/origin/master master に remotes/origin/master の更新を適用 Add f.
  • 187. ここまでのまとめ 複数人で開発する git clone は remote repository の clone を作成 clone には remote repository の全 branch が remote branch として登録済み remote repository にある branch を local に作成するには git branch を使う git fetch は remote branch を最新状態に更新 remote repository の更新を適用するには fetch の後に、remote branch を merge すれば良い remote repository は読み込み専用で使うべき
  • 188. 同時更新 更新が競合したら local rep と clone rep で同時更新 local rep で更新 $ $ $ $ $ cd ˜/local rep touch h git add h git commit -m ’Add h.’ git push origin master
  • 189. 同時更新 更新が競合したら local rep と clone rep で同時更新 clone rep で更新 $ $ $ $ $ cd ˜/clone rep touch i git add i git commit -m ’Add i.’ git push origin master (失敗)
  • 190. 同時更新 更新が競合したら local rep と clone rep で同時更新 clone rep で local rep の更新を取り込み、再 push $ git fetch --all -p $ git merge remotes/origin/master $ git push origin master
  • 191. 同時更新 更新が競合したら local rep と clone rep で同時更新 local rep に clone rep の更新を取り込む $ cd ˜/local rep $ git fetch --all -p $ git merge remotes/origin/master
  • 192. 中で起きている事 更新が競合したら remote local Add f. master Add f. master clone Add f. master
  • 193. 中で起きている事 更新が競合したら remote local Add f. master $ $ $ $ cd ˜/local rep touch h git add h git commit -m ’Add h.’ Add f. master clone Add f. master
  • 194. 中で起きている事 更新が競合したら remote local clone Add h. master Add f. $ $ $ $ cd ˜/local rep touch h git add h git commit -m ’Add h.’ Add f. master Add f. master
  • 195. 中で起きている事 更新が競合したら remote local clone Add h. master Add f. $ git push origin master Add f. master Add f. master
  • 196. 中で起きている事 更新が競合したら remote local Add h. master clone Add h. master Add f. $ git push origin master Add f. Add f. master
  • 197. 中で起きている事 更新が競合したら remote local Add h. master Add h. master Add f. $ $ $ $ clone cd ˜/clone rep touch i git add i git commit -m ’Add i.’ Add f. Add f. master
  • 198. 中で起きている事 更新が競合したら remote local Add h. master Add h. master Add f. $ $ $ $ cd ˜/clone rep touch i git add i git commit -m ’Add i.’ Add f. clone Add i. master Add f.
  • 199. 中で起きている事 更新が競合したら remote local Add h. master Add h. master Add f. Add f. $ git push origin master origin に master branch が有るか確認 (有る) clone Add i. master Add f.
  • 200. 中で起きている事 更新が競合したら remote local Add h. master clone Add h. master Add f. Add f. Add i. master Add f. $ git push origin master origin の master branch と同じ commit が local の master branch の先祖か確認 (先祖ではない)
  • 201. 中で起きている事 更新が競合したら remote local Add h. master Add h. master Add f. Add f. clone Add i. master Add f. $ git push origin master 無理に push すると “Add h.” という commit が branch から 外れてしまう
  • 202. 中で起きている事 更新が競合したら remote local Add h. master Add h. Add f. clone Add i. master Add f. Add i. master Add f. $ git push origin master 無理に push すると “Add h.” という commit が branch から 外れてしまう
  • 203. 中で起きている事 更新が競合したら remote local Add h. master Add h. master Add f. Add f. $ git push origin master データ損失防止のため、git が失敗させる clone Add i. master Add f.
  • 204. 中で起きている事 更新が競合したら remote local Add h. master Add f. $ git fetch --all -p Add h. master Add f. clone Add i. master Add f.
  • 205. 中で起きている事 更新が競合したら remote local Add h. master Add f. $ git fetch --all -p Add h. master Add f. clone Add h. Add i. master Add f.
  • 206. 中で起きている事 更新が競合したら remote local Add h. master Add f. Add h. master Add f. $ git merge remotes/origin/master clone Add h. Add i. master Add f.
  • 207. 中で起きている事 更新が競合したら remote local clone Merge remote-... Add h. master Add f. Add h. master Add f. $ git merge remotes/origin/master master Add h. Add i. Add f.
  • 208. 中で起きている事 更新が競合したら remote local clone Merge remote-... Add h. master Add h. master Add f. Add f. $ git push origin master origin に master branch が有るか確認 (有る) master Add h. Add i. Add f.
  • 209. 中で起きている事 更新が競合したら remote local clone Merge remote-... Add h. master Add h. master Add f. Add f. master Add h. Add i. Add f. $ git push origin master origin の master branch と同じ commit が local の master branch の先祖か確認 (“Add h.” が相当)
  • 210. 中で起きている事 更新が競合したら remote local clone Merge remote-... Add h. master Add h. master Add f. Add f. $ git push origin master origin に master branch をコピー master Add h. Add i. Add f.
  • 211. 中で起きている事 更新が競合したら remote local clone Merge remote-... Add h. master Merge remote-... master master Add h. Add f. Add i. Add f. $ git push origin master origin に master branch をコピー Add h. Add i. Add f.
  • 212. 中で起きている事 更新が競合したら remote local clone Merge remote-... Add h. master Add f. Merge remote-... master master Add h. Add i. Add f. $ cd ˜/local rep $ git fetch --all -p $ git merge remotes/origin/master Add h. Add i. Add f.
  • 213. 中で起きている事 更新が競合したら remote local clone Merge remote-... Merge remote-... Merge remote-... master master master Add h. Add i. Add f. Add h. Add i. Add f. $ cd ˜/local rep $ git fetch --all -p $ git merge remotes/origin/master Add h. Add i. Add f.
  • 214. 衝突 (一旦停止) 更新が競合したら merge を一旦停止して、解決してから 再 merge 準備 $ cd ˜/local rep $ git branch conflict1 $ git branch conflict2
  • 215. 衝突 (一旦停止) 更新が競合したら merge を一旦停止して、解決してから 再 merge conflict1 で更新 $ $ $ $ git checkout conflict1 echo “conflict1” >> f git add f git commit -m ’Update 1.’
  • 216. 衝突 (一旦停止) 更新が競合したら merge を一旦停止して、解決してから 再 merge conflict2 で更新 $ $ $ $ git checkout conflict2 echo “conflict2” >> f git add f git commit -m ’Update 2.’
  • 217. 衝突 (一旦停止) 更新が競合したら merge を一旦停止して、解決してから 再 merge conflict2 で conflict1 と merge (衝突) $ git merge conflict1
  • 218. 衝突 (一旦停止) 更新が競合したら merge を一旦停止して、解決してから 再 merge merge を一旦停止 $ git merge --abort
  • 219. 衝突 (一旦停止) 更新が競合したら merge を一旦停止して、解決してから 再 merge 衝突しない様に編集、commit してから再度 merge $ $ $ $ vi f git add f git commit -m ’Escape conflict.’ git merge conflict1
  • 220. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Merge remote-tracking branch ...
  • 221. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Merge remote-tracking branch ... $ cd ˜/local rep $ git branch conflict1 $ git branch conflict2
  • 222. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Merge remote-tracking branch ... $ $ $ $ git checkout conflict1 echo “conflict1” >> f git add f git commit -m ’Update1’
  • 223. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Update 1. conflict1 Merge remote-tracking branch ... $ $ $ $ git checkout conflict1 echo “conflict1” >> f git add f git commit -m ’Update1’
  • 224. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Update 1. conflict1 Merge remote-tracking branch ... $ $ $ $ git checkout conflict2 echo “conflict2” >> f git add f git commit -m ’Update2’
  • 225. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Update 1. Update 2. conflict1 conflict2 Merge remote-tracking branch ... $ $ $ $ git checkout conflict2 echo “conflict2” >> f git add f git commit -m ’Update2’
  • 226. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Update 1. Update 2. conflict1 conflict2 Merge remote-tracking branch ... $ git merge conflict1 workspace に無理矢理両方の更新を適用した状態
  • 227. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Update 1. Update 2. conflict1 conflict2 Merge remote-tracking branch ... $ git merge conflict1 workspace に無理矢理両方の更新を適用した状態
  • 228. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Update 1. Update 2. conflict1 conflict2 Merge remote-tracking branch ... $ git merge --abort 前回の git merge を行う前の状態に戻す
  • 229. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Update 1. Update 2. conflict1 conflict2 Merge remote-tracking branch ... $ git merge --abort 前回の git merge を行う前の状態に戻す
  • 230. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Update 1. Update 2. conflict1 conflict2 Merge remote-tracking branch ... $ vi f $ git add f $ git commit -m ’Escape conflict.’ conflict を起こさないように f を修正
  • 231. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Escape conflict. Update 1. conflict2 conflict1 Update 2. Merge remote-tracking branch ... $ vi f $ git add f $ git commit -m ’Escape conflict.’ conflict を起こさないように f を修正
  • 232. 中で起きている事 更新が競合したら repository workspace cdefghi cached (index) cdefghi Escape conflict. Update 1. conflict2 conflict1 Update 2. Merge remote-tracking branch ... $ git merge conflict1 merge 成功
  • 233. 中で起きている事 更新が競合したら repository Merge bra... workspace cdefghi cached (index) cdefghi conflict2 Update 1. Escape conflict. conflict1 Update 2. Merge remote-tracking branch ... $ git merge conflict1 merge 成功
  • 234. 衝突 (解決) 更新が競合したら 衝突をその場で解決 準備 $ cd ˜/local rep $ git branch conflict3
  • 235. 衝突 (解決) 更新が競合したら 衝突をその場で解決 conflict3 で更新 $ $ $ $ git checkout conflict3 echo “conflict3” >> f git add f git commit -m ’Update 3.’
  • 236. 衝突 (解決) 更新が競合したら 衝突をその場で解決 conflict3 で conflict1 と merge (衝突) $ git merge conflict1
  • 237. 衝突 (解決) 更新が競合したら 衝突をその場で解決 衝突しない様に編集、commit してから再度 merge $ vi f $ git add f $ git commit
  • 238. 中で起きている事 更新が競合したら repository workspace cdefghi Update 1. cached (index) cdefghi conflict1 Merge remote-tracking branch ...
  • 239. 中で起きている事 更新が競合したら repository workspace cdefghi Update 1. cached (index) cdefghi $ cd ˜/local rep $ git branch conflict3 conflict1 Merge remote-tracking branch ...
  • 240. 中で起きている事 更新が競合したら repository workspace cdefghi Update 1. cached (index) cdefghi $ $ $ $ git checkout conflict3 echo “conflict3” >> f git add f git commit -m ’Update3’ conflict1 Merge remote-tracking branch ...
  • 241. 中で起きている事 更新が競合したら repository workspace cdefghi Update 1. cached (index) cdefghi $ $ $ $ git checkout conflict3 echo “conflict3” >> f git add f git commit -m ’Update3’ Update 3. conflict1 conflict3 Merge remote-tracking branch ...
  • 242. 中で起きている事 更新が競合したら repository workspace cdefghi Update 1. cached (index) cdefghi Update 3. conflict1 conflict3 Merge remote-tracking branch ... $ git merge conflict1 workspace に無理矢理両方の更新を適用した状態
  • 243. 中で起きている事 更新が競合したら repository workspace cdefghi Update 1. cached (index) cdefghi Update 3. conflict1 conflict3 Merge remote-tracking branch ... $ git merge conflict1 workspace に無理矢理両方の更新を適用した状態
  • 244. 中で起きている事 更新が競合したら repository workspace cdefghi Update 1. cached (index) cdefghi $ vi f $ git add f Update 3. conflict1 conflict3 Merge remote-tracking branch ...
  • 245. 中で起きている事 更新が競合したら repository workspace cdefghi Update 1. cached (index) cdefghi $ vi f $ git add f Update 3. conflict1 conflict3 Merge remote-tracking branch ...
  • 246. 中で起きている事 更新が競合したら repository workspace cdefghi Update 1. cached (index) cdefghi $ git commit Update 3. conflict1 conflict3 Merge remote-tracking branch ...
  • 247. 中で起きている事 更新が競合したら repository workspace cdefghi Merge bra... Update 1. cached (index) cdefghi $ git commit conflict3 conflict1 Update 3. Merge remote-tracking branch ...
  • 248. conflict 補足 更新が競合したら git merge --abort の過信は禁物 workspace や cached が clean で無い場合 11 、正しく戻ら ない可能性がある conflict 解決時、勝手に他人の更新を変更する事は危険 自分の更新を変更するか、競合する更新をした人に確認 するべき abort せずに直接 conflict を解消する際は、 競合部分の削除と順番入れ替えのみで対応するべき (先祖の commit に含まれない更新を merge commit に入 れるべきではない) (これ以外の手段で conflict を解消する方法は evil merge と言われている) 11 未 commit のファイルがある状態
  • 249. 更新者の確認 その他 問題のファイルの何行目を、誰がいつ加えたか(変更したか) 調べる $ git blame f 9e7563ff (Your Name 2014-01-03 15:18:02 +0900 1) test
  • 250. ここまでのまとめ 更新が競合したら local repository に remote repository の最新情報が含まれ ていないと git push は失敗する そのような場合は local repository を最新にしてから再 push すると良い merge 時に conflict が発生した際に取る方法は、merge 取りやめか conflict 解消の 2 通り merge を取りやめて、衝突しないように commit してか ら再度 merge する事も可能 git blame はファイルの更新者を行単位で表示
  • 251. revert その他 特定の commit を打ち消す commit を行う (commit とその親 commit の差分を打ち消す) 戻したいバージョン (例えば、“Add h.” という commit ) の commit のハッシュ値を確認 $ git log --graph ... (環境ごとに commit のハッシュ値は異なるので注意) 今回は 06d957bc3322557eb76fc86ee87b66c0288d3c08 とする
  • 252. revert その他 特定の commit を打ち消す commit を行う (commit とその親 commit の差分を打ち消す) $ git revert 06d912 12 “Add i.” の commit
  • 253. 中で起きている事 その他 repository workspace cdefghi Merge remote-... cached (index) cdefghi Add h. Add i. Add f.
  • 254. 中で起きている事 その他 repository workspace cdefghi Merge remote-... cached (index) cdefghi Add h. Add i. Add f. $ git revert 06d9 06d9 (“Add h.” の commit) の変更 (06d9 とその親 commit の差分) の逆を、workspace と cached に行う
  • 255. 中で起きている事 その他 repository workspace cdefg i Merge remote-... cached (index) cdefg i Add h. Add i. Add f. $ git revert 06d9 06d9 (“Add h.” の commit) の変更 (06d9 とその親 commit の差分) の逆を、workspace と cached に行う
  • 256. 中で起きている事 その他 repository workspace cdefg i Merge remote-... cached (index) cdefg i Add h. Add i. Add f. $ git revert 06d9 git commit を行う
  • 257. 中で起きている事 その他 repository workspace cdefg i Revert “Add h.”... Merge remote-... cached (index) cdefg i Add h. Add i. Add f. $ git revert 06d9 git commit を行う
  • 258. git revert コマンド補足 その他 git revert commit1 [commit2 [commit3 ...]] で特定の commit の変更を打ち消す commit を行う 親が複数存在する commit13 を指定するには、-m という オプションが必要 (今回の範囲を超えるので詳細は割愛) 13 git merge で作成された commit
  • 259. tag commit に移動しない名前をつける 現在の tag 一覧を表示 $ git tag tag は無いので何も表示されない
  • 260. tag commit に移動しない名前をつける tag を作成 $ git tag v0.0.1 HEAD の向いている commit に対して v0.0.1 という tag をつ ける
  • 261. tag commit に移動しない名前をつける $ git tag tag 一覧を表示 v0.0.1
  • 262. tag commit に移動しない名前をつける $ git tag -d v0.0.1 tag v0.0.1 を削除
  • 263. tag commit に移動しない名前をつける 現在の tag 一覧を表示 $ git tag tag は無いので何も表示されない
  • 264. tag コマンド補足 git tag tag-name [commit] で commit を指す tag を作成 commit は branch, HEAD, ハッシュ値等で指定 commit のデフォルトは HEAD tag を remote repository へ転送するには git push URI tag tag-name remote repository の tag を削除するには git push URI :refs/tags/tag-name remote repository の tag も git fetch --all -p で取得可能 merge や checkout の commit 指定に tag も使用可能 ただし、その場合 HEAD が branch から外れるので注意
  • 265. ここまでのまとめ その他 git revert は過去の commit を打ち消す commit 作成 remote repository に push する前なら、他の方法 14 で 代用出来ないか考えた方が良い (不要な commit と打ち消す commit が有るより、両方無 い方が良い場合が多い) git tag は tag 一覧表示、作成、削除 branch や HEAD は移動するが tag は移動しないので、 リリースヴァージョン管理等に使用可能 14 git reset 等
  • 266. 最後に もっと git を勉強するには man を読む 公式ガイドを読む 一般的な git の開発フローを学ぶ などの方法がおすすめ
  • 267. 最後に man の探し方 git の man は、“git” と最初の引数を “-” でつなげた物を読む 例) $ man git-add
  • 268. 最後に man の探し方 git の man は、“git” と最初の引数を “-” でつなげた物を読む 例) $ man git-add 最初の引数まで入力して --help と入力しても同じ 例) $ git add --help
  • 269. 最後に man の探し方 git の man は、“git” と最初の引数を “-” でつなげた物を読む 例) $ man git-add 最初の引数まで入力して --help と入力しても同じ 例) $ git add --help そもそも最初の引数が分からない場合や、 git でどんな事が出来るか知りたい場合は git の man を引く $ man git
  • 270. 最後に 公式ガイドの見方 $ git help -g で git のガイド一覧を表示
  • 271. 最後に $ git help -g The common Git guides are: attributes Defining attributes per path glossary A Git glossary ignore Specifies intentionally untracked files to ignore modules Defining submodule properties revisions Specifying revisions and ranges for Git tutorial A tutorial introduction to Git (for version 1.5.1 or newer) workflows An overview of recommended workflows with Git ’git help -a’ and ’git help -g’ lists available subcommands and some concept guides. See ’git help <command>’ or ’git help <concept>’ to read about a specific subcommand or concept.
  • 272. 最後に 興味があるガイドをみつけたら $ git help <concept> で閲覧 例) git help tutorial
  • 273. 最後に 一般的な開発フローについて学ぶ 本勉強会ではあまり触れませんでしたが best practice についても勉強すると面白いかも まずは、git flow と github flow を勉強すると良いと思います
  • 274. 最後に “git 次の一歩” も開催予定なので、 興味のある方は来てください