2013年6月19日水曜日

gitによるバージョン管理

将来の複数人開発や、一人開発でもある時点に戻したいことはよくあるためgitの使い方を整理しておきます。

1. 開発中の作業

開発中は チェックアウト→ 修正 → ローカルコミット→マージ→ローカルコミット→プッシュ の基本の流れと、修正を取り消すことが主な作業となるので整理します。
 
$ git clone git://localhost/test2.git
$ cd test2
== ファイルを追加、削除、ファイル移動
$ touch "hoge" > newfile.txt
$ git add .     
$ rm currentfile.txt
$ git rm currentfile.txt
$ git mv test.txt rename.txt 


== 状況確認, コミット
$ git status   // どのファイルが追加・編集・削除 されたか
$ git diff        // ローカルレポジトリとの比較
$ git commit -m "コメント"

== レポジトリの確認
$ git log      // コミット日時とコメント一覧

== もとに戻す
$ git reset --hard commit_hash  
# 指定したコミットにローカルリポジトリ、インデックスを完全に戻す。
# コミットしていない状態に戻り無かったことになる

$ git reset --soft HEAD~  
# 1つ前のコミットに戻す。ワーキングツリー・インデックスファイルは影響しない

$ git reset --mixed HEAD~  
# 1つ前のコミットにインデックス・リポジトリを戻す。ワーキングツリーには影響しない

2. バージョン管理開始や移行作業

gitへの登録やgitサーバを切り替えるときの作業。合わせてgitサーバをMacで起動する方法も整理する。

2.1 gitサーバの起動

標準のgit-daemonを利用してgitサーバを構築します。

== テスト用レポジトリの作成
$ cd /cocos/repositories   ## ここをgitのレポジトリとする
$ mkdir test1.git
$ cd test1.git
$ git init --bare --shared
Initialized empty Git repository in /cocos/repositories/test1/

== git-daemonを起動
$ /usr/libexec/git-core/git-daemon --verbose --export-all ¥
--enable=receive-pack --base-path=/cocos/repositories &
 [16161] Ready to rumble

== 別ウィンドウ・ディレクトリでチェックアウトとコミットのテスト
$ cd 
$ git clone git://localhost/test1.git
Cloning into 'test1'...
warning: You appear to have cloned an empty repository.
$ cd test1
$ ls
$ echo "test" > text.txt
$ git add .
$ git commit -m "initial commit"  // 初回は名前とメールアドレスを自動設定したとのメッセージが表示
$ git config --global user.name "Name"    // 適当に設定する
$ git config --global user.email "hoge@gmail.com"
$ git remote add origin git://localhost/test1.git
$ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 219 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git://localhost/test1.git
 * [new branch]      master -> master

よく使うコマンドはこちら

2.2 別gitからのパッケージ移行

 
$ git remote -v     # 現在のリモートレポジトリを確認
origin git://localhost/test1.git (fetch)
origin git://localhost/test1.git (push)

$ git remote set-url origin git://localhost/test2.git
$ git remote -v
origin git://localhost/test2.git (fetch)
origin git://localhost/test2.git (push)

$ git push 

2.3 外部のgitサービスを利用

$ cd tmp   ⇐ フォルダ名はなんでもいい
$ touch README.md   
$ git init
Initialized empty Git repository in /Users/xxxxx/tmp/.git/
$ git add README.md 
$ git commit -m "first commit"
[master (root-commit) 2af2742] first commit
 0 files changed
 create mode 100644 README.md
$ git remote add origin https://git.codebreak.com/xxxxx/hoge.git
$ git push -u origin master       ⇐ originをレポジトリのmasterにして送信
Username for 'https://git.codebreak.com': xxxxxxxx
Password for 'https://xxxxx@git.codebreak.com':  xxxxxxx 
Counting objects: 3, done.
Writing objects: 100% (3/3), 204 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Updating references: 100% (1/1)
To https://git.codebreak.com/xxxxxx/hoge.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

$ cd 
$ git clone https://git.codebreak.com/xxxx/hoge.git
$ cd hoge
$ ls 
README.md