Reset | リセット
Resetは一種の戻り処理である。
コミットを取り消すときなどに利用できる。
Eclipseでは以下のように呼び出す。
プロジェクト名をクリック → Team → Rest
Resetは複雑であるが、大きく分けて以下の3つの概念がある。
- どの状態に戻すか
- どのリポジトリとブランチへ戻すのか
- いつのコミットへ戻すのか
どの状態に戻すか
戻す状態はSoft、Mixed、Hardの3種類がある。
- SoftはHEADのみ戻す。
- MixedはHEADとインデックスを戻す
- HARDはHEAD、インデックス、ワークツリーを戻す。
下図を参考に説明する。
コミットCからコミットBへSoftで戻す
HEADだけがコミットBになり、
インデックスと
ワークツリーはコミットCのままである。
この状態でCommitを実行するとコミットCと同じ状態になる。つまり、コミットCになる直前状態と言える。
コミットCからコミットBへMixedで戻す
HEADとインデックスがコミットBになり、ワークツリーはコミットCのままである。
この状態でCommitを実行すると、コミットするファイルの選択が求められる。インデックスにコミット予定のファイルがないからである。
コミットCからコミットBへHardで戻す
HEAD、インデックス、ワークツリーがすべてコミットBと同じ状態になる。
もはやファイル内容も含めてコミットBと同じである。
どのリポジトリとブランチへ戻すのか
コミットCからコミットBに戻す(Reset)という上記の説明の場合、コミットBのリポジトリまたはブランチはどれにするかという選択である。
大きく分けると2通りあり、ローカルリポジトリ系とリモートリポジトリ系がある。
ローカルリポジトリ系
ローカルリポジトリ内で複数のブランチを切っているなら、戻し先のブランチはどれにするか選択する。
HEAD、
ORIG_HEAD、
FETCH_HEADがあるが、これらはコミットの選択である。
HEAD は現在作業中のコミットである。1つ前のコミット、3つ前のコミットなども選べる。
詳しくは後述の「
いつのコミットへ戻すのか」にて。
ORIG_HEADは、前回、Resetを実行したときの直前コミットに戻す。誤ってResetを実行してしまったときなど、元に戻したいときに選択する。
FETCH_HEADは最後にfetchを行った時のコミットに戻す。他のユーザーが最後に修正したコミットに戻りたいときに使う。
リモートリポジトリ系
リモートリポジトリに複数のブランチが作成されているなら、戻し先のブランチを選択する。
また、複数のGitサービス※と連携している場合、戻し先のWebサービスとブランチを選択する。
いつのコミットへ戻すのか
References/HEAD を選択しているとき、1つ前のコミット、3つ前のコミットなどを選択することが可能である。
「Reset to」に
Head~ を入力すると一つ前のコミットに戻すことができる。
3つ前のコミットに戻す場合は
Head~3 のように
~3を付加する。
non-fast-forward | ブランチでコミットに失敗したら・・・
ブランチへコミット&プッシュをしたがnon-fast-forwardが表示され、リモートリポジトリに反映されないことがある。
原因はmasterでpullを行っていないのが原因かもしれない。
対処手順の例
- とあるブランチへコミット&プッシュをしたがnon-fast-forwardが表示される状態を確認する。
- Eclipse側でブランチをいったんmasterに切り替える。(プロジェクトを右クリック → Team → Switch To → masterを選択)
- pullを実行(プロジェクトを右クリック→Team→pull)
- Eclipse側のブランチを元のブランチに戻す。
- pullを実行
- マージを実行(プロジェクトを右クリック → Team → Marge)
- プッシュを実行(プロジェクトを右クリック → Team → Push to Upstream)
- 以上でリモートリポジトリに反映されていると思う。
あとがき:一人で開発しているとしてもコミット&プッシュの前にpullを行ったほうがいいのかもしれない。
参考:[Git] git push が non-fast-forward で reject された場合の対処