Gitでリモートブランチの追跡を停止するにはどうすればよいですか?


557

Gitでリモートブランチの追跡を停止するにはどうすればよいですか?

私の具体的なケースでは、ローカルブランチは削除したいがリモートブランチは削除したくないので、追跡を停止するように求めています。ローカルのブランチを削除し、削除をリモートにプッシュすると、リモートのブランチも削除されます。

私はただ行うことができますがgit branch -d the_branch、それは後で伝播されませんgit pushか?

git push origin :the_branch後で実行する場合にのみ伝播しますか?

回答:


709

Yoshua Wuyts回答で述べたように、次を使用しgit branchます:

git branch --unset-upstream

その他のオプション:

ローカルブランチを削除する必要はありません。

リモートブランチを追跡しているローカルブランチを削除するだけです。

git branch -d -r origin/<remote branch name>

-r, --remotesリモート追跡ブランチを削除するようにgitに指示します(つまり、リモートブランチを追跡するために設定されたブランチを削除します)。これはリモートリポジトリのブランチを削除しません

「を参照してください。つらい時理解のgit-フェッチを持ちます

このようなローカル追跡ブランチの概念はなく、リモート追跡ブランチのみです。
だから、origin/masterリモート追跡ブランチがあるためmasteroriginレポ

Dobes Vandermeer回答で述べたように、ローカルブランチに関連付けられている構成をリセットする必要もあります。

git config --unset branch.<branch>.remote
git config --unset branch.<branch>.merge

のアップストリーム情報を削除し<branchname>ます。
ブランチが指定されていない場合は、デフォルトで現在のブランチになります。

(git 1.8 +、2012年10月、カルロスマルティンニエトによるコミットb84869e carlosmn

これにより、プッシュ/プルが完全に認識されなくなりorigin/<remote branch name>ます。


8
リモートトラッキングブランチは、git fetchの後に再作成されます。これらを除外することは可能ですか?
マットR

1
@マット:これはremote.<name>.fetchrefspec構成設定を設定することによって行われると思いますが、refspecを指定するときにブランチを除外できるかどうかはわかりません。
VonC、2010

私にもそう見えた。しかし、ローカルブランチをリベースすることができ、早送りの後、ブランチ間の明白な接続が消えました。
willoller 2010

7
@ruffin:これは完全に正常です。リポジトリでローカルgit branch -d -r origin/<remote branch name>宣言れているリモート追跡ブランチを削除します。リモートリポジトリ自体のブランチ削除されません(削除できるのはだけgit push :developmentです)。したがってdevelopment、リモート開発ブランチ(リモートリポジトリ上の)とは異なる履歴を持つローカルをプッシュする場合でも、non-fast-forward警告が表示されます。
VonC、2012年

1
@マルコは本当ですが、とにかくそれをするのが好きです。
VonC 2013年

200

現在のブランチの上流を削除するには、次のようにします。

$ git branch --unset-upstream

これはGit v.1.8.0以降で使用できます。(出典:1.7.9参照1.8.0参照

ソース


20
選ばれた答えでなければなりませんでした。
カイザー

9
あなたは現在のブランチを削除したくない場合は、単に:git branch --unset-upstream [branchname]
ソナタ

2
これは新しいようです。もう少し情報がいいでしょう。例えば紹介のバージョン。
ManuelSchneid3r 2017年

確かにそうです。見つけたら返信してください。喜んでコメントを更新します
Yoshua Wuyts

うーん、私はfatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. これを行ってgit pull origin / masterを試しました
information_interchange

106

ローカルブランチとリモートブランチ間の関連付けを削除するには、次のコマンドを実行します。

git config --unset branch.<local-branch-name>.remote
git config --unset branch.<local-branch-name>.merge

ローカルブランチが不要な場合は、必要に応じて後で削除します。

git branch -d <branch>

これはリモートブランチを削除しません。


11
git branch -d <branch>関連付けを削除する必要はありません
マルコ

1
私はJIRAを使用しています。もう一度引くと、枝が現れます。どうすればそれを防ぐことができますか?
powder366

1
@Marco正解ですが、使用git branch -vvする場合は、使用するまで古いブランチが表示されますgit branch -d <branch>
SeldomNeedy 2016

@ powder366設定に応じて、すべてのリモートブランチをgit pull取得しリモートに「表示された」と見なされたブランチを再度追加します。あなたは実行して、この「すべての枝を引く」動作を変更することができますgit config [--global] push.default simplegit config [--global] push.default current詳細はpush.defaultこちら
SeldomNeedy 2016

1
@SeldomNeedy DVCSのポイントを見逃していると思いますか?ポイントは、上流のブランチを追跡することから始まるブランチを持つことができるが、上流のブランチが使用していないアプローチを追求するために分離することです。その場合、ブランチは「古い」(まだ開発中であるため)でも「使用されていない」(使用しているため)でもありません。これはDVCSの設計の大部分です。それは理にかなっていますか?
マルコ

33

最も簡単な方法は編集することです .git/config

ここにファイルの例があります

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
[remote "origin"]
        url = git@example.com:repo-name
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "test1"]
        remote = origin
        merge = refs/heads/test1
[branch "master"]
        remote = origin
        merge = refs/heads/master

分岐セクションの行merge = refs/heads/test1を削除しtest1ます


3
+1これが最も簡単な方法であると断言することはできませんが、確かに私が理解するのが(そして願わくば覚えておくのが)最も簡単であることを証明しています!
セージ

素敵なソリューション+1。これは実際には追跡が登録されている場所であり、変更が簡単で、追跡内容を明確にしています。コマンド.git/configラインも利用可能です。
hakre 2013

5
fyi、これはDobes Vandermeerによる "git config --unset"ソリューションと同じです。「git config」はこのファイルを編集します。
JZ

10

を使用してリモート追跡ブランチを削除できます。

git branch -d -r origin/<remote branch name>

VonCが前述したように。ただし、ブランチのローカルコピーを保持している場合git push でもはそのブランチをプッシュしようとします(これにより、ruffinの場合とは異なり、早送りエラーが発生する可能性があります)。これは、設定のpush.defaultデフォルトmatchingが次の意味であるためです。

matching-すべての一致するブランチをプッシュします。両端に同じ名前を持つすべてのブランチは、一致していると見なされます。これがデフォルトです。

(以下のhttp://git-scm.com/docs/git-configを参照してくださいpush.default

これはあなたがリモート追跡ブランチを削除するとき、あなたが設定することができます望んではおそらくないと見push.defaultupstream(あるいはtrackingあなたがgitの<1.7.4.3を持っている場合)

上流-現在のブランチを上流のブランチにプッシュします。

を使用して

git config push.default upstream

gitは、「追跡を停止」したブランチをプッシュしようとするのをやめます。

注:より簡単な解決策は、ローカルブランチの名前を別の名前に変更することです。これにより、混乱の可能性もいくつか排除されます。


3

以下は、パターンに一致するすべてのリモート追跡ブランチを削除するためのワンライナーです。

git branch -rd $(git branch -a | grep '{pattern}' | cut -d'/' -f2-10 | xargs)


唯一のリモート追跡ブランチは人跡未踏(削除)する場合は、その後、私は、これは短い1行の代替だと思う:git branch -r -D $(git branch -r | grep -v "master")
dma_k

1

これは質問への回答ではありませんが、上記のコメントで適切なコードのフォーマットを取得する方法を理解できませんでした。

私の.gitconfigの派手なshmancy [alias]エントリに@Dobesによってサブミットされたレシピがあります。

# to untrack a local branch when I can't remember 'git config --unset'
cbr = "!f(){ git symbolic-ref -q HEAD 2>/dev/null | sed -e 's|refs/heads/||'; }; f"
bruntrack = "!f(){ br=${1:-`git cbr`};  \
    rm=`git config --get branch.$br.remote`; \
    tr=`git config --get branch.$br.merge`; \
    [ $rm:$tr = : ] && echo \"# untrack: not a tracking branch: $br\" && return 1; \
    git config --unset branch.$br.remote; git config --unset branch.$br.merge; \
    echo \"# untrack: branch $br no longer tracking $rm:$tr\"; return 0; }; f"

その後、私はただ走ることができます

$ git bruntrack branchname

1
+1。上記の私の回答に加えて素敵なエイリアス。
VonC、2014年

-1

git branch --unset-upstream すべてのローカルブランチの追跡を停止しますが、これは望ましくありません。

ファイル[branch "branch-name"]からセクションを削除してから、.git/config

git branch -D 'branch-name' && git branch -D -r 'origin/branch-name'

私にとって最善の方法です。


-1

この方法を使用してリモートブランチを削除できます

git remote remove <your remote branch name>

1
これにより、そのリモートのすべてのリモート追跡ブランチが削除されます。複数ある場合、問題が生じる可能性があります。
VonC

-2

これを行う最も簡単な方法は、ブランチをリモートで削除してから使用することです。

git fetch --prune(別名git fetch -p)


14
私は混乱しています。OPはリモートブランチを削除したくありませんでした。
madth3 2013年

リモートベアリポジトリで削除されたローカルリポジトリから追跡されたリモートブランチをクリーンアップすることをお勧めします。
Marek Podyma 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.