1 名前:login:Penguin [2007/12/16(日) 18:40:39 ID:GslAi8rs] ソースコード管理を行うバージョン管理システム、git について語ろう。 あの、リーナス・トーバルズだって、バージョン管理を始めたんだ。 www.kernel.org/pub/software/scm/git/ git チュートリアル (バージョン 1.5.1 以降用) www8.atwiki.jp/git_jp/pub/Documentation.ja/tutorial.html
787 名前:login:Penguin mailto:sage [2010/05/19(水) 00:23:37 ID:zJinMQgP] 分かりにくいと思ったのがcheckoutコマンドだな。 svnやcvs等の古典的な checkoutコマンドとは随分意味が違う。 「ちゃんと動くことが分かる」状態に どうやってもどせばいいんだろうと探している時、コマンドのリストの中の checkoutコマンドの説明を見ようとは普通思わないんじゃないかな。
788 名前:login:Penguin mailto:sage [2010/05/19(水) 00:33:38 ID:rEVii6OV] resetも二つの意味含んでるっぽくてわかりにくいな unstageと分けてもいいと思う
789 名前:login:Penguin [2010/06/01(火) 02:42:24 ID:ke5Egb8T] git checkout を使って 2つ前のコミットまで巻き戻したのですが、 git log すると一番最新のコミットと2番目に新しいコミットが見れなくなってしまいました。 もしかして、checkoutはコミットしたものを取り消してしまう危険なコマンドなんでしょうか? 最新のものに戻したい場合はどうすればいいのでしょう・・ てっきりsubversionのrevertと同じようなものだと思って使ったのですが・・ gitのrevertはリビジョンを戻して新しくコミットしなおす感じのようですが、 最近のコミットを取り消さず、単純にファイルを巻き戻すだけのコマンドはないのでしょうか? 教えていただけると嬉しいです。
790 名前:login:Penguin mailto:sage [2010/06/01(火) 03:08:28 ID:ib2iuIgt] >>789 ここまで的確に逆のこと言ってると釣りに見えるな。 git checkout HEAD~2 とかやったのなら、名無しブランチに居るだけだから 元のブランチをcheckoutすれば元どおり。 git revert は指定したコミットを逆パッチしたコミットを作ってくれる。 後戻りはしない。 当たり前にドキュメント読んだほうがいいよ。Subversionとは概念が違う。 ttp://progit.org/book/ja/ ttp://www8.atwiki.jp/git_jp/pages/27.html
791 名前:login:Penguin mailto:sage [2010/06/01(火) 06:48:15 ID:nEJNHOMY] タグとブランチで同じ名前のがある時にタグのfoo、ブランチのfoo という指定はできるのでしょうか。ただfooとだけ指定すると warning: refname 'foo' is ambiguous. リポジトリはcvsimportで作ったもので、ファイルによってfooが ブランチの場合とタグの場合があるためにこういう状態になって います。
792 名前:789 [2010/06/01(火) 12:22:08 ID:7rDC0XFu] >>790 レスありがとうございます。 自分がやったのは git checkcout 862ed98d03863a826dca3246ee61d54264acae57 のような感じなんですが あげて頂いたドキュメントを見ると、checkoutの説明のところに 「また、これが危険なコマンドであることも知っておかねばなりません。」 のように書かれていました。 やはり最新のコミット自体が消えてしまったように思えるのですが・・
793 名前:login:Penguin mailto:sage [2010/06/01(火) 13:52:15 ID:3Zl/kziy] コミットはなかなか消えない。 その下に、 >削除したブランチへのコミットや --amend コミットで上書きされた元のコミットでさえも復旧することができます って書いてあるよ。
794 名前:login:Penguin mailto:sage [2010/06/01(火) 14:35:10 ID:rOsiehIq] >>791 ローカルブランチはheads/foo、タグはtags/fooで明示的に指定できますよ
795 名前:login:Penguin mailto:sage [2010/06/01(火) 18:49:32 ID:zlmZbFtl] >>792 reflogというものがあってだな
796 名前:login:Penguin mailto:sage [2010/06/01(火) 20:05:14 ID:WTjgN8Mk] >>792 > 「また、これが危険なコマンドであることも知っておかねばなりません。」 の部分は作業ディレクトリの情報が消えて、最新のコミットに戻されたって話だよ。 俺はgit以外のvcsをよく知らないけど、 subversionでも、レポジトリと個々人の作業ディレクトリってあるんだよね? 上の話は作業ディレクトリがレポジトリに戻されちゃって、 あなたの作業は消えましたよ、って話だから危険って書いてあるんじゃないのかしら。
797 名前:login:Penguin mailto:sage [2010/06/01(火) 20:17:52 ID:WTjgN8Mk] >>789 は最新のコミットと2つ前のコミット間の、あるファイルのdiffでも見たいの? そうなら、 git diff HEAD~2 -- (あるファイル) っていうのはどう? どうしてもcheckoutしたいならcheckoutした後、 git diff master.. -- (あるファイル) でもいい
798 名前:login:Penguin mailto:sage [2010/06/01(火) 20:24:44 ID:WTjgN8Mk] >>792 あ、それと言うの忘れてた。 > git checkcout 862ed98d03863a826dca3246ee61d54264acae57 なら、>>790 も言ってるけど一時的に別のブランチにいるよ。 git branchしてみれば、今までのブランチと別のブランチにいることが分かると思う。 git masterとかやれば元に戻れるんじゃないかな。 元がmasterなのかは知らないけど。
799 名前:792 [2010/06/02(水) 01:34:42 ID:gi9ro0yc] 色々レスありがとうございます。 状況としては、 最近のコミットに 49qayt928t4ht2 と goghpghr9g9grh というのがあったとして(文字列は適当です) 49qayt928t4ht2 が最新なのですが、一つ前のgoghpghr9g9grhに戻したいと思い、 git checkout goghpghr9g9grh としたら、git log しても最新の 49qayt928t4ht2 が表示されなくなり、49qayt928t4ht2のコミットが消えてしまったように見える、 また最新の49qayt928t4ht2に状態を戻したくても、戻した方が分からない、といった感じだったのですが git reflog と git resetのおかげでなんとかなりました。 勉強になります。ありがとうございました。
800 名前:login:Penguin mailto:sage [2010/06/02(水) 05:38:06 ID:tFFCKjtC] >>799 checkout直後なら以前チェックアウトしていたコミットがORIG HEADに格納されてるよ
801 名前:login:Penguin mailto:sage [2010/06/02(水) 23:19:00 ID:epvzW2MP] ORIG_HEADってマージのときに使うものかと思ってた あれ?MERGE_HEADだっけ?
802 名前:login:Penguin mailto:sage [2010/06/03(木) 00:57:02 ID:4mfPiwdf] >>792 色々と突っ込みたい所はあるが、とりあえずチュートリアル読めば?
803 名前:login:Penguin mailto:sage [2010/06/03(木) 08:35:19 ID:dAM44TeX] >>799 git resetを使う状況じゃない。まずは>>798 の内容を理解しよう。
804 名前:login:Penguin mailto:sage [2010/06/03(木) 22:34:29 ID:NRpX3vOy] git の branch コマンドは他のVCSみたいな、いわゆる枝(branch)を作るコマンドじゃないことを理解した方がいい。 単に自分のいる点に目印の旗を立ててるだけ。 commitやreset等で自分が動けば旗も移動する。
805 名前:login:Penguin mailto:sage [2010/06/03(木) 22:37:18 ID:2hMMbzRW] >>804 これの"create"は「作る」という事ではないのですか? $ man git-branch ... NAME git-branch - List, create, or delete branches
806 名前:login:Penguin mailto:sage [2010/06/03(木) 23:35:29 ID:k3O2NdDL] >>805 まあ論理的には「作る」と考えて良いんだけど、、、 内部的には複数のコミットから親として参照されてればそれはブランチと言える というぐらいで、特にbranchコマンドを使わなくても、ある履歴の途中の位置を checkoutして何かコミットすれば分岐になるし、commit --amend とかで やり直ししても以前のコミットと新しいコミットは分岐してる。 ただこの場合古いコミットは一見して行方不明になるけど、branchコマンドは そこに旗を立てて移動しやすかったり自動でGCされないようにしたりしてる感じ。 reset とかいろいろ試してるうちに内部構造が分かるとそう思うようになったかな。
807 名前:login:Penguin mailto:sage [2010/06/04(金) 00:02:52 ID:/Cv0eiGe] 各コミットは親を記憶してるから点から親を遡ることで枝を表現できる ただ子の記憶は無いから自分の子供がどうなったかを辿る簡単な手段は無い checkout等で移動してコミットが消えてるように見えるのはこの為
808 名前:login:Penguin mailto:sage [2010/06/04(金) 06:08:20 ID:PyuP7am3] >>805 自動更新してくれるタグとおもえばよいよ
809 名前:login:Penguin mailto:sage [2010/06/05(土) 11:36:02 ID:aEd5JAax] 実はCVSでも似たようなことになっているんだけど、 自動GCがないということと、リポジトリの実装がファイル 単位なのでcvs adminコマンドで実現しようとすると1コミット に関連するファイルに比例して面倒になる、という点が大きく違う。
810 名前:login:Penguin mailto:sage [2010/06/05(土) 20:57:10 ID:zknULthJ] git svn clone すると Using higher level と言われて取ってこれないんですが、 どうしたらいいんでしょうか? $ git svn clone --prefix svn/ -s svn+ssh://xxx/var/svn/project Initialized empty Git repository in /Users/alice/src/project/.git/ Using higher level of URL: svn+ssh://xxx/var/svn/project => svn+ssh://xxx/var/svn error: git-svn died of signal 13 svn ls すると見えてます。svn co もできます。 $ svn ls svn+ssh://xxx/var/svn/project branches/ tags/ trunk/ バージョン $ git --version git version 1.7.1 試しにローカルに作ったsvnリポジトリに対しては、リポジトリ内のサブディレクトリに 相当するプロジェクトを同様のコマンドで取ってこれます。 $ git svn clone --prefix svn/ -s file:///var/svn/project2 → 成功
811 名前:810 mailto:sage [2010/06/05(土) 23:35:57 ID:zknULthJ] 試行錯誤してたらローカルのsvnリポジトリに対してでも svn+ssh だと失敗 git svn clone --prefix svn/ -s file:///var/svn/project2 → 成功 git svn clone --prefix svn/ -s svn+ssh://localhost/var/svn/project2 → 失敗 git svn clone -s svn+ssh://localhost/var/svn/project2 → 失敗 git svn clone svn+ssh://localhost/var/svn/project2 → 失敗 git svn clone svn+ssh://localhost/var/svn/project2/trunk → 成功 もしかしてssh経由だと最後の方法しかダメ?