Làm thế nào để bạn ngừng theo dõi một chi nhánh từ xa trong Git?


557

Làm thế nào để bạn ngừng theo dõi một chi nhánh từ xa trong Git ?

Tôi đang yêu cầu dừng theo dõi vì trong trường hợp cụ thể của tôi, tôi muốn xóa chi nhánh địa phương, nhưng không phải là chi nhánh từ xa. Xóa một cục bộ và đẩy xóa vào điều khiển từ xa cũng sẽ xóa chi nhánh từ xa:

Tôi có thể làm được không git branch -d the_branch, và nó sẽ không được tuyên truyền khi tôi về sau git push?

Nó sẽ chỉ tuyên truyền nếu tôi chạy git push origin :the_branchsau này?

Câu trả lời:


709

Như đã đề cập trong câu trả lời của Yoshua Wuyts , sử dụng :git branch

git branch --unset-upstream

Sự lựa chọn khác:

Bạn không phải xóa chi nhánh địa phương của bạn.

Chỉ cần xóa chi nhánh địa phương đang theo dõi chi nhánh từ xa:

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

-r, --remotesyêu cầu git xóa nhánh theo dõi từ xa (nghĩa là xóa nhánh được đặt để theo dõi nhánh từ xa). Điều này sẽ không xóa chi nhánh trên repo từ xa !

Xem " Có một thời gian khó hiểu git-fetch "

không có khái niệm nào về các nhánh theo dõi cục bộ, chỉ có các nhánh theo dõi từ xa.
Vì vậy, origin/mastermột chi nhánh theo dõi từ xa mastertrong originrepo

Như đã đề cập trong câu trả lời của Dobes Vandermeer , bạn cũng cần đặt lại cấu hình được liên kết với nhánh cục bộ :

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

Xóa thông tin ngược dòng cho <branchname>.
Nếu không có nhánh nào được chỉ định, nó sẽ mặc định là nhánh hiện tại.

(git 1.8+, tháng 10 năm 2012, cam kết b84869e của Carlos Martín Nieto ( carlosmn) )

Điều đó sẽ làm cho bất kỳ đẩy / kéo hoàn toàn không biết origin/<remote branch name>.


8
Nhánh theo dõi từ xa được tạo lại sau khi git fetch. Có thể loại trừ những điều này?
Matt R

1
@Matt: Tôi tin rằng điều này sẽ được thực hiện bằng cách đặt cài đặt remote.<name>.fetchcấu hình refspec, nhưng tôi không chắc liệu bạn có thể loại trừ một nhánh khi chỉ định một refspec hay không.
VonC

Nó cũng xuất hiện theo cách đó với tôi; Tôi đã có thể khởi động lại chi nhánh địa phương của mình và sau khi chuyển tiếp nhanh, kết nối rõ ràng giữa các chi nhánh biến mất.
Willoller

7
@ruffin: điều này là hoàn toàn bình thường: git branch -d -r origin/<remote branch name>sẽ xóa một nhánh theo dõi từ xa như được khai báo cục bộ , trong repo của bạn. Nó sẽ không xóa chi nhánh trên repo từ xa (chỉ có một git push :developmentđiều sẽ làm điều đó). Vì vậy, khi bạn đang đẩy cục bộ của mình development, với một lịch sử khác với nhánh phát triển từ xa (trên repo từ xa), bạn vẫn sẽ nhận được non-fast-forwardcảnh báo.
VonC

1
@Marco đúng, nhưng dù sao tôi cũng thích làm điều đó hơn, tôi thấy nó "sạch" hơn.
VonC

200

Để loại bỏ ngược dòng cho nhánh hiện tại, hãy làm:

$ git branch --unset-upstream

Điều này có sẵn cho Git v.1.8.0 hoặc mới hơn. (Nguồn: 1.7.9 ref , 1.8.0 ref )

nguồn


20
Đáng lẽ phải là câu trả lời được chọn.
kaiser

9
Nếu bạn không muốn xóa chi nhánh hiện tại, chỉ cần:git branch --unset-upstream [branchname]
Sonata

2
Hình như đây là mới. Một chút thông tin sẽ tốt đẹp. Ví dụ phiên bản giới thiệu.
ManuelSchneid3r

Chắc chắn là như vậy, vui lòng trả lời khi bạn phát hiện ra và tôi sẽ vui vẻ cập nhật nhận xét
Yoshua Wuyts

Hmm, tôi nhận được fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. sau khi làm điều này và thử một nguồn gốc git pull / master
information_interchange

106

Để xóa liên kết giữa nhánh chạy cục bộ và từ xa:

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

Tùy chọn xóa chi nhánh địa phương sau đó nếu bạn không cần nó:

git branch -d <branch>

Điều này sẽ không xóa chi nhánh từ xa.


11
git branch -d <branch>không cần thiết để loại bỏ các hiệp hội.
Marco

1
Tôi đang sử dụng JIRA. Khi tôi kéo lại, chi nhánh xuất hiện. Làm thế nào tôi có thể ngăn chặn điều đó?
bột366

1
@Marco Đúng, nhưng nếu bạn sử dụng git branch -vvbạn vẫn sẽ thấy các nhánh cũ cho đến khi bạn làm git branch -d <branch>.
SeldomNeedy

@ Powder366 Tùy thuộc vào cài đặt của bạn, git pullcó thể lấy tất cả các chi nhánh từ xa và thêm lại bất kỳ chi nhánh nào mà nó cho là đã "xuất hiện" trên điều khiển từ xa. Bạn có thể thay đổi hành vi "kéo tất cả các chi nhánh" này bằng cách thực hiện git config [--global] push.default simplehoặc git config [--global] push.default current. Thêm vào push.defaultđây .
SeldomNeedy

1
@SeldomNeedy Tôi nghĩ bạn có thể đang thiếu điểm DVCS? Vấn đề là tôi có thể có một nhánh bắt đầu theo dõi một nhánh ngược dòng, nhưng tôi tách ra để theo đuổi một cách tiếp cận mà nhánh ngược dòng không sử dụng. Trong trường hợp đó, chi nhánh không "cũ" (vì tôi vẫn đang phát triển trên đó) cũng không "không sử dụng" (vì tôi đang sử dụng nó). Đây là một phần lớn trong thiết kế của DVCS .. Điều đó có ý nghĩa không?
Marco

33

Cách đơn giản nhất là chỉnh sửa .git/config

Đây là một tập tin ví dụ

[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

Xóa dòng merge = refs/heads/test1trong phần test1chi nhánh


3
+1 Tôi không thể nói dứt khoát rằng đây là phương pháp dễ nhất, nhưng chắc chắn nó chứng minh là dễ hiểu nhất đối với tôi (và hy vọng sẽ nhớ được)!
hiền nhân

Giải pháp đẹp +1. Đây thực sự là nơi đăng ký theo dõi, dễ dàng thay đổi, rõ ràng những gì nó làm. Dòng lệnh .git/configcó sẵn, quá.
hakre

5
fyi, đây giống như giải pháp "git config --unset" của Dobes Vandermeer. "git config" chỉnh sửa tập tin này.
JZ

10

Bạn có thể xóa chi nhánh theo dõi từ xa bằng cách sử dụng

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

như VonC đã đề cập ở trên. Tuy nhiên, nếu bạn giữ bản sao chi nhánh địa phương của mình, git push vẫn sẽ cố gắng đẩy chi nhánh đó (điều này có thể gây ra lỗi không chuyển tiếp nhanh như đã làm cho ruffin ). Điều này là do cấu hình push.defaultmặc định matchingcó nghĩa là:

khớp - đẩy tất cả các nhánh khớp. Tất cả các chi nhánh có cùng tên ở cả hai đầu được coi là phù hợp. Đây là mặc định.

(xem http://git-scm.com/docs/git-config bên dưới push.default)

Xem như đây có lẽ không phải là điều bạn muốn khi bạn xóa nhánh theo dõi từ xa, bạn có thể đặt push.defaultthành upstream(hoặc trackingnếu bạn có git <1.7.4.3)

ngược dòng - đẩy nhánh hiện tại lên nhánh ngược dòng của nó.

sử dụng

git config push.default upstream

và git sẽ ngừng cố gắng đẩy các nhánh mà bạn đã "ngừng theo dõi".

Lưu ý: Giải pháp đơn giản hơn là chỉ đổi tên chi nhánh địa phương của bạn thành một thứ khác. Điều đó cũng sẽ loại bỏ một số tiềm năng cho sự nhầm lẫn.


3

Đây là một lớp lót để loại bỏ tất cả các nhánh theo dõi từ xa khớp với một mẫu:

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


Nếu chỉ các nhánh theo dõi từ xa không bị theo dõi (bị xóa), thì tôi nghĩ đây là cách thay thế một dòng ngắn hơn:git branch -r -D $(git branch -r | grep -v "master")
dma_k

1

Đây không phải là một câu trả lời cho câu hỏi, nhưng tôi không thể tìm ra làm thế nào để có được định dạng mã đàng hoàng trong một nhận xét ở trên ... vì vậy, tự động xuống danh tiếng bị nguyền rủa ở đây là nhận xét của tôi.

Tôi có công thức được gửi bởi @Dobes trong mục nhập shmancy [bí danh] trong .gitconfig của tôi:

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

Sau đó tôi có thể chạy

$ git bruntrack branchname

1
+1. Bí danh tốt đẹp, ngoài câu trả lời của tôi ở trên .
VonC

-1

git branch --unset-upstream dừng theo dõi tất cả các chi nhánh địa phương, đó là điều không mong muốn.

Xóa [branch "branch-name"]phần khỏi .git/configtệp theo sau

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

làm việc tốt nhất cho tôi


-1

Bạn có thể sử dụng cách này để loại bỏ chi nhánh từ xa của bạn

git remote remove <your remote branch name>

1
Điều đó sẽ loại bỏ tất cả các nhánh theo dõi từ xa cho điều khiển từ xa đó: il bạn có nhiều hơn một, điều đó có thể có vấn đề.
VonC

-2

Cách dễ nhất để làm điều này là xóa chi nhánh từ xa và sau đó sử dụng:

git fetch --prune (còn gọi là git fetch -p)


14
Tôi bối rối, OP không muốn xóa chi nhánh từ xa.
madth3

Nó là tốt để làm sạch các chi nhánh từ xa được theo dõi từ kho lưu trữ cục bộ của bạn đã bị xóa trên kho lưu trữ từ xa.
Marek Podyma
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.