introduction-to-git part4

introduction-to-git/04_more_commits.md at master · Shinpeim/introduction-to-git · GitHub

git rm == ファイルの削除という変更をステージすること

じつは、ファイルの削除という変更を stage するためには、git add ではなく、git rm を使わないとダメなのです。

作業ディレクトリにファイルが存在するときにはそのファイルを削除する

ファイル削除 + git rm をしなくても、git rm するだけで削除変更はステージできる!

git mv == git add & git rm

renameを1コマンドでできる!

git reset

git reset についてもまとめてみる - murankの日記

git reset とは?

HEAD の位置を変更するコマンド。 オプションによってインデックス、ワーキングツリーの内容も変更できる。

  • --soft
    • HEAD の位置のみを変更する。インデックス、ワーキングツリーには影響なし。
  • --mixed(もしくはオプションなし)
    • HEAD の位置とインデックスを変更する
  • --hard
    • HEADの位置、インデックス、ワーキングツリーをすべて変更する。

--soft

git reset HEAD^ --soft
  • インデックス、作業ツリーに対する変更は両者とも残る
  • HEADの位置がHEAD^に変わるだけ

--mixed(オプション無し)

git reset HEAD
  • インデクッスをHEADの状態にする。インデックスになにかあったらその変更は消える
  • git add の取り消しに使う
  • 作業ツリーへの変更は残る!

--hard

git reset --hard HEAD 
  • HEAD、インデックス、ワーキングツリーすべてを HEAD に変更する。

git checkout

Git チュートリアル: 変更を元に戻す | アトラシアン

git checkout <commit> <file>

fileが、指定した commit に含まれそのファイルの完全なコピーとなり、さらにそれをステージングエリアに追加します。

git checkout <commit>

作業ディレクトリ内のすべてのファイルを指定したコミットと同一の状態に更新するコマンド

Git - LumberMill's Notes

git checout -- file

ファイル名とブランチ名がたまたま重複してしまった場合に誤動作してしまう危険性があります。その曖昧さを無くすための指定が「--」ということらしいです。

git reset, git checkoutなどファイルへの変更を戻す系メモ

Git - 作業のやり直し

ステージしたファイルの取り消し

  • 指定したファイルのステージを解除する(=> 作業ディレクトリへ)
git reset HEAD file_name

ファイルへの変更の取り消し

  • たとえば上記でunstageした内容そのものが間違いであった場合に作業ディレクトリ上からもその変更を取り除きたい場合に使用する
  • まぁごちゃごちゃ書いたが、要は作業ディレクトリにある変更をなかったことにする
git checkout -- file_name

入門Git 第6章

Gitのログを調べる

  • git log -p
    • 差分も一緒にログと表示してくれる

リビジョンの範囲指定

  • git log —since=“5 hours”
    • ここ5時間のコミットだけをみる
  • git log —before=“5 horus"
    • 5時間以前のコミットのみを表示する
  • “2015-01-01”や、”1 minute”のような指定も可能
  • git log revision1..revision10
    • revision2からrevision10を表示する(revision1は表示されない)
  • git log revision1..HEAD

    • revision10が最新のリビジョン出会った場合↑と同義
    • HEADは省略可
  • ^(キャット)

    • マイナス1の意味。
    • 9a234643d34^ は9a234643d34の前にあるリビジョンを指す
    • 9a234643d34^^は2つ前のリビジョン
  • ~N
    • 9a234643d34~2は9a234643d34から2つ前のリビジョン

誰のしわざか

  • git blame file_name
    • ファイルの行ごとに誰がコミットしたのかがわかる
  • git blame -L 12,13 hello.html
  • hello.html 12,13行目の情報のみを表示
  • -L 12, +2のようにしても上記と同じ指定が可能(マイナスを使用することもできる)
  • git blame -L "/<\/body>/",+2 hello.html

自分の準備の整ったものだけを共有することは、完全な分散型開発の真価のひとつ

コミットを修正する

  • git commit -C HEAD —amend
    • -Cは新しいログメッセージを渡す代わりに指定したコミットのログメッセージを使うということ
    • この例ではコミットの指定はHEADにしているが、なんでもいい

コミットを取り消す

  • git revert -n HEAD
    • -n を使用することですぐにコミットしないでステージして状態で待ってくれる

変更をリセットする

  • git reset
    • リポジトリを好きな状態にリセットできる
    • パラメータを指定しないと、HEADが指定されたとみなされる
  • —soft
    • 以前のコミットをすべてステージングエイラに戻してコミットされていない状態に戻す
  • —hard
  • git reset --hard HEAD^
    • 上記までを踏まえた具体例
    • HEADの手前のコミットへリセットされる。リポジトリにもないし、どこにもコミットはなくなる

履歴を書き換える

履歴の書き換えが有益なケース

  • 履歴をより整合性のある順番にする
  • 複数のコミットをひとつに圧縮する
  • ひとつのコミットを複数に分割する

  • git rebase -i

    • このまわりは重いので再度インプットしたい感がある

入門Git 第5章

  • Gitの真髄は、あらゆるものがブランチのように扱われること

  • git branch -m master mymaster

    • -mは名前変更(move)の意味
  • ブランチはそのブランチでなされた最新のコミットだけを記録している

    • それぞれのコミットは直前のコミット(親コミット)へのリンクを持っているのでそれをたどることでブランチを作ってからどんな変更があったのかがわかる仕組み

いつブランチを作るべきかを見極める

新しいブランチをつくる

check out 「出発する、出て行く」

http://ejje.weblio.jp/content/check+out

  • git checkout -b <新ブランチ名> <分岐元ブランチ名>
    • -bを用いることでブランチ作成・チェックアウトを一発でできる

ブランチ間での変更のマージ

やり方は3つある

  • 直接マージ
    • あるブランチと別なブランチの履歴をマージして一緒にする
    • あるブランチの履歴全体を別のブランチへ取り込みたい場合に使う
  • 圧縮コミット
    • あるブランチの変更を「圧縮」(squash)してそれを別なブランチの先頭にコミットする
    • 新機能やバグフィックスなど機能をつくり、その変更を圧縮コミットとして一つのまとまった変更として取り込むときに使う
    • 履歴がひとつになってしまうので、軽率に行うことは避けるべき
    • git merge —squash branch_name
      • 指定ブランチの変更をまとめてステージした状態にする(mergeと言いながら、commitはされていない!)
  • チェリーピック
    • 別なブランチからコミットを一つとってきてそれを現在のブランチに適用する
    • ブランチ間でひとつのコミットだけマージしたいときに任意のコミットのみをマージできる
    • git cherry-pick -n commit-id
      • マージしないでステージした状態までで止まってくれる。これにより、cherry-pickした内容を修正してからコミットできる

ブランチ名変更

  • git branch -m old_name new_name
    • なお、同じ名前のブランチを-mしても作成できない
    • 強制的に上書き作成したいときは-Mを使用する