Android、Java、Web系、Linux、マラソン等の備忘録

2012/10/10

Eclipseで一通り基本的なGitを使ってみる

0 件のコメント
備忘録的にまとめておきたいと思います。おかしな点があればご指摘いただければ幸いです。

目次

環境

  • Eclipse IDE for Java Developers:Juno Service Release 1
  • Git:上記Eclipseのプリインストール版



プロジェクト作成~初コミットまで

多くの場合は、どこかしらプロジェクトを取り込んでそこからコーディングかと思われますが、Hello world的なプロジェクトを作成して初めてコミットするまでの手順です。
まずパッケージエクスプローラ上で、右クリック - [New] - [Java Project]を作成し、適当なパッケージとクラスを作成します。そこから、プロジェクト上で右クリック、[Team] - [Share Project]を選択。

次に表示される画面でGitを選択します。Configure Git Repositoryという画面が表示されるので、[Create]ボタンを押下します。



リポジトリを作成するディレクトリと、リポジトリの名前を指定し、[Finish]ボタンを押下。


リポジトリと作業ディレクトリが反映されるので、[Finish]ボタンを押下します。これで、リポジトリの準備ができました。先ほどと同様に、プロジェクト上で右クリックして、[Team] を選択すると、

様々な操作が行えるようになっているので、Commitを選択します。


コミットするメッセージを入力し(最初なのでFirst commitと入れてます)、コミットするファイルを選択(とりあえず全部選択)し、[commit]ボタンを押下すると、コミット完了です。

コミットの履歴&差分を見る

履歴っぽく、先ほどのソースを適当に修正して、コミットしておきます。
プロジェクト上右クリック[Team] - [Show in History]でHistory Viewが表示され見る事ができます。

その中で、右にある変更があったファイルを選択すると、左にその差分が表示されます。



さらに、右のソースで右クリック[Compare with Version in Ancestor]を選択すると、見やすく並べてくれます。



元に戻す

漠然と元に戻すと書いてしまいましたが、やべ!コーディングをやり直したい!時に以下のやり方があります。Revert Commitという項目もありますが、意味的にこれが一番しっくりきそうですがイマイチどういう機能か不明です。
  • Filen in Git index
  • Reset(Hard)
  • 差分から戻す
以下を参考にしました。

・Eclipse git checkout (aka, revert) - Stack Overflow
http://stackoverflow.com/questions/1750997/eclipse-git-checkout-aka-revert

File in Git index


プロジェクト上、またはファイル上で右クリックし、[Replace with] - [File in Git index]と選択すると直前のコミットに戻してくれます。プロジェクトに対して行えば、プロジェクトごと。ファイルであれば1ファイルだけ戻してくれます

Reset(Hard)

Histroy Viewから任意のコミットを選び、右クリック[Reset] - [Hard(HEAD, Index, and Working Directory]で指定のコミットへ丸ごと戻してくれます。File in Git indexと違う点は、ファイル単位で指定できないのと、過去のコミットに戻せる点です。


差分から戻す

Histroy Viewからファイル上で右クリックし、[Compare with working Directory]を選択します。そうすると、差分が表示されるので、端にあるアイコンで右のソースを左へ置き換える事ができます。これは上記2つの特徴を2つ合せた感じですね。





ブランチについて

こちらに掲載されている話がわかりやすいと思います
・ブランチとは【ブランチ】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
http://www.backlog.jp/git-guide/stepup/stepup1_1.html
■ブランチとは
ブランチとは、履歴の流れを分岐して記録していくためのものです。分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。
また、分岐したブランチは他のブランチと合流(マージ)することで、一つのブランチにまとめ直すことが出来ます。
使い勝手としては、最初のコミットしたものを統合ブランチとして、リリースする時以外は特に手を触れず、それ以外のバグ修正用ブランチとか、機能追加用ブランチに枝分かれして、作業が終了したら統合ブランチへマージするというイメージでしょうか。


ブランチを作成してみる

とりあえず、最初のコミットとして、特に処理の入っていないソースをコミットします。

package net.takaiwa.gittest;

public class HelloWorld {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

 }

}

さらに、Hello Worldっぽく標準出力を入れてコミットし、リリース版とします。

  System.out.println("Hello world");

これに、ブランチを作成して機能追加してみます。
[Team] - [Switch To] - [New Branch..] で表示される画面にブランチ名を入力してFinishボタンを押下します。

ブランチ名:"AddMethod"と入力した

これでブランチが作成され、先ほどの[Team] - [Switch To] - [New Branch..]に


AddMethodとmasterが表示されます。ここで簡単にブランチを切り替えられます。



機能追加ブランチ(AddMethod)では、

  System.out.println("Hello Git!");

と追加しておきコミットしておきます。

おっと!リリース版のHello worldにはビックリマーク”!”を付け忘れたという事で、バグ修正したいと思います。
[Team] - [Show in History]で表示されるmastarブランチ上で右クリックして、[Create Branch]を選択。※さきほどのブランチ追加もここでやってもよかったかもしれません。



ブランチ名:BugFixで作成

これで、

System.out.println("Hello world!");

と修正してコミットします。

ブランチを統合するには

さて、このようにブランチがゴチャっとしてきたわけですが、


1人で開発をしていても割りとありそうなシーンだと思います。機能追加の作業を続行するには、バグ修正版のソースが必要です。マージの方法は、

  • merge
  • rebase
という2種類の方法があるのですが、こちらにとても分かりやすく解説されています。
・ブランチの統合【ブランチ】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
http://www.backlog.jp/git-guide/stepup/stepup1_4.html

まずは、バグ修正版をリリース版へマージしたいと思います。
プロジェクト上で右クリック[Team] - [Switch To] - [master]でプロジェクトをマスターブランチにしておきます。そして、再びプロジェクト上で右クリックして [Team] - [Merge]を選択します。


取り込みたいBugfixブランチを選択して、[Merge]ボタンを押下します。これで、Histroy Viewを見ると、


これでリリース版にバグ修正が反映されましたが、


こうなると、機能追加の作業としては、バグ修正されたものを使いたいです。機能追加ブランチにmasterブランチをマージするやり方と、masterブランチをrebaseするやり方が両方をやってみましょう。いずれも、競合が発生するので修正が必要です。

マージする

AddMethodブランチで[Team] - [Merge]を選んで、masterをマージすると、

 public static void main(String[] args) {
  // TODO Auto-generated method stub
<<<<<<< HEAD
  System.out.println("Hello world");
  
  System.out.println("Hello Git");
=======
  System.out.println("Hello world!");
>>>>>>> refs/heads/master
 }

競合が発生してこのようにソースに記述されます。このソースを手で修正するか、[Team] - [Merge Tool]を開き、表示されるダイアログで「Use HEAD (the last local version) of conflicting files」を選択すると下図のようにマージツールが表示されるので、Helloworld.javaをダブルクリックして、ソースの差分を見ながら修正します。

このボタンで、左から右へ行をコピーする

この後、[Team] - [Add to Index]を選択して競合マークを解消するとコミットできるようになります。


Rebaプロジェクト作成~初コミットまで">seする

masterブランチでAddMethodブランチをリベースすると、並行してたブランチがmasterからの履歴にしてくれます。Eclipseの場合、masterの履歴にしてからマージしたものを追加するようなイメージなので、

・ブランチの統合【ブランチ】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
http://www.backlog.jp/git-guide/stepup/stepup1_4.html

の動作とは若干異なる気がします。というか、試行錯誤でやったので正しいのかどうか疑問ではありますが.....

AddMethodブランチに対して、[Team] - [Rebase]を選択すると、ダイアログが表示されるので、Local->masterを選択します。次のダイアログにてRebaseの実行方法を問われます。

[Action to perform]

赤枠から実行方法を選択

  • Start Merge Tool to resolve conflicts

    上記同様のマージの対応を行います。マージしてAdd to Indexしてコミットが完了したら、[Team] - [Rebase]に選択肢が増えてます。

    • Abort Rebase:ここまでのリベースの処理を中断し元に戻してくれます
    • Skip Rebase:たぶん、これが処理の完了のような気がします。Add to Indexをやってないと、masterのファイルに置き換わります。
    • Continue Rebase:処理を続行(特に変らず)

      このAbort RebaseまたはSkip Rebaseを行わないと、masterブランチにブランチを切り替えたりする事ができません。※「Repository state: Rebase interactive.」とか言うダイアログが出て拒絶されます

      Rebaseの処理を完了させると、枝は以下のようなイメージになります。Eclipseの履歴にも枝が表示されます。



      さきほどのリンクでは1本に統合されてましたが、Eclipseは枝が残ります。AddMethodブランチの履歴が、masterのものと置き換えられ、System.out.println("Hello Git!");を追加したコミットは、途中の枝となっています。とは言え、競合した時のマージでSystem.out.println("Hello Git!");も取り込んでいれば、その処理も最新のソースにいるはずです。
  • Skip this commit and rebasing the next commit

    これを選択すると、masterのファイルで置き換わります。履歴はmasterと同じになり、System.out.println("Hello Git!");の対応はどっか行っちゃいます。
  • Abort rebase

    Rebase取りやめ
  • Do nothing

    以下のようにソースにマージされて放置。Merge Toolを開いて修正を行うのがよいのではないかと思われます。
     public static void main(String[] args) {
      // TODO Auto-generated method stub
    <<<<<<< Upstream, based on master
      System.out.println("Hello world!!");
    =======
      System.out.println("Hello world");
      System.out.println("Hello git");
    >>>>>>> 3f22f40 add hello git
     }

ローカルリポジトリからプロジェクトを取り込む


パッケージエクスプローラを右クリック[Import] - [Project from Git]を選択してNextボタンを押下します。ローカルを選択し、保存されてるプロジェクトを選択します。

Select a wizard to use for importing project画面で、Import existing projectsを選択し、nextボタンを押します。この時に、きっと「.project」ファイルがあるディレクトリを指定すると良いでしょう。これで、同じ環境が手に入るはずです。


とりあえず、これで基本的な事は一通りできるんじゃないかと思います。後で必要だと思った部分は追記します。おかしな所があればご指摘いただければ幸いです。1人で開発している分には、特にRebaseさせる機会もないんじゃないかと思いますし、ややこしくなるので避けたいところです。

追記:2012/10/19

コミットしたメッセージの修正


右クリック > Team > Commmit


表示されるダイアログの右の方に、「Amend Previous Commit」というヒントが表示されるアイコンがあります。これをクリックすると、前回のメッセージが表示されるので、それを編集してコミットすれば反映されます。

追記:2012/10/21:EclipseのGitのCommitショートカットを有効にする
追記:2014/01/10:試行錯誤ログ: EGitでコミット履歴を閲覧するショートカットキー

[参考]
サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
EGit/User Guide - Eclipsepedia
Eclipse Community Forums: EGit » Interactive rebase a dead end?

[PR]
アリスとボブのGit入門レッスン
Gitポケットリファレンス
入門git

0 件のコメント :

コメントを投稿