2011-07-23 2 views
12

"git add"と "git commit"の間にステージングエリアがあるのはなぜですか? 私はこのコンセプトを理解していますが、実際にコミットする前にステージング領域にファイルを追加する意味はありません。なぜこのステップをスキップしないのですか?なぜgitにステージングプロセスがありますか?

答えて

18

The truth is: the index is a staging area. Every SCM has it, but git shows it to you, and uses it effectively.

一つの主な理由は、あなたがあなたの全体の作業ディレクトリをコミットする必要はありませんです。インデックスの一部をインデックスに移動し、それらのインデックスだけをコミットすることができます。

たとえば、次の2つの異なるものに取り組んでいる、と今、あなたのコードが

//random code 

//bug fix 

//new feature 

あなただけ//bug fixラインを上演して、それをコミットし、//new featureラインを上演し、それをコミットするよりもできるようになります。

これで2つの異なるコミットができました。後であなたがnew featureが壊れた何かをコミット実現テストでは、あなたはnew featureコミット削除することができますが、Dickonリードが彼の答えで述べたように、あなたもgit commitとしての性能を得るバグ修正

を付託する必要はありません、今だけする必要がありますコミットのインデックスにあるものを追加します。すべての変更を見つけるためにツリーを検索する必要はありません。

+1

+1。 'git add -p'はおそらく私の好きなgitの機能です。 – MatrixFrog

+0

作業URL:https://git.wiki.kernel.org/articles/w/h/a/WhatIsTheIndex_edd2.html – gilligan

+0

@gilliganありがとう、リンクを更新しました。 – Andy

13
  1. git commitは、変更があったかどうかを確認するためにツリー内のすべてのファイルをチェックする必要はありません。大きな時間を節約することができる大きな木の上に。
  2. いくつかのファイル(またはいくつかのファイル内でいくつかの変更があった場合)をステージングすることにより、コミットしたいものと実行しないものを細かく制御できます。例えば、大きな変更の途中で簡単なバグを発見した場合、他のすべての変更が途切れることなく、1行のバグ修正を素早く実行してコミットできます。
+1

いくつかのファイル内のいくつかの変更について言及すると+1 * – eckes

3

変更の一部をコミットしたくない場合があります。何かを修正した場合は、修正に関連する変更のみをコミットできます。

0

これは私の謙虚な意見では純粋なPITAです。明らかに、ほとんどのUIツール(EclipseのEGit、Mac XCode、およびGitHubクライアントを含む私が知っているすべての実際のツール)はこの機能を公開していません。

私は部分コミットという概念を理解しています。ファイルシステム上にあるすべてのものをコミットする必要はありません。しかし、それのための "ステージ"の概念を導入することは過度のことです。ステージングを公開していないgitのために

1. Your file system 
2. The staging 
3. your local repository 
4. the remote upstream 

UIのフロントエンド:

は、現在お使いのチェックインを通過するための4つの段階があります。彼らはあなたのすべての変更を表示します。コミットするものと、1回の操作でコミットするものをチェックします。

おそらく、これはインパルメーションのディテールで、UIコンセプトに昇格した可能性があります。代わりに:

commit(X, Y, Z) 

あなたが持っている:

add(X), add(Y), add(Z), commit() 
+0

-1:これは質問に答えません。 – sleske

+1

@sleske一部のワークフローでは、ステージングは​​冗長です。質問は推論に関するものであり、そのような場合にはステージングは​​理にかなっていません。 – AlexT

0

を私はDVCSの素晴らしい世界を探索始めていると私はすでにGitの悪魔に魂を売ってきましたが、私はまだ公平な見解を持っています。ステージングエリアの考え方にはいくつかの冗長性がありますが、ステージングエリア全体を無視することができます(githubクライアントを使用している間に行った)。一方、それはより柔軟性を提供するので、時にはあなたを少し助けることができる控えめな冗長性だと言います。

私の頭に浮かんだことは、キャッシュ、ステージングエリア、インデックスという名前が多すぎるということです。明らかに、この設計上の決定は、同様の概念の集合として現れ、その下にいくつかの歴史があります。私は最初の賭けが妥当であることを証明しました - 私はBitkeeperサイトに行き、そこに「ステージング」を見つけました(彼らはオンデマンド分岐のためにそれを使用します)。

今私はBitkeeperがLinuxソースを管理していた時誤用され、いくつかの開発者向けのオンデマンドブランチを作成する代わりに、1人の開発者だけが使用しました。また、このユースケースは有用なものであることが証明されたため、Gitは "インデックス"または "キャッシュ"へのユーザインタフェースを提供することで便利に実装される "ステージング領域"の軽量版を取り入れました。

関連する問題