宇宙ドーナツ研究会

セキュリティ系お勉強メモ

gitメモ

rebase

ここ参照。
Git - リベース

# git rebase 統合先
git rebase master

gitリポジトリについて

なんとなく使ってたけど、本質を理解した方がいろいろと使いこなせるので、メモ。
ここがめっちゃ詳しい。
Gitのリポジトリの中身をなるべく正確に理解する | To Be Decided

.git ディレクトリの主な内訳

  • オブジェクト(.git/objects)
  • インデックス(.git/index)
  • 参照(.git/refs)
  • シンボリック参照(.git/symref)
オブジェクト

全てハッシュで表される。

  • コミットオブジェクト
    コミットに相当。ツリーや親コミットへの参照を持つ。
  • ツリー
    ディレクトリに相当。ブロブや他ツリーへの参照を持つ。
  • ブロブ
    ファイルの中身
  • タグ
    タグ名、コメント、コミットへの参照

これを図にしたのがこちら。 https://git-scm.com/book/en/v2/images/data-model-3.png

これらのオブジェクトの中身は、git cat-file -p <HASH> でみることができる

オブジェクトの情報取得

この状態で、

$ git graph
* <b5b312a> 2017-05-04 (origin/master, origin/HEAD, master) add .gitconfig
* <188bb47> 2017-01-19  .tmux.conf 追加
* <9b629de> 2017-01-04 (HEAD) cd やったら lsするようにした
* <cfda475> 2017-01-03   git 変更状況表示
* <aea002e> 2017-01-03  プロンプトにgitのブランチ名を表示させるようにした

コミットオブジェクトの中身を見る

$ git cat-file -p HEAD
tree cdf8b6df986bae8f975d3b41dc15e8ba926ea9ea
parent cfda475b60d7c5187ceb41bbe67a7d4dab777593
author user <momob@gmail.com> 1483473062 +0900
committer user <momob@gmail.com> 1483473062 +0900

ツリーの中身を見る

$ git cat-file -p cdf8b6
100644 blob c8a365a2ef173d20cadd00cb94f4cb76f72c2584    .bashrc
040000 tree ea1fde3711da7692b1f8355ac93c477ca5e6268b    .vim
100644 blob fd92c3a682f5179f021bea98adce4574182a526c    .vimrc
100644 blob efe6699d260941b8b0d2edc11323e0342e01942b    README.md
100755 blob 6721ff80fb1324ec1cf450f7b69cbf8266880035    git-completion.bash
100755 blob 97eacd7832b28377c5e14918ce6bededc55d7d40    git-prompt.bash

ブロブの中身を見る

$ git cat-file -p c8a365a

git cat-file じゃなくても、HEADに対応するブロブ一覧も見ることができる。

$ git ls-files --stage
100644 c8a365a2ef173d20cadd00cb94f4cb76f72c2584 0   .bashrc
100644 fa1978649935cbba4d24151ca81a9812ca37ec72 0   .vim/colors/molokai.vim
100644 fd92c3a682f5179f021bea98adce4574182a526c 0   .vimrc
100644 efe6699d260941b8b0d2edc11323e0342e01942b 0   README.md
100644 4f7cbe77a37e16a7dce3a6ce6f7a5956a98e3395 0   aaa
100755 6721ff80fb1324ec1cf450f7b69cbf8266880035 0   git-completion.bash
100755 97eacd7832b28377c5e14918ce6bededc55d7d40 0   git-prompt.bash
インデックス

各ファイルの場所と、それに対応するブロブへのポインタなどの情報が書かれた単一ファイル。
バイナリだけど、git ls-files --stage で内容が見れる。

git add って?

git add した時点で、対象ファイルのスナップショットが、次のコミットのために作成される。
同時に、インデックス内の対象ファイルの項目が、作成されたスナップショットを参照するようになる。

ファイルの変更をaddした後、別ブランチへコミットしようとするとエラーが出るのは、
インデックスにおいて、そのファイルの項目が、参照先を元に戻せなくなってしまうためかと。

git reset って?

要は、元に戻すコマンド。

  • git reset <ファイル名>
    指定ファイルがadd済みの場合、インデックスの参照先をHEADにおけるブロブへ変更する。
    つまり、add と真逆な事をする。

  • git reset <コミット>
    git resetとrevertを図解する | To Be Decided
    HEADを指定コミットに移す。その際、
    --soft:インデックスや作業ディレクトリはそのまま
    --mixed:インデックスを、指定コミットのものへ変更
    -- hard:インデックス、作業用ディレクトリともに、指定コミットのものへ変更する

この時、ORIG_HEADが、reset直前のHEADを参照しているコミットを参照するようになる