Tại sao Git sử dụng dấu hai chấm (: <branch>) để xóa nhánh từ xa


81

Tại sao Git sử dụng

git push <remote> :<branch>

như trong

git push origin :featureA

để xóa chi nhánh featureAkhỏi máy chủ từ xa?

Tôi quan tâm đến lý do tại sao dấu hai chấm được sử dụng làm cờ xóa.

Nó rất khác với git branch -d <localbranch>.

Tại sao chúng ta không làm điều gì đó như

git branch -d --remote origin <branchname>

hoặc có một ý nghĩa sâu xa hơn đằng sau biểu tượng dấu hai chấm mà tôi không biết?


3
Để xóa các chi nhánh từ xa, bây giờ có một cú pháp đẹpgit push origin --delete foobar
Quetzalcoatl

Câu trả lời:


91

Nó không phải là ý nghĩa của :mỗi cái, mà là cái đang hiện hữu, hay đúng hơn là không có trước nó.

Định dạng refspec là

<+><source>:<destination>

(tùy chọn + cho chuyển tiếp không nhanh)

Vì vậy, khi bạn làm điều gì đó như git push origin :featureA, bạn đang chỉ định một ref nguồn trống và về cơ bản làm cho đích "trống" hoặc xóa nó.

Tái bút: Lưu ý rằng refspec của :hoặc không có gì không có nghĩa là không đẩy gì thành không có gì. Nó làm cho git để đẩy các nhánh "khớp": đối với mọi nhánh tồn tại ở phía cục bộ, phía từ xa được cập nhật nếu một nhánh cùng tên đã tồn tại ở phía từ xa.


4
Git> = 1.7.0 được thêm vào git push origin -d <branch>để xóa và git push origin -D <branch>buộc xóa một nhánh từ xa.
cướp

Vì vậy, khi nào bạn sẽ đặt một cái gì đó trước:?
ITIA

@ITIA khi chi nhánh cục bộ của bạn có tên khác với tên chi nhánh ở xa.
listerreg

20

Dấu hai chấm không phải là "cờ xóa". Lưu ý rằng git pushgit pull đều chấp nhận không hoặc nhiều refspec làm (các) đối số cuối cùng của chúng. Bây giờ hãy đọc về refspec . Dấu hai chấm ngăn cách nguồn với đích trong một refspec. Lệnh git push origin :foocó một nguồn trống và về cơ bản nói rằng " không đẩy đến chi nhánh foo gốc", hoặc nói cách khác, "làm cho chi nhánh foo trên nguồn gốc không tồn tại".


IMO, câu trả lời của bạn không trả lời câu hỏi vì lý do sau: nếu tôi cố gắng đẩy một nhánh mà lịch sử của nó đã khác biệt, tôi cần phải đẩy nhánh đó. Tuy nhiên, đây không phải là trường hợp khi xóa một nhánh bằng cách sử dụng :foo. Một nhánh trống không chia sẻ lịch sử với một nhánh từ xa hiện có và vì vậy nó không thể, theo cách tôi thấy, ghi đè lên một nhánh từ xa hiện có bằng một nhánh trống. Có gì đó không ổn với câu trả lời của bạn.
Umang

3
@Umang: afaik, đó chỉ là khái niệm thôi, và tôi không nói "đẩy một nhánh trống". Tôi nói "không có gì đẩy". Tôi không đồng ý với đánh giá của bạn rằng sẽ có ý nghĩa hơn nếu có dấu "+" ở phía trước, nhưng đây chỉ là cách nó hoạt động. Xem phần cuối cùng của liên kết refspec mà tôi đã đăng và quyết định xem bạn có tin tưởng tác giả hay không.
Ryan Stewart

Tôi nghĩ bây giờ tôi đã hiểu rõ hơn một chút. Cảm ơn!
Umang
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.