4

gitを使い始めたとき、ワークフローはGitflowモデルに基づいていました:http://nvie.com/posts/a-successful-git-branching-model/。主なアイデアは、適切なブランチへのコミットを維持することだと思いました。たとえば、メインブランチには、開発ブランチからマージされたコミットのみが含まれるようになります...つまり、タグ...0.1。0.2。グラフィックの1.0。gitがどのように機能するか、またはこのワークフローがどのように動作するかを完全には理解していませんが、特にそのページのグラフィックは、すべての開発ブランチではなく、マスターブランチでのこれらのいくつかのコミットのみを示しているためです。

リポジトリをBitbucketにプッシュすると、開発ブランチで作業している間はすべてうまくいきましたが、開発が終了したときは、そしてマスターブランチをプッシュアップすると、Bitbucketのマスターブランチには開発ブランチで行ったすべてのコミットが含まれていることがわかりましたが、最後のコミット(マージしたコミット)のみが含まれると思いました。誰かがこれを理由に説明できますか、これが意図された動作であるかどうか、そうでない場合は、ワークフローを上記のモデルに沿って機能させるために何ができるかを説明できますか?Smartgitを使用しています。

4

3 に答える 3

3

ブランチモデルでは--no-ff、すべてのマージで指定する必要があるようです。空のマージでも簿記エントリを強制します。たとえば、グラフィックでは、修正プログラムから0.2にマージを実行します。これにより、マスターブランチにコミットされ、実際には実行されません。を使用して、任意のマージを実行しgit merge --no-ff hotfixesます。gitに対応していない管理要件のあるプロジェクトでは、それを行うのに適した方法です。 VonCは--no-ff、そのモデルの要件をどこかでスキップした場合に回答しました 。

モデルに従い、そのように動作することを期待していなかったpush場合:グラフィックの履歴を含むリポジトリで1.0の時点でマスターをチェックアウトし、リモートのマスターブランチにプッシュすると、プッシュが完了するとリモートはコミットM2、M4、M5、Y1-6、G1-4、R1、およびC1-3(色と垂直方向の順序に従ってコミットにラベルを付ける)があり、リモートマスターブランチはそれらすべてを参照します。

理解しておくべきことは、コミット履歴は重要ですが、参照名は重要ではなく、少なくとも「capital-I」は重要ではないということです。git push

指定された参照を完了するために必要なオブジェクトを送信しながら、ローカル参照を使用してリモート参照を更新します。

通常、リポジトリがプロジェクトの主要な開発の一部である場合は、いくつかの「中央」リポジトリの参照名を追跡しています。Gitのデフォルトのクローンは、それらのローカルリモート/オリジン/*ブランチを設定します。ただし、他の設定はまったく珍しいことではありません。あるプロジェクトのv2.1で作業しているリポジトリがある場合は、他のリポジトリのrelease-v2.1ブランチをリポジトリの「マスター」ブランチと見なすことができます。

履歴をプッシュせずにコミットの結果のみをプッシュする場合は、結果はあるが履歴がない新しいコミットを作成する必要があります。他のdvcは、さまざまな程度の嫌悪感を持ってこのように履歴を構築することを検討している人々によって構築されています。gitは、そのような選択肢をビジネスの1つとは見なしていません。それは、想像したいモデルを実装するツールを提供します(それは)。 git cherry-pick名前付きコミットを最初の親と比較し、その差分を現在のヘッドに適用して、チェリーピックされたコミットのメッセージを使用して、新しいコミットを作成します。バニラgit rebaseは、そのようなコミットのシーケンス全体を選択します。あなたが期待していたと思う行動は何ですかgit merge --squash; git commit行う:コミットの履歴にdiffを適用し、それらがどこから来たのかを忘れます。これを行うと、他の場所からのコミットがブランチの履歴に表示されなくなります。それは間違いなくあなたのグラフィックが伝えようとしているモデルではありません。

于 2013-03-24T18:25:24.903 に答える
2

developmentブランチをにマージするときにmaster、早送りマージを行った可能性があります。
とは対照的に、git merge --no-ffmanページ)「マージが早送りとして解決された場合でも、マージコミットを作成します」。

つまり、masterHEADは単にHEADに移動しdev、すべてのdevコミットを参照します。

「 gitがデフォルトで早送りマージを使用するのはなぜですか? 」を参照してください。

于 2013-03-24T13:59:55.633 に答える
1

次の手順に従ってください。たぶんあなたはあなた自身で答えを見つけるでしょう。

  • 現在、正しいブランチで作業していることを確認してください

    git branch -a //Shows you all the branches 
    git checkout {branch_name} //Make sure you checkout the correct branch
    
  • ログに適切なコミットがあることを確認してください

    git log --oneline -6 // Show last 6 commits on this branch
    
  • 他のブランチからのコミットが表示される場合は、そのブランチを現在のブランチにマージしたか、誤ってこのブランチでコミットした可能性があります。
于 2013-03-24T14:07:01.327 に答える