16

開発中、私はしばしば「中間」コミットをコミットしてプッシュする必要があります。つまり、コンパイルできないコードや何かを変更している途中のコミットなどです。そのようなコミットはしたくないのですが、これは作業を簡単に続行するために必要です。オフィスから自宅まで、時には他の開発者が彼らの仕事を始めるための基盤を手に入れるために。

私はその問題の解決策を見つけたと思いました:

  1. 別の「dev」ブランチを作成し、すべての中間コミットを行います。

  2. コードが良好な状態になったら、マスターにマージします。したがって、マスターには「中間」コミットは含まれず、「通常」コミットのみが含まれます。

  3. すべての中間コミットで「dev」ブランチを削除します。

しかし、これは機能しません。マージを行うと、マージコミットがマスターに含まれるだけでなく、「dev」ブランチからのすべての「中間」コミットも含まれます。したがって、「dev」ブランチを削除しても何も得られず、その「中間」コミットはそのまま残ります。

したがって、質問は次のとおりです。マスターが自身のコミット+マージコミットのみを含み、2番目のブランチからのコミットを含まない方法でマージを行うことは可能ですか?それが不可能な場合は、私の目標を達成する方法を教えていただけますか?中間結果を一時的に保存するだけでなく、後でシームレスに削除する機能もありますか?

4

5 に答える 5

24

「dev」ブランチをマスターにマージするときは、試してください

git checkout master
git merge --squash dev
git commit -m "Add new feature."

この--squashオプションは、すべての中間変更を 1 つの大きな変更に押しつぶします。

git rebase --interactiveより限定的な制御が必要な場合にも使用できます (たとえば、コミットの並べ替えや複数の小さなスカッシュの実行など)。この回答は、 と の違いを説明していgit merge --squashますgit rebase --interactive

于 2013-02-12T02:28:41.510 に答える
4

あなたが望むのは「スカッシュ」マージです:

git checkout master
git merge --squash dev
git commit -m 'current stable work from dev branch'

これが行うことは、作業ツリーに通常のマージと同じ状態を作成することですが、すべての中間コミットを祖先としてマージ コミットを作成するわけではありません。master中間コミットは、ブランチの履歴の一部にはなりません。git mergeマンページのこのオプションのドキュメントには、次のように記載されています。

実際のマージが発生したかのように (マージ情報を除いて) 作業ツリーとインデックスの状態を生成しますが、実際にはコミットを作成したり、 を移動したり、次の git commit コマンドでマージ コミットを作成するようにHEAD記録したりしません。$GIT_DIR/MERGE_HEADこれにより、現在のブランチの上に単一のコミットを作成できます。その効果は、別のブランチをマージするのと同じです (タコの場合はそれ以上)。

于 2013-02-12T02:28:06.880 に答える
0

RC (リリース候補) と呼ばれる別のブランチを追加します。このブランチには、完了したフィーチャー ブランチのマージのみが含まれます。dev を維持して未完成のブランチを一緒に試すことができます。マージされた完成した機能のみを含むマスター リリース候補にのみ統合します。

于 2013-02-12T03:47:23.330 に答える
-1

マージ中にコミットを削除することはできません。中間のコミットをつぶすことはできますが、これは悪い考えであり、公開するときにうまくいかない可能性があります。マージを行わずにそれらをマスター ブランチに押しつぶして (git merge --squashその後にgit commit)、マスター ブランチを dev ブランチにマージすることもできます。

于 2013-02-12T02:28:03.993 に答える