git reset直前のコミットはORIG_HEADに保存されてる
間違えてgit reset(–soft/–hard問わず)してしまった場合とか、取り消すのはいいんだけどコミットログは見たいとか思ったら、
git show ORIG_HEAD
すれば良い。
ORIG_HEADはgit resetする直前のHEADの状態を指しているので、git diffで差分を見るといったこともできる。
git diff ORIG_HEAD
間違えてgit reset(–soft/–hard問わず)してしまった場合とか、取り消すのはいいんだけどコミットログは見たいとか思ったら、
git show ORIG_HEAD
すれば良い。
ORIG_HEADはgit resetする直前のHEADの状態を指しているので、git diffで差分を見るといったこともできる。
git diff ORIG_HEAD
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を使うことでsubversionのリポジトリをgitで操作できる。 チェックアウトしてからの作業の流れは次のような感じ。
以下、参考になるサイトを列挙してみる。
git-svnの使い方を覚えた はgit-svnのチュートリアル。
Git入門 ゼロから始めるGitドリルはgitそのもののチュートリアル。Git/Subversionコマンド対応表なんてものもある。
操作ミスなど困ったときにはGit初心者が絶対に覚えておくべきコマンドや git-svn駆け込み寺などが役立ちそう。
ただgitはsvnとは思想が全く違うので単純に対応はしないと思う。ブランチングのモデルについてはRubyKaigi2009でのgit/githubに関するセッションが、英語だけど図が多用されていてイメージしやすい。
svnを使わずにgitをリモートのリポジトリとして開発する際にはブランチの作成方法等でルールが必要になると思うけど、A successful Git branching model(翻訳版)に従えば絶対に大丈夫という話もあったりする。
以前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
$ git clone git@example:repos/project.git
$ cd project
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されている。
プロジェクトの設定画面で「リポジトリ」タブを選択し、「バージョン管理システム」にgit、「Path to .git directory」に「/Users/git/repos/project.git」を設定すれば良い。
gitの操作(addやstatus)で特定のファイルを無視するには、リポジトリのルートディレクトリに.gitignoreファイルを設定すればよい。
ただし以下の点に注意。
以下、自分の設定内容をメモっておく。
*.DS_Store profile build/* *.pbxuser *.mode1v3
buildディレクトリ以下の更新内容は無視して構わない(と以前どこかで読んだ)。あとはnib/xib以下にできるバックアップファイルとか、Finderの設定ファイルとか。
Stack Overflowにもいろいろな例があがっている(そこからgistを作った人もいる)。
Railsアプリをgitで管理するときのやり方を参考にするとよさそう。
git 1.6.3.3 on Mac OS X 10.5
以下の方法でとりあえず動く。ただし安全かどうかは保障できない。
$ 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
$ 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が大事。
$ cd ~/tmp $ git clone git://hostname/testrepos.git