4

私が使用しているのは、実行するたびにブランチgit-flowが削除されることです。feature/abc

git flow feature abc finish

feature/abcブランチとマージした後、ブランチを削除しdevelopます。その後、developブランチをプッシュします。

git push origin develop

これで、リモートでfeature/abcブランチを表示できますが、ローカルでは表示できません。それで、それはそれがローカルリポジトリから削除され、その削除がリモートに運ばれなかったことを意味しますか?

私の理解では:

  • gitが配布されているため、リポジトリ全体がすべてのマシンに存在します。
  • したがって、ローカルリポジトリを変更して、リモートにプッシュするとします。
  • 次に、削除を含め、すべての変更をリモートにプッシュする必要があります。

対立:

  • プッシュ後、ローカルとリモートのgitリポジトリはどのように異なるのでしょうか。

=>私がコードの唯一の開発者であると仮定します。

アップデート

私の質問は、マージ後にローカルでブランチを削除したことです。次に、マージしたブランチをプッシュしましたが、なぜそれがリモートに反映されなかったのですか?なぜなら、GITはDVCSであり、プッシュ/プルで同一である必要があります。[私が唯一の開発者であることを考えると]

私もそれを作成するように頼みませんでした。ブランチに変更を加え、マージしてからブランチを削除し、更新された開発ブランチをプッシュしました。それで、それらのブランチの作成を自動的に検出するなら、なぜ削除しないのですか?

4

1 に答える 1

5

なぜなら、GITはDVCSであり、プッシュ/プルで同一である必要があります。

いいえ、それは本当ではありません。ネット内の各リポジトリにほぼ同じデータが含まれるように分散されていますが、多かれ少なかれしか含まれていません。プッシュアンドプルを使用する場合は、何をプッシュするかを明示的に指定します。

git push remote branchブランチポインタbranchをリモートリポジトリにプッシュするだけで、リモートリポジトリが構築するために必要なすべてのコミットを転送しますが、それ以上は転送しません。これは、ブランチが指すコミットのみとすべての親が実際にプッシュされ、リモートリポジトリがすでに持っている共通の親を見つけることを意味します(最悪の場合、これは特別なゼロコミット、つまり空の親です)。

同様git pull remote branchに、リモートブランチをremote/branchローカルに構築するために必要な変更のみをフェッチします。

実際にすべてのコミットを取得するには、を使用できgit fetch、すべてのローカルブランチをプッシュするにはを使用できますgit push --all。ただし、ここでも、リポジトリが持つすべてのものではなく、ブランチ(またはタグ)を構築するために必要なコミットのみをフェッチ/プッシュします。

これで、ブランチをリモートリポジトリにプッシュすると、実際にプッシュしたブランチのみが更新されるため、ローカルリモートを削除してでプッシュすると--all、ローカルブランチのみがプッシュされ、削除されたブランチは含まれません。そのため、ローカルGitは、ローカルで削除したブランチを認識しなくなり(マージされたため)、その情報をリモートリポジトリに自動的に提供できなくなります。ただし、リモートリポジトリにローカルにあるすべてのブランチを通知して、リモートが削除されたブランチを特定できるようにします。これを行うには、オプションを使用します--prune。ただし、これによりローカルに存在しないすべてのブランチが削除されるため、異なるブランチをプッシュするが他のブランチをプルしない複数のユーザーを操作する場合に問題が発生する可能性があることに注意してください(実際にはテストしていません)。

最善の方法は、ローカルで削除されたブランチを直接削除することです。

git push remote :branch
于 2012-06-21T08:56:36.320 に答える