以下からのGit SCMブック:
多くの場合、プロジェクトの一部で作業しているとき、物事は乱雑な状態にあり、他の何かで作業するためにブランチを少し切り替えたいと思います。問題は、後でこのポイントに戻ることができるように、半完了作業のコミットを行いたくないことです。この問題に対する答えは、git stashコマンドです。
Stashingは、作業ディレクトリのダーティー状態(つまり、変更された追跡ファイルとステージングされた変更)を取得し、いつでも再適用できる未完成の変更のスタックに保存します。
この説明を考えると、これはアンチパターンだと思います。Git Stashの非常に単純化された説明は、それがソース管理の「カットアンドペースト」であるということです。たくさんの変更されたファイルを取り出し、Gitの通常のブランチワークフローの外にある保持ペンで「隠して」、それらの変更を後日別のブランチに再適用します。
少し戻って、マスターにコミットすることは、ここでのアンチパターンです。ブランチを使用します。それは彼らが設計されたものです。
それは本当にこれに要約します:
あなたは壁にネジを打ち込むことができ、それは写真を保持しますが、ドライバーを使用することはあなたがすべきことです。ドライバーがあなたのすぐそばに座っているときは、ハンマーを使用しないでください。
「壊れた」コードのコミットについて
以下は意見ですが、私は経験からこの意見に来ました。
早期にコミットし、頻繁にコミットします。必要なだけ壊れたコードをコミットします。ローカルコミット履歴を「保存ポイント」として表示し、何かをハックします。論理的な作業が完了したら、コミットを行います。確かにそれはすべてを壊すかもしれませんが、それらのコミットをプッシュしない限り、それは問題ではありません。プッシュする前に、コミットをリベースおよびスカッシュします。
- 新しいブランチを作成
- ハックハックハック
- 壊れたコードをコミットする
- コードを磨き、機能させる
- 作業コードをコミットする
- リベースとスカッシュ
- テスト
- テストに合格したらプッシュする
OPにとっては、このLinuxカーネルメッセージスレッドが興味深いかもしれません。OPのチームの一部のメンバーが同様の方法でGitを使用しているように聞こえるからです。
@RibaldEddieは以下のコメントで言った:
まず第一に、隠し場所は「分岐ワークフロー」の外にありません。なぜなら、隠し場所は隠し場所にすぎないからです。
(多くの人々の怒りを被るリスクがある)
ライナスは言った:
「git stash」を使用すると、複数の異なる隠されたものを持つこともできますが、それらは互いにキューに入れられません-それらは、ある時点で不便だったため、隠しておいたランダムな独立したパッチです。
@RibaldEddieが言おうとしていることgit stash
は、機能ブランチワークフローで使用できるということです。これは事実です。git stash
問題はそれを使用することではありません。これは、マスターへのコミットと使用の組み合わせですgit stash
。これはアンチパターンです。
明確化 git rebase
@RibaldEddieのコメントより:
リベースはコピーペーストに似ており、さらに悪いことにコミットされた履歴を変更します。
(エンファシス鉱山)
ローカルのコミット履歴である限り、コミット履歴の変更は悪いことではありません。すでにプッシュしたコミットをリベースする場合、ブランチを使用している他の誰かを本質的に孤立させます。これは悪いです。
ここで、1日の間にいくつかのコミットを行ったとしましょう。一部のコミットは良好でした。いくつか...あまり良くない。git rebase
あなたのコミットを退治と一緒にコマンドがローカルのコミットの歴史をクリーンアップするための良い方法です。チームの共有ブランチのコミット履歴をクリーンに保つため、パブリックブランチへの1つのコミットにマージすると便利です。リベース後、再度テストする必要がありますが、テストに合格すると、いくつかのダーティなコミットの代わりに1つのクリーンコミットをプッシュできます。
クリーンなコミット履歴に関する別の興味深いLinuxカーネルスレッドがあります。
繰り返しますが、Linusから:
クリーンな履歴が必要ですが、それは本当に(a)クリーンと(b)履歴を意味します。
人々は自分のプライベートツリーをリベースできます(おそらくそうすべきです)(自分の仕事)。それはクリーンアップです。しかし、他の人々のコードは決してありません。それは「歴史を破壊する」
したがって、履歴部分はかなり簡単です。主要なルールは1つ、マイナーな説明は1つだけです。
他の人々の歴史を決して破壊してはいけません。他の人が行ったコミットをリベースしてはいけません。基本的に、サインオフが設定されていない場合、制限はありません。リベースすることはできません。なぜなら、それはあなたのものではないからです。
これは他の人々のコードではなく、他人の歴史に関するものであることに注意してください。彼らが電子メールで送られたパッチとしてあなたに物を送って、あなたが「git am -s」でそれを適用したなら、それは彼らのコードですが、それは
あなたの歴史です。
そのため、コミット自体がプライベートなものである限り、コードを記述していなくても、「git rebase」に夢中になります。
ルールの軽微な説明:ある公開サイトで履歴を公開すると、他の人がそれを使用している可能性があるため、明らかに個人の履歴ではなくなりました。
それで、マイナーな明確化は、それが「あなたのコミット」だけではなく、それがあなたのツリーに対してプライベートであることでもあり、それをまだ押し出してアナウンスしていないということです。
...
「クリーン」な部分はもう少し微妙ですが、最初のルールは非常に明白で簡単です。
自分の履歴を読みやすくする
一部の人々は、頭の中で物事を先に解決し、間違いを犯さないことでこれを行います。しかし、それは非常にまれであり、私たちの残りの部分では、問題に取り組んでいる間に「git rebase」などを使用します。
したがって、「git rebase」は間違っていません。しかし、それはあなた自身の非常にプライベートなgitツリーである場合にのみ正しいです。
がらくたをさらさないでください。
つまり、まだ「git rebase」フェーズにいる場合は、プッシュしないでください。準備ができていない場合は、パッチを送信するか、一般の人々に一般に伝えないプライベートgitツリーを(「パッチシリーズの置換」として)使用します。
(エンファシス鉱山)
結論
最終的に、OPにはこれを行う開発者がいます。
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
ここには2つの問題があります。
- 開発者はマスターにコミットしています。これをすぐにロックします。本当に、これが最大の問題です。
- 開発者は、常に使用している
git stash
とgit pull
、マスターに、彼らは機能ブランチを使用する必要があるとき。
git stash
特にプルの前に使用することには何の問題もありませんがgit stash
、Gitに優れたワークフローがある場合、この方法で使用することはアンチパターンです。
git stash
ニシンの使用。それは問題ではありません。マスターにコミットすることが問題です。