Gitがコロン(:<branch>)を使用してリモートブランチを削除する理由


81

Gitが使用する理由

git push <remote> :<branch>

のように

git push origin :featureA

featureAリモートサーバーからブランチを削除するには?

コロンが削除フラグとして使用された理由に興味があります。

とはとても違いgit branch -d <localbranch>ます。

どうしてこんなことをしてみませんか

git branch -d --remote origin <branchname>

それとも、私が知らなかったコロン記号の背後にあるより深い意味がありますか?


3
リモートブランチを削除するために、よりきれいな構文がありますgit push origin --delete foobar
quetzalcoatl 2015年

回答:


91

それ:自体の意味ではなく、その前に存在するもの、または存在しないものです。

refspec形式は

<+><source>:<destination>

(オプション+非早送りの場合)

したがって、のようなことを行うときgit push origin :featureAは、空のソース参照を指定し、基本的に宛先を「空」にするか、削除します。

PS:refspecのornothingは:、何も何もプッシュしないという意味ではないことに注意してください。gitは「一致する」ブランチをプッシュします。ローカル側に存在するすべてのブランチについて、同じ名前のブランチがリモート側にすでに存在する場合、リモート側が更新されます。


5
リモートブランチgit push origin -d <branch>を削除およびgit push origin -D <branch>強制削除するためにGit> = 1.7.0が追加されました。
robsn 2017年

では、いつ:の前に何かを置きますか?
ITIA

ローカルブランチの名前がリモートブランチとは異なる場合は@ITIA。
listerreg

20

コロンは「削除フラグ」ではありません。そのノートGitのプッシュgitのプルの両方が彼らの最後の引数(複数可)としてゼロ以上refspecsを受け入れます。次に、refspecsについて読みます。コロンは、refspecでソースと宛先を区切ります。コマンドgit push origin :fooには空のソースがあり、基本的に「元のブランチfooに何もプッシュしない」、つまり「元のブランチfooを存在させない」と表示されます。


IMO、あなたの答えは次の理由で質問に答えません:履歴が分岐したブランチをプッシュしようとすると、ブランチを強制的にプッシュする必要があります。ただし、を使用してブランチを削除する場合はそうではありません:foo。空のブランチは既存のリモートブランチと履歴を共有しないため、私が見る限り、既存のリモートブランチを空のブランチで上書きすることはできません。あなたの答えに何か問題があると感じています。
Umang 2011

3
@Umang:afaik、これは概念的なことであり、「空のブランチをプッシュする」とは言いませんでした。「何も押さない」と言った。その前に「+」を付ける方が理にかなっているというあなたの評価に同意しませんが、これがまさにその仕組みです。私が投稿したrefspecsリンクの最後のセクションを参照して、作成者を信頼するかどうかを判断してください。
ライアンスチュワート

今はもう少しよく理解できたと思います。ありがとう!
Umang 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.