Version 15 (modified by cho45, 6 years ago)

--

Git

git 全般

空ディレクトリを追加したいときってどうすんの

(FAQ に書いてあるけど) できない。.gitignore ファイルをつくって add するとかするしかない。

「元に戻す」コマンド

git-revertは指定したコミットと同じ状態に戻るようなパッチを作成・適用してコミットする。つまり、以前の状態に戻し、「戻した」という作業も変更履歴に残したい場合に使う。

git-resetrevertと似ているが、新たなコミットは発生せず、変更履歴には残らない。マージをミスったり、直前にコミットした内容に実はしょぼいミスがあって修正したいときに使う。前者の場合は--hardを指定して作業ツリーの内容も元に戻すとよい。後者の場合は--softを指定すると作業ツリーの内容はそのままになるので修正作業がしやすい。 git-resetは現在のブランチの最新版のコミットを指すポインタをずらすだけなので、既存のコミット内容はリポジトリに残ったままである。どこからも参照されないコミットはそのうち削除されるので気にしなくてよい(git-gcで明示的に削除することもできる)。

svn revert fooと同様のことをしたい場合はgit-checkout -- fooとする。--fooと同名のブランチが存在する場合は省略できない(git-checkoutはブランチの切り替えにも使うので)。

「どうでもいいtypoなどを見つけて修正したいけど、現在の作業内容と一緒くたにしてコミットするのは嫌だ」という場合はgit-stashを使うとよい。git-stash saveで現在の作業内容を保存して作業ツリーを元の状態に戻し、修正作業をした後、git-stash applyで中断していた作業内容に復元できる。

git init するたびに git config user.email ... とかやるとめんどい

$ git config --global user.email ...

git svn

merge したあと dcommit できないよ

fast-forward commit とかいうやつでマージのときはコミットが発生しないみたいです。--no-ff をつけて merge しましょう。

merge のとき --no-ff つけわすれてマージコミットが発生しなかったよ……

A. mergeする前の状態に巻き戻してからやりなおしましょう。

$ git reset --hard ORIG_HEAD
$ git merge <branch_name> --no-ff

HEAD^は直前のコミットの取り消しには使えますが、マージ後の場合は必ずしもmerge前の状態を指すとは限らないので使えません。

自分で git init したやつを Subversion にコミットしたいんだけど

以下の方法だと branch や tag は反映されない (しかもどれがどのコミットかわからないので copy できなくてめんどい?)。

# Subversion のコミット先を作る
$ svn mkdir http://svn.coderepos.org/share/dan/perl/foobar
$ svn mkdir http://svn.coderepos.org/share/dan/perl/foobar/{trunk,branches,tags}

# git repos を作る (あたらしく clone したほうが無難)
$ git clone git@github.com:yourname/foobar.git

# git svn を初期化 (init -s で初期化するときは自分で git-config 設定しないとダメっぽい)
$ git svn init http://svn.coderepos.org/share/dan/perl/foobar/trunk

# なんか必要
$ git svn fetch

# set-tree で、git のコミットを強制的に全部コミットする
$ git svn set-tree <first-commit-id>..HEAD

set-tree は、git と svn との対応をとらずに git repos 側を一つ一つリビジョンを進めながら、svn ci していくのと同じ?