Tag Archives: git

git reset直前のコミットはORIG_HEADに保存されてる

間違えてgit reset(–soft/–hard問わず)してしまった場合とか、取り消すのはいいんだけどコミットログは見たいとか思ったら、

git show ORIG_HEAD

すれば良い。

ORIG_HEADはgit resetする直前のHEADの状態を指しているので、git diffで差分を見るといったこともできる。

git diff ORIG_HEAD

参考


git-svnでリモートのブランチを作成・コミット

git svn branch <BRANCH>で<BRANCH>というリモートブランチがbranches/<BRANCH>に作られる。 これはgit branch -rで確認できる。

$ git svn branch foo
$ git branch -r

git checkout <BRANCH1> remotes/<BRANCH2>でコミット先がbranches/<BRANCH2>を向いたローカルブランチ<BRANCH1>が作成される。 これはgit svn infoで確認できる。

$ git checkout foo remotes/bar
$ git svn info

このローカルブランチに対して変更を加えていき、最終的にgit svn dcommitでリモートブランチに反映する。

$ git svn dcommit

コミット先のURLをgit checkoutでしか変更できないものなのかな?既存のローカルブランチのコミット先を変更する方法がある気がするんだけど、そこまで調べきれなかった。

そろそろgitの本が欲しい。


git-svnを使う際に参考になるサイト

git-svnを使うことでsubversionのリポジトリをgitで操作できる。 チェックアウトしてからの作業の流れは次のような感じ。

  1. svnリポジトリからgit-svnでチェックアウトしてきてgitのローカルリポジトリに変換
  2. gitでローカルリポジトリに変更をコミット
  3. ローカルリポジトリにコミットされた内容をgit-svnでsvnリポジトリにコミット

以下、参考になるサイトを列挙してみる。

git-svnの使い方を覚えた はgit-svnのチュートリアル。

Git入門 ゼロから始めるGitドリルはgitそのもののチュートリアル。Git/Subversionコマンド対応表なんてものもある。

操作ミスなど困ったときにはGit初心者が絶対に覚えておくべきコマンドgit-svn駆け込み寺などが役立ちそう。

ただgitはsvnとは思想が全く違うので単純に対応はしないと思う。ブランチングのモデルについてはRubyKaigi2009でのgit/githubに関するセッションが、英語だけど図が多用されていてイメージしやすい。

svnを使わずにgitをリモートのリポジトリとして開発する際にはブランチの作成方法等でルールが必要になると思うけど、A successful Git branching model(翻訳版)に従えば絶対に大丈夫という話もあったりする。


gitリポジトリを立ててSSHで利用

以前daemonを起動してリポジトリ立てる方法について書いたけど、今回はgitのリポジトリを立てる(SSH経由) を参考にSSH経由でできるようにやってみた。

リポジトリを置くサーバのホスト名はexampleとする。

ユーザの追加

リポジトリを操作するためのgitユーザをexampleサーバに追加する。 Mac OS 10.6の場合、ユーザは dsclで追加 する。

このときシェルにgit-shell(MacPortsで入れたなら /opt/local/bin/git-shell にある)を設定する。こうすることでpush,pullのみを受け付けるようになる。

リポジトリの作成

example:/Users/gitディレクトリ配下にリポジトリを集約するreposディレクトリを作成し、今回はprojectというリポジトリを作成してみる(末尾に.gitを付けるのは慣習?)。

% cd /Users/git
% sudo -u git mkdir repos
% sudo -u git mkdir repos/project.git
% cd repos/project.git
% sudo -u git git init --bare

鍵を追加

gitユーザにSSHでログインするための鍵を追加する。

% cat ~/.ssh/id_rsa.pub > /Users/git/.ssh/authorized_keys

cloneしてみる

$ git clone git@example:repos/project.git
$ cd project

pushしてみる

masterブランチでのコミット内容をorigin(サーバ側)に適用する。

$ git push origin master

ただこのときに次のようなエラーがでるかもしれない。

$ git push -v origin master
Pushing to git@example:repos/project.git
To git@example:repos/project.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@example:repos/project.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

原因はよくわかってないのであれだけど、とりあえず-fオプションをつけて再度実行すればちゃんとpushされている。

おまけ:Redmineでリポジトリを閲覧

プロジェクトの設定画面で「リポジトリ」タブを選択し、「バージョン管理システム」にgit、「Path to .git directory」に「/Users/git/repos/project.git」を設定すれば良い。


Gitで無視するファイルを設定する

gitの操作(addやstatus)で特定のファイルを無視するには、リポジトリのルートディレクトリに.gitignoreファイルを設定すればよい。

ただし以下の点に注意。

  • .gitignore自体をadd/commitしないと効果は現れない
  • 一度commitしたファイルはあとから無視設定をしても効果がない(一旦リポジトリから削除する必要がある)(gitignoreでハマる

以下、自分の設定内容をメモっておく。

Xcodeで作成したプロジェクト

*.DS_Store
profile
build/*
*.pbxuser
*.mode1v3

buildディレクトリ以下の更新内容は無視して構わない(と以前どこかで読んだ)。あとはnib/xib以下にできるバックアップファイルとか、Finderの設定ファイルとか。

Stack Overflowにもいろいろな例があがっている(そこからgistを作った人もいる)。

Rails

Railsアプリをgitで管理するときのやり方を参考にするとよさそう。


Mac上にgitの公開リポジトリを作る

git 1.6.3.3 on Mac OS X 10.5

以下の方法でとりあえず動く。ただし安全かどうかは保障できない。

git-coreのインストール

$ sudo port install git-core +gitweb # 一応gitwebも

リポジトリの置き場所を作る

ここでは/opt/local/var/git/repos以下にリポジトリを作ると仮定する。

$ sudo mkdir /opt/local/var/git/repos
$ cd /opt/local/var/git/repos

daemonを起動

$ sudo /opt/local/libexec/git-core/git-daemon --export-all --enable=receive-pack --base-path=/opt/local/var/git/repos

–base-pathでリポジトリの置き場所を指定する。–export-allと–enable=receive-packはまだよくわかってない。

リポジトリを作る

新規に空のリポジトリを作る場合は次を実行。

$ cd /opt/local/var/git/repos
$ sudo mkdir testrepos.git
$ cd testrepos.git
$ sudo git init --bare
$ sudo touch git-daemon-export-ok

どっかからクローンしてくる場合(例えば既存のローカルリポジトリ/path/to/cloned/reposを公開したい場合)には次を実行。こっちのがsudoをあまりしなくて済むので楽かも。

$ cd /opt/local/var/git/repos
$ sudo git clone --bare /path/to/cloned/repos ./testrepos.git
$ sudo touch git-daemon-export-ok
$ sudo touch testrepos.git/git-daemon-export-ok

どちらにせよ–bareが大事。

cloneしてみる

$ cd ~/tmp
$ git clone git://hostname/testrepos.git

ToDo

  • git-daemon-export-okってなに。
  • –export-allってなに。
  • –enable=receive-packってなに。
  • 今のとこroot権限でリポジトリが作成されてるんだけど、そこらへんどうなんだろう。
  • ネットワーク越しのローカルレポジトリから公開リポジトリを作るにはどうすればいいんだろう。
  • launchctlに登録したい。

参考資料