Git nói ref từ xa không tồn tại khi tôi xóa nhánh từ xa


130

Tôi đã chạy git branch -a

* master
  remotes/origin/test
  remotes/origin/master

Tôi muốn xóa chi nhánh từ xa của tôi

Tôi đã thử

git push origin --delete remotes/origin/test

tôi đã nhận

lỗi: không thể xóa 'điều khiển từ xa / nguồn gốc / kiểm tra': ref từ xa không tồn tại

Làm thế nào nó không tồn tại?

Tôi đã làm một git branch -a, và tôi thấy nó được liệt kê.

Tôi có bỏ lỡ điều gì không?


1
git branch -asẽ liệt kê các chi nhánh tại địa phương của bạn chứ không phải từ xa của bạn. Đúng?

Tôi nghĩ tất cả trong số họ. Tôi không chắc.
cyber8200

2
Nó sẽ hiển thị các chi nhánh từ xa trong địa phương của bạn. Nó sẽ không liệt kê tất cả các chi nhánh từ xa.

1
@peterh Có vẻ như tôi thực sự hỏi "tại sao tôi không thể xóa một chi nhánh từ xa" (có thể khi chi nhánh đã bị xóa khỏi điều khiển từ xa nhưng ref từ xa vẫn hiện diện cục bộ) và do đó, không phải là một bản sao nhưng có thể làm với một tiêu đề rõ ràng hơn
Andrew Spencer

1
Tôi đã thực hiện một chỉnh sửa cho tiêu đề, hy vọng điều này gần với ý định của câu hỏi hơn
Andrew Spencer

Câu trả lời:


259

Lệnh git branch -ahiển thị các nhánh từ xa tồn tại trong kho lưu trữ cục bộ của bạn . Điều này nghe có vẻ hơi khó hiểu nhưng để hiểu nó, bạn phải hiểu rằng có một sự khác biệt giữa một nhánh từ xa và một nhánh tồn tại trong một kho lưu trữ từ xa. Các nhánh từ xa là các nhánh cục bộ ánh xạ tới các nhánh của kho lưu trữ từ xa. Vì vậy, tập hợp các nhánh từ xa đại diện cho trạng thái của kho lưu trữ từ xa.

Cách thông thường để cập nhật danh sách các chi nhánh từ xa là sử dụng git fetch. Điều này tự động nhận được một danh sách các nhánh được cập nhật từ xa và thiết lập các nhánh từ xa trong kho lưu trữ cục bộ, cũng tìm nạp bất kỳ đối tượng cam kết nào bạn có thể thiếu.

Tuy nhiên, theo mặc định, git fetchkhông loại bỏ các nhánh từ xa không còn có nhánh đối tác trên điều khiển từ xa. Để làm điều đó, bạn cần phải cắt tỉa danh sách các nhánh từ xa:

git fetch --prune

Điều này sẽ tự động thoát khỏi các nhánh từ xa không còn tồn tại trên điều khiển từ xa. Sau đó, git branch -rsẽ hiển thị cho bạn một danh sách cập nhật các nhánh thực sự tồn tại trên điều khiển từ xa: Và những nhánh bạn có thể xóa bằng cách sử dụng git push.

Điều đó đang được nói, để sử dụng git push --delete, bạn cần chỉ định tên của chi nhánh trên kho lưu trữ từ xa; không phải tên của chi nhánh từ xa của bạn. Vì vậy, để xóa chi nhánh test(được đại diện bởi chi nhánh từ xa của bạn origin/test), bạn sẽ sử dụng git push origin --delete test.


Cũng git branch -r | grep "origin"sẽ giúp với các dự án lớn sử dụng ngã ba
Seraf

Vì vậy, có 2 lý do để nhận thông báo này từ git: hoặc chi nhánh đã bị xóa trên máy chủ hoặc bạn đặt sai tên của chi nhánh với remotes/origin/. Hoặc cả hai.
Andrew Spencer

136

Ý nghĩa của remotes/origin/testviệc bạn có một nhánh được gọi testtrong máy chủ từ xa origin. Vì vậy, lệnh sẽ là

git push origin --delete test

25

Có một phím tắt để xóa chi nhánh trong nguồn gốc:

git push origin :<branch_name>

Điều này cũng giống như làm git push origin --delete <branch_name>


13
  1. lấy danh sách các chi nhánh từ xa
git fetch # synchronize with the server
git branch --remote # list remote branches
  1. bạn sẽ nhận được một danh sách các chi nhánh từ xa:
origin/HEAD -> origin/master
origin/develop
origin/master
origin/deleteme
  1. Bây giờ, chúng ta có thể xóa chi nhánh:
git push origin --delete deleteme


4

Cho rằng nhánh từ xa là điều khiển từ xa / nguồn gốc / kiểm tra, bạn có thể sử dụng hai cách:

git push origin --delete test

git branch -D -r origin/test

3

Tôi đã làm theo giải pháp bằng cách chọc với một điều chỉnh nhỏ cuối cùng. Các bước của tôi theo sau
- git fetch --prune;
- git branch -ain sau đây
    master
    branch
    remotes/origin/HEAD -> origin/master
    remotes/origin/master
    remotes/origin/branch(chi nhánh từ xa để loại bỏ)
- git push origin --delete branch.
Ở đây, nhánh để loại bỏ không được đặt tên như remotes/origin/branchnhưng đơn giản branch. Và chi nhánh được gỡ bỏ.


+1 cho nhận xét lại: tên chi nhánh, tôi đã cố xóa origin/branchkhi cần branch.
ken

1

git branch -a sẽ liệt kê các chi nhánh tại địa phương của bạn chứ không phải các chi nhánh trong điều khiển từ xa của bạn.

Và lỗi error: unable to delete 'remotes/origin/test': remote ref does not existcó nghĩa là bạn không có một chi nhánh trong tên đó trong điều khiển từ xa nhưng chi nhánh tồn tại trong địa phương của bạn.


Điều này rất hữu ích. nó đã giải quyết vấn đề xóa của tôi. tôi tự hỏi tại sao 'git push --delete origin / test' không hoạt động, trong khi "git push --delete test" hoạt động
user10293779

1

Một lớp lót tiện dụng để xóa các nhánh khác ngoài 'master' khỏi nguồn gốc:

git branch --remotes | grep -v 'origin/master' | sed "s/origin\///" | xargs -i{foo} git push origin --delete {foo}

Hãy chắc chắn rằng bạn hiểu ý nghĩa của việc chạy này trước khi làm như vậy!


cảm ơn vì mã này đây là mã git duy nhất tôi đã thử nghiệm để xóa tất cả các nhánh từ xa trừ master.
Alvin

1

Đối với tôi, nó hoạt động $ ▶ git chi nhánh -D -r origin / mybranch

Chi tiết

$ ▶ chi nhánh git -a | grep mybranch từ xa / nguồn gốc / mybranch

$ ▶ chi nhánh git -r | grep mybranch nguồn gốc / mybranch

$ ▶ chi nhánh git phát triển * tính năng / triển khai trước

$ ▶ git push origin --delete mybranch error: không thể xóa 'mybranch': ref không tồn tại lỗi: không thể đẩy một số ref đến 'git@10.102.100.38: config / myrepo.git'

$ ▶ chi nhánh git -D -r origin / mybranch Đã xóa nguồn gốc chi nhánh từ xa / mybranch (là 62c7421).

$ ▶ chi nhánh git -a | grep mybranch

$ ▶ chi nhánh git -r | grep mybranch


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.