Reset | リセット

Resetは一種の戻り処理である。 コミットを取り消すときなどに利用できる。
Eclipseでは以下のように呼び出す。
プロジェクト名をクリック → Team → Rest


Resetは複雑であるが、大きく分けて以下の3つの概念がある。

  1. どの状態に戻すか
  2. どのリポジトリとブランチへ戻すのか
  3. いつのコミットへ戻すのか


どの状態に戻すか



戻す状態はSoft、Mixed、Hardの3種類がある。
  1. SoftはHEADのみ戻す。
  2. MixedはHEADとインデックスを戻す
  3. 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通りあり、ローカルリポジトリ系とリモートリポジトリ系がある。

ローカルリポジトリ系
ローカルリポジトリ内で複数のブランチを切っているなら、戻し先のブランチはどれにするか選択する。

HEADORIG_HEADFETCH_HEADがあるが、これらはコミットの選択である。
HEAD は現在作業中のコミットである。1つ前のコミット、3つ前のコミットなども選べる。 詳しくは後述の「いつのコミットへ戻すのか」にて。
ORIG_HEADは、前回、Resetを実行したときの直前コミットに戻す。誤ってResetを実行してしまったときなど、元に戻したいときに選択する。
FETCH_HEADは最後にfetchを行った時のコミットに戻す。他のユーザーが最後に修正したコミットに戻りたいときに使う。


リモートリポジトリ系
リモートリポジトリに複数のブランチが作成されているなら、戻し先のブランチを選択する。
また、複数のGitサービス※と連携している場合、戻し先のWebサービスとブランチを選択する。






いつのコミットへ戻すのか

References/HEAD を選択しているとき、1つ前のコミット、3つ前のコミットなどを選択することが可能である。
「Reset to」に Head~ を入力すると一つ前のコミットに戻すことができる。


3つ前のコミットに戻す場合は Head~3 のように~3を付加する。







Resetで1つ前のコミットに戻す

間違ってコミットしてしまった場合、1つ前のコミットに戻って修正することができる。

手順

  1. プロジェクト名を右クリック → Team → Reset
  2. References → HEAD と選択。
    Reset to に 「HEAD~1」を入力する。
    Reset type はMixedを選択。
    入力が終わったら Resetボタンを押す。
    以上でコミットは1つ前に戻る。
  3. コミットを一つ戻したからと言って、ファイルまで元に戻ったわけではない。


    元のファイルはHEAD Revisionと比較すると確認できる。
  4. あとは、ファイルを修正、追加、削除などを行い、最後にコミット→プッシュとおなじみの操作をすればよい。

Revert | プッシュの取り消し

誤ってコミットをプッシュした場合、取り消しが可能である。
取り消しの方法は、誤コミット自体をなくすことでなく、誤コミットをプッシュする前の状態を、もう一度プッシュするという方法である。 (誤コミット前の状態で上書きする)
以下に手順を示す。

手順

  1. GitHubのWebサイトへアクセスし、対象リポジトリ、コミット一覧を開く。 図にあるTEST28コミットを取り消してみる。
  2. Eclipseを開き、対象プロジェクトを開く。

  3. EclipseでHistoryビューを開く。
    プロジェクト名を右クリック → Team → Show in History

  4. Historyビューではコミット一覧が表示される。
    取り消し対象コミットを確認する。

  5. 取り消し対象であるTEST28コミットを右クリック、Revert Commit を選択する。
  6. すると、TEST28コミットで修正したファイルが元に戻る。
  7. このままファイル修正やコミットは行わず、プッシュする。
  8. 以上でTEST28コミットプッシュが取り消される。
    GitHubのWebサイトでもう一度、コミット一覧を確認すると「Revert "TEST28"」というコミットが追加され、 TEST28コミットが取り消されたことが分かる。

競合の修正方法

プルプッシュマージ したときに競合が発生することがある。

競合の修正は手動で行う。(Marge Tool を活用できる)
手動での修正後は、保存、インデックスへ追加、コミット、プッシュという流れである。

詳しい修正手順は以下の通り。

手順

  1. 競合しているファイルを手動で修正する。

    修正が終わったら保存ボタンを押す。
  2. 続いて、インデックスへ修正を追加する。
    プロジェクト名を右クリック → Team → Add to Index と操作する。
  3. 修正したファイルに「*」アイコンが表示されることを確認する。
  4. ローカルリポジトリへコミットする。(プロジェクト名を右クリック → Team → Commit)
  5. プッシュする。
  6. 以上で競合の修正完了。
    プロジェクト名と競合してたファイルから競合アイコンが消えていることを確認する。

SSHを設定する

SSH接続の設定は大まかに説明すると以下の通り。
  1. Eclipseで公開キーと秘密キーを作成する。
  2. 公開キーをGitHubサイトに登録する。


詳細な手順を以下に説明する。

手順

  1. まず、秘密キーと公開キーをEclipseで発行する。

    Eclipseを起動し、以下の操作を行い、発行画面に遷移する。
    window → prefrence → General → NetworkConnection → SSH2

    Generalタグをクリックする。

    「SSH2 home:」には秘密キーと公開キーを保存する任意のディレクトリを指定する。

    「Private keys:」には「id_rsa」を入力する。

    Applyボタンを押して適用する。

  2. Key Management タブをクリックする。

    Passphrase に任意のパスワードを新規入力する。

    Generate RSA Key ボタンを押す

    「You can paste ..」のテキストボックスに公開キーが作成されるので、コピーして保管する。(GitHubサイト側で必要になる)

    Save Private Key ボタンを押す。秘密キー(id_rsa)と公開キー(id_rsa.pub)が指定ディレクトリに保存される。※

    Applyボタン、そしてOKボタンを押す。

  3. 続いて、GitHubサイトにサインインする。

    右上アイコン → Settings と操作する。

  4. SSH and GPG Keys をクリックする。

  5. New SSH key を押して、SSHキーの登録画面を開く。

  6. 「title」には任意の名前を入力する。

    Key にはコピーして保管していた公開キーをペーストする。

    入力が終わったら、Add SSH key ボタンを押す。

  7. 以上でSSH設定は完了である。
    コミット&プッシュで動作確認してみること。


ファイルまたはフォルダをGit管理外にする | Ignore

ファイルまたはフォルダをGitの管理外にすることができる。

手順

  1. Eclipse上で対象フォルダやファイルを右クリック
  2. Team → Ignore
  3. 以上でGit管理外になる。
    Eclipse上のPHPエクスプローラでは見えないが、.gitignoreファイルが作成されている。
    Windowsなどのエクスプローラで.gitignoreファイルを確認できる。
    .gitignoreにはGit管理外のファイル名またはフォルダ名が記述されている。


管理外状態を解除するには?(管理状態に戻す)

.gitignore内の情報を書き換えるか、.gitignoreファイルそのものを削除すればよい。


Eclipse側で不要になったブランチをローカルリポジトリから削除する

手順

  1. PHPエクスプローラのプロジェクト名を右クリック → Team → Switch To → Other...
  2. Branches画面を開く。
  3. Localから不要なブランチを選択して、Deleteボタンを押す。
  4. 以上で不要になったブランチをローカルリポジトリから削除できる。

non-fast-forward | ブランチでコミットに失敗したら・・・

ブランチへコミット&プッシュをしたがnon-fast-forwardが表示され、リモートリポジトリに反映されないことがある。
原因はmasterでpullを行っていないのが原因かもしれない。

対処手順の例

  1. とあるブランチへコミット&プッシュをしたがnon-fast-forwardが表示される状態を確認する。
  2. Eclipse側でブランチをいったんmasterに切り替える。(プロジェクトを右クリック → Team → Switch To → masterを選択)
  3. pullを実行(プロジェクトを右クリック→Team→pull)
  4. Eclipse側のブランチを元のブランチに戻す。
  5. pullを実行
  6. マージを実行(プロジェクトを右クリック → Team → Marge)
  7. プッシュを実行(プロジェクトを右クリック → Team → Push to Upstream)
  8. 以上でリモートリポジトリに反映されていると思う。

あとがき:一人で開発しているとしてもコミット&プッシュの前にpullを行ったほうがいいのかもしれない。

参考:[Git] git push が non-fast-forward で reject された場合の対処