15. 実際に見てみよう
% git cat-file -p HEAD
tree 2e4038cce3649c830daaf38f6e411b4d55d5b7ac
parent 897d06bcb89a12574271e74e90048cb26fe5f6bb
author John Smith <[email protected]> 1398774567 +0900
committer John Smith <[email protected]> 1398774567 +0900
Add new file: greeting2.txt
16. 実際に見てみよう
% git cat-file -p HEAD
tree 2e4038cce3649c830daaf38f6e411b4d55d5b7ac
parent 897d06bcb89a12574271e74e90048cb26fe5f6bb
author John Smith <[email protected]> 1398774567 +0900
committer John Smith <[email protected]> 1398774567 +0900
Add new file: greeting2.txt
cat-file: Gitに登録されたオブジェクト(データ)をダンプするコマンド
-p: いい感じの出力にするオプション
HEAD: 最新のコミット
git cat-file -p HEAD
→「最新のコミットオブジェクトをいい感じに表示してくれ」
17. 実際に見てみよう
% git cat-file -p HEAD
tree 2e4038cce3649c830daaf38f6e411b4d55d5b7ac
parent 897d06bcb89a12574271e74e90048cb26fe5f6bb
author John Smith <[email protected]> 1398774567 +0900
committer John Smith <[email protected]> 1398774567 +0900
Add new file: greeting2.txt
tree: ディレクトリツリーのスナップショット
(2e4038…: treeオブジェクトの名前)
18. 実際に見てみよう
% git cat-file -p HEAD
tree 2e4038cce3649c830daaf38f6e411b4d55d5b7ac
parent 897d06bcb89a12574271e74e90048cb26fe5f6bb
author John Smith <[email protected]> 1398774567 +0900
committer John Smith <[email protected]> 1398774567 +0900
Add new file: greeting2.txt
parent: 親コミット
19. 実際に見てみよう
% git cat-file -p HEAD
tree 2e4038cce3649c830daaf38f6e411b4d55d5b7ac
parent 897d06bcb89a12574271e74e90048cb26fe5f6bb
author John Smith <[email protected]> 1398774567 +0900
committer John Smith <[email protected]> 1398774567 +0900
Add new file: greeting2.txt
author: コミット内容の作者+作成日時
committer: authorが作った内容を実際のコミットオブジェクトにした人+日時
大抵の場合 author=committer なので今のところ気にしなくて良い
20. 実際に見てみよう
% git cat-file -p HEAD
tree 2e4038cce3649c830daaf38f6e411b4d55d5b7ac
parent 897d06bcb89a12574271e74e90048cb26fe5f6bb
author John Smith <[email protected]> 1398774567 +0900
committer John Smith <[email protected]> 1398774567 +0900
Add new file: greeting2.txt
“Add new…”: コミットメッセージ
21. 実際に見てみよう
% git cat-file -p HEAD
tree 2e4038cce3649c830daaf38f6e411b4d55d5b7ac
parent 897d06bcb89a12574271e74e90048cb26fe5f6bb
author John Smith <[email protected]> 1398774567 +0900
committer John Smith <[email protected]> 1398774567 +0900
Add new file: greeting2.txt
コミット =
ツリーのスナップショットへのポインタ
+ 親コミットへのポインタ
+ 著作者情報+コミッター情報
+ コミットメッセージ
190. 2. ワーキングツリーの内容を捨てる
① checkout -- <path>
② checkout <commit-ish> -- <path>
②<commit-ish>を指定した場合、そのコミットの内
容でインデックスとワーキングツリーの<path>を上
書きします。
②は<commit-ish>と書いてるけど実は tree オブジェクト指定でも OK.(<tree-ish>)
191. checkout <commit-ish> -- <path>
さっきの続きです。ここで checkout HEAD --
hello.txt を実行すると・・・
working tree index
hello.txt
greeting.txthello.txt
greeting.txt
HEAD
hello.txt
greeting.txt
192. checkout <commit-ish> -- <path>
インデックスのhello.txtがHEADのhello.txtで上書
きされ・・・
working tree index
hello.txt
greeting.txthello.txt
greeting.txt
HEAD
hello.txt
greeting.txt
git checkout HEAD -- greeting.txt
193. checkout <commit-ish> -- <path>
ワーキングツリーのhello.txtも同じ内容で上書きさ
れます。
どちらの書式も編集内容が捨てられるので注意し
てください。
working tree index
hello.txt
greeting.txthello.txt
greeting.txt
HEAD
hello.txt
greeting.txt
git checkout HEAD -- greeting.txt
196. reset --hard
動作は checkout HEAD -- . (pathにカレントディレ
クトリを指定)と同じで・・・
working tree index
hello.txt
greeting.txthello.txt
greeting.txt
HEAD
hello.txt
greeting.txt
212. greeting.txt
reset HEAD -- <path>
ワーキングツリーの hello.txt がローカルな変更を
持っており、インデックスにそれが登録されている
とします。
working tree index
hello.txt
greeting.txthello.txt
HEAD
hello.txt
greeting.txt
213. greeting.txt
reset HEAD -- <path>
git reset HEAD -- hello.txt によって、HEADの
hello.txt の内容でインデックスを更新します。つま
り、ワーキングツリーをもとに追加されていたイン
デックスの変更が捨てられます。
working tree index
hello.txt
greeting.txthello.txt
HEAD
hello.txt
greeting.txt
git reset HEAD -- hello.txt
214. greeting.txt
reset HEAD -- <path>
ちなみに git init した直後だと git rm --cached
<path> を使う必要があります。いずれにしろ git
status にどうしたら良いか表示されているので、
迷ったら status の出力を見ましょう。
working tree index
hello.txt
greeting.txthello.txt
HEAD
hello.txt
greeting.txt
git reset HEAD -- hello.txt
270. 2. ブランチの指すコミットを変更する
① reset [ --hard ] <commit-ish>
① カレントブランチの参照が指すコミットを指定し
たコミットに変更し、そのコミットでインデックスを更
新します。--hardを指定した場合はワーキングツ
リーもそのコミットの内容で上書きします。
言い換えると、ブランチヘッドをコミットグラフの中
の別の場所へ移動する効果があります。
271. reset [ --hard ] <commit-ish>
reset はカレントブランチが指す先を変更します。
例えば今作ったコミットの内容が間違えていた時
に、そのコミットをなかったことにする用途で git
reset HEAD^ を使います。
foo
HEAD
git reset HEAD^
foo
HEAD
bar
bar
272. reset [ --hard ] <commit-ish>
--hard をつけるとワーキングツリーが指定したコ
ミットで上書きされます。ブランチヘッドを他のコミッ
トに付け替えたい場合によく使います。
foo
HEAD
git reset --hard bar
foo
HEAD
bar
bar
286. rebase <commit-ish>
参照 bar を新しいコミットに付け替えてカレントブラ
ンチをbarに切り替えます。
master
HEAD git rebase master
bar
master
HEAD
bar
287. rebase <commit-ish>
応用として rebase -i を使ってcherry-pickする際に
編集を加えたり、コミットを取捨選択したり、といっ
たことを対話的に指定できます。
図では2つだったコミットを1つにまとめてます
master
HEAD git rebase -i master
bar
master
HEAD
bar
291. 1. タグを作成/削除する
① tag <tag> [ <commit-ish> ]
② tag -a <tag> [ <commit-ish> ]
③ tag -d <tag>
① 指定したコミットを指すタグ(参照)を作成します
292. tag <tag> [ <commit-ish> ]
指定したコミットに参照のタグを作成します。コミッ
トを指定しない場合、HEADが対象になります。
master
HEAD
git tag backup bar
bar
master
HEAD
bar
backup
293. 1. タグを作成/削除する
① tag <tag> <commit-ish>
② tag -a <tag> <commit-ish>
③ tag -d <tag>
② 指定したコミットを指すアノテーションタグを作成
します。
294. tag -a <tag> [ <commit-ish> ]
-a を指定するとアノテーションタグを作成します。
実際には指定したコミットを指すタグオブジェクト
(△)を作成し、それを指す参照のタグを作成しま
す。
master
HEAD
git tag -a backup bar
bar
master
HEAD
backup
bar
295. 1. タグを作成/削除する
① tag <tag> <commit-ish>
② tag -a <tag> <commit-ish>
③ tag -d <tag>
③ 指定したタグ(参照)を削除します。
296. tag -a <tag> [ <commit-ish> ]
-d を指定するとタグを削除します。アノテーションタ
グが指定された場合、タグオブジェクトはすぐに削
除されるわけではありませんが、そのうちGCで削
除されます。
master
HEAD
git tag -d backup
bar
master
HEAD
bar
backup