Bagaimana Anda berhenti melacak cabang jarak jauh di Git?

557

Bagaimana Anda berhenti melacak cabang jarak jauh di Git ?

Saya meminta untuk berhenti melacak karena dalam kasus konkret saya, saya ingin menghapus cabang lokal, tetapi tidak yang jauh. Menghapus yang lokal dan mendorong penghapusan ke jarak jauh akan menghapus cabang jarak jauh juga:

Bisakah saya lakukan git branch -d the_branch, dan itu tidak akan diperbanyak ketika saya nanti git push?

Apakah hanya akan menyebar jika saya menjalankan git push origin :the_branchnanti?

Jason Cohen
sumber

Jawaban:

709

Seperti disebutkan dalam Yoshua Wuyts ' jawabannya , menggunakan git branch:

git branch --unset-upstream

Pilihan lain:

Anda tidak harus menghapus cabang lokal Anda.

Hapus saja cabang lokal yang melacak cabang jarak jauh:

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

-r, --remotesmemberitahu git untuk menghapus cabang pelacak jarak jauh (yaitu, hapus set cabang untuk melacak cabang jarak jauh). Ini tidak akan menghapus cabang pada repo jarak jauh !

Lihat " Mengalami kesulitan memahami git-fetch "

tidak ada konsep cabang pelacakan lokal, hanya cabang pelacakan jarak jauh.
Begitu origin/masterjuga cabang pelacakan jarak jauh untuk masterdi originrepo

Seperti disebutkan dalam Dobermann Vandermeer 's jawaban , Anda juga harus mengatur ulang konfigurasi yang berhubungan dengan lokal cabang:

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

Hapus informasi hulu untuk <branchname>.
Jika tidak ada cabang yang ditentukan, default ke cabang saat ini.

(git 1.8+, Oktober 2012, commit b84869e oleh Carlos Martín Nieto ( carlosmn) )

Itu akan membuat push / pull sama sekali tidak disadari origin/<remote branch name>.

VONC
sumber
8
Cabang pelacakan jarak jauh diciptakan kembali setelah git fetch. Apakah mungkin untuk mengecualikan ini?
Matt R
1
@Matt: Saya percaya ini akan dilakukan dengan mengatur pengaturan remote.<name>.fetchkonfigurasi refspec, tetapi saya tidak yakin apakah Anda dapat mengecualikan cabang saat menentukan refspec.
VonC
Tampak seperti itu juga bagi saya; Saya bisa rebase cabang lokal saya dan setelah fast-forward koneksi yang jelas antara cabang-cabang menghilang.
willoller
7
@ruffin: ini sepenuhnya normal: git branch -d -r origin/<remote branch name>akan menghapus cabang pelacakan jarak jauh seperti yang dinyatakan secara lokal , di repo Anda. Itu tidak akan menghapus cabang pada repo jarak jauh itu sendiri (hanya git push :developmentakan melakukan itu). Jadi, ketika Anda mendorong lokal Anda development, dengan sejarah yang berbeda dari cabang pengembangan jarak jauh (pada repo jarak jauh), Anda masih akan mendapatkan non-fast-forwardperingatan.
VonC
1
@ Mars benar, tapi saya lebih suka melakukannya, saya merasa "bersih".
VonC
200

Untuk menghapus upstream untuk cabang saat ini lakukan:

$ git branch --unset-upstream

Ini tersedia untuk Git v.1.8.0 atau lebih baru. (Sumber: 1.7.9 ref , 1.8.0 ref )

sumber

Yoshua Wuyts
sumber
20
Seharusnya jawaban yang dipilih.
kaiser
9
Jika Anda tidak ingin menghapus cabang saat ini, cukup:git branch --unset-upstream [branchname]
Sonata
2
Sepertinya ini baru. Sedikit informasi lebih baik. Misalnya versi pengantar.
ManuelSchneid3r
Tentu saja, jangan ragu untuk menjawab ketika Anda mengetahuinya dan saya akan dengan senang hati memperbarui komentar
Yoshua Wuyts
Hmm, saya mendapatkan fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. setelah melakukan ini dan mencoba asal git tarik / master
information_interchange
106

Untuk menghapus hubungan antara menjalankan cabang lokal dan jauh:

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

Hapus cabang lokal secara opsional setelah itu jika Anda tidak membutuhkannya:

git branch -d <branch>

Ini tidak akan menghapus cabang jarak jauh.

Dobes Vandermeer
sumber
11
git branch -d <branch>yang tidak diperlukan untuk menghapus asosiasi.
Marco
1
Saya menggunakan JIRA. Ketika saya melakukan tarik lagi cabang muncul. Bagaimana saya bisa mencegahnya?
bubuk366
1
@ Mars Benar, tetapi jika Anda menggunakan git branch -vvAnda masih akan melihat cabang lama sampai Anda melakukannya git branch -d <branch>.
SeldomNeedy
@ powder366 Bergantung pada pengaturan Anda, git pullmungkin ambil semua cabang jarak jauh dan tambahkan kembali yang dianggapnya "muncul" pada jarak jauh. Anda dapat mengubah perilaku "tarik semua cabang" ini dengan melakukan git config [--global] push.default simpleatau git config [--global] push.default current. Lebih banyak di push.defaultsini .
SeldomNeedy
1
@EldomNeedy Saya pikir Anda mungkin kehilangan titik DVCS? Intinya adalah bahwa saya dapat memiliki cabang yang mulai melacak cabang hulu, tetapi saya melepaskannya untuk mengejar pendekatan yang tidak digunakan cabang hulu. Dalam hal ini, cabang tidak "tua" (karena saya masih mengembangkannya) atau "tidak digunakan" (karena saya menggunakannya). Ini adalah bagian besar dari desain DVCS .. Apakah itu masuk akal?
Marco
33

Cara paling sederhana adalah mengedit .git/config

Berikut ini contoh file

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

Hapus baris merge = refs/heads/test1di bagian test1cabang

Jacob Groundwater
sumber
3
+1 Saya tidak dapat mengatakan dengan pasti bahwa ini adalah metode termudah, tetapi tentu saja terbukti paling mudah untuk saya pahami (dan mudah-mudahan diingat)!
bijak
Solusi bagus +1. Ini sebenarnya tempat pelacakan terdaftar, mudah diubah, jelas apa fungsinya. Commandline .git/configjuga tersedia.
hakre
5
fyi, ini sama dengan solusi "git config --unset" oleh Dobes Vandermeer. "git config" mengedit file ini.
JZ
10

Anda dapat menghapus cabang pelacakan jarak jauh menggunakan

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

seperti yang disebutkan VonC di atas. Namun, jika Anda menyimpan salinan lokal cabang Anda, git push masih akan mencoba mendorong cabang itu (yang bisa memberi Anda kesalahan tidak-maju-cepat seperti halnya untuk ruffin ). Ini karena konfigurasi push.defaultdefault matchingberarti:

cocok - dorong semua cabang yang cocok. Semua cabang dengan nama yang sama di kedua ujungnya dianggap cocok. Ini standarnya.

(lihat http://git-scm.com/docs/git-config di bawah push.default)

Melihat ini mungkin bukan yang Anda inginkan ketika Anda menghapus cabang pelacakan jarak jauh, Anda dapat mengatur push.defaultke upstream(atau trackingjika Anda memiliki git <1.7.4.3)

hulu - mendorong cabang saat ini ke cabang hulu.

menggunakan

git config push.default upstream

dan git akan berhenti berusaha mendorong cabang yang telah Anda "hentikan pelacakannya."

Catatan: Solusi yang lebih sederhana adalah dengan hanya mengubah nama cabang lokal Anda menjadi sesuatu yang lain. Itu juga akan menghilangkan beberapa potensi kebingungan.

CletusW
sumber
3

Berikut adalah satu-liner untuk menghapus semua cabang pelacakan jarak jauh yang cocok dengan pola:

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

infomaniak
sumber
Jika hanya cabang pelacak jarak jauh yang tidak dilacak (dihapus), maka saya pikir ini adalah alternatif satu baris yang lebih pendek:git branch -r -D $(git branch -r | grep -v "master")
dma_k
1

Ini bukan jawaban untuk pertanyaan itu, tapi saya tidak tahu bagaimana mendapatkan pemformatan kode yang layak dalam komentar di atas ... jadi otomatis-turun-reputasi-terkutuk di sini adalah komentar saya.

Saya punya resep yang dikirimkan oleh @Dobes dalam entri mewah alias mewah di .gitconfig saya:

# 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"

Maka saya bisa lari

$ git bruntrack branchname
Qneill
sumber
1
+1. Nice alias, selain jawaban saya di atas .
VonC
-1

git branch --unset-upstream berhenti melacak semua cabang lokal, yang tidak diinginkan.

Hapus [branch "branch-name"]bagian dari .git/configfile yang diikuti oleh

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

bekerja yang terbaik untukku.

Bob
sumber
-1

Anda dapat menggunakan cara ini untuk menghapus cabang jarak jauh Anda

git remote remove <your remote branch name>
Hưng
sumber
1
Itu akan menghapus semua cabang pelacakan jarak jauh untuk jarak jauh itu: jika Anda memiliki lebih dari satu, itu bisa bermasalah.
VonC
-2

Cara termudah untuk melakukannya adalah dengan menghapus cabang dari jarak jauh dan kemudian menggunakan:

git fetch --prune (alias git fetch -p)

Mark Caudill
sumber
14
Saya bingung, OP tidak ingin menghapus cabang jarak jauh.
madth3
Adalah baik untuk membersihkan cabang jarak jauh yang dilacak dari repositori lokal Anda yang telah dihapus pada repositori telanjang jarak jauh.
Marek Podyma