2010-12-17 7 views
8

git logを使用しています。私が嫌っていたプロジェクトの古いバージョンが見つかりました。私はgit checkout version52を実行して、プロジェクトを 'デタッチ'の状態にして、いくつかの変更を加えてからgit commitを実行しました。私はこれが独立した状態でコミットするとは思わなかった。デタッチ状態のときに `git commit`を使う理由は?

この後、私はgit checkout masterと私のマスターに戻りましたが、私がgit logをしたときに私の変更はもう表示されません。私は変更が私のversion52に詰まっていることを今や分かった。

git merge version52でこれらの変更を簡単に適用できますが、私は不思議に思っていましたが、gitで分離状態でコミットできる点は何ですか?初心者の方にはこれが私をしばらく混乱させてしまいました。なぜそれが許されているのか、いつそのような機能を使うのか分かりません。

編集:申し訳ありませんが、以前は「切断済み」と書いていましたが、「切り離された」という意味でした。 gitでは、以前にチェックインしたプロジェクトのバージョンを表示することにしたときにこれが起こります。

+0

これはスーパーユーザーの質問です。 – yoda

+0

切断状態とは - 切断されたHEADを参照していますか? –

+0

はい、申し訳ありませんが、私は "分離"を意味しました – Lan

答えて

6

、あなたはコメント

後、私が書かれているgitのオブジェクトモデルを、編集

git branch branchName version52 
git checkout branchName 

または

git checkout -b brannchName version52 

をオフに動作するようにブランチを作成しておく必要があり約hereは、単にオブジェクトのツリーを追跡します。ブランチはコミットを指すポインタです。 2つは関連していますが、コミットの行の先を指し示すブランチを持つ必要はありません。

コミットを作成しても、古いものになるまでリポジトリに存在するオブジェクトのツリーが作成され、git-gcを実行してこれらの孤立したコミットをクリーンアップします。あなたが心配していることは、支店でのコミットが強制される必要はないということです。これは、時にはユーザーをキャッチするツールに柔軟性をもたらしますが、gitは高度なツールです。

あなたのケースではコミットしてから、あなたのコミットを失ったと思っていましたが、出力がgit reflogであれば、作成したコミットが表示されますそれは支店にはなかった。ここでは、枝をgit branch branchName <sha of commit>で作成できました。あるいは、ブランチを作成して削除する余分な手順を経ずに、別のブランチとのコミット/リベースを行うこともできます。これはほんの数回のキーストロークだけでいくつかの追加ステップです。それはいくつかのケースでは有用です。

ブランチは、特定のコミットの略語と同じように、コミットのツリーの短縮形に過ぎません。ただし、ブランチに対してコミットを行うと、ブランチ・ポインターは最新のコミットと共に移動します。

はいつもあなたがチェックアウトしたことを、コミット遅くとも指すheadポインターがあるので、あなたは本当に

+0

チームで働いているときにも役に立ちます – yoda

+0

今、これは私がやったはずのことであることが分かりました。しかし、分離された状態にすることが有用な時はいつでもありますか? – Lan

-3

あなたは、バージョン管理について少し混乱しているように見えます。変更してテストをパスするたびにコミットします。私は通常、1時間程度で約1回コミットします。これは、私が戻ってきたことがわかっている状態を私に与えてくれます。あなたが "接続"されているかどうかはここにもそこにもありません。将来のために

+0

私はあなたがその質問を誤解したと思います。彼は自分の歴史が未接続の状態であることを話しているが、ソース管理サーバーに接続していないというわけではない。 – Abizern

+0

申し訳ありませんが、私の元の質問に「切り離された」の代わりに「切断された」と書いています。 – Lan

3

が独自に切り離さヘッドにコミットする「切断しない」かなり役に立たないですが、それもあるんインタラクティブなリベース時に使用され、編集のためにコミットをマークすると、ツリーの履歴を書き換えることができます。

rebit中にgitがコミットすると、プロセスが停止し、通常のようにこのコミットをgit commit --amendで変更したり、新しいコミットを挿入することができます。最も重要なのは、そのようなコミットは、git statusが明らかに示すようにブランチに属していないので、分離した頭にコミットすることです。

多くのGitユーザーには、インタラクティブなリベースがより有用なgit機能の1つと考えられ、分離されたHEADにコミットすることが不可能な場合は機能しません。

関連する問題