Xóa nhánh Git


79

Trong Git, "xóa" một nhánh có nghĩa là gì?

Nó sẽ biến mất khỏi kho lưu trữ? Hay nó vẫn sẽ được điều hướng đến qua git branch?

Những gì tôi thực sự muốn làm là đánh dấu một nhánh là "ngõ cụt", tức là nhánh quá xa chủ, mà không ai nên sử dụng nó làm điểm bắt đầu, mặc dù có một số ý tưởng hay ở nhánh đó, vì vậy chúng tôi sẽ thích giữ nó, để tham khảo.

Câu trả lời:


157

Bạn có thể xóa chi nhánh, nhưng hãy gắn thẻ nó trước để lịch sử của nó không biến mất. Bằng cách này, chi nhánh không hiển thị trong danh sách chi nhánh, điều này hy vọng sẽ ngăn cản mọi người làm việc trên nó, nhưng công việc sẽ không bị xóa vĩnh viễn (ngay cả sau khi chạy thu gom rác). Ví dụ: bất cứ khi nào tôi có một chi nhánh đã trở nên không còn liên quan, nhưng tôi không chuẩn bị để xóa nó vĩnh viễn, tôi gắn thẻ nó là "archive / < branch-name >".

Trong khi trên masterhoặc một số chi nhánh khác:

git tag archive/foo foo
git branch -D foo

Điều này tạo ra một thẻ có tên archive/footừ foonhánh trước khi xóa foo. Bạn cũng có thể thêm thông báo vào thẻ, thông báo đó giải thích những gì có trong nhánh, tại sao nó tồn tại, tại sao bây giờ nó là ngõ cụt, v.v.

git tag -m 'Foo is deprecated in favor of bar' archive/foo foo

Khả năng ghi lại lý do tại sao một nhánh không được dùng nữa có lẽ là một lợi thế của việc gắn thẻ so với việc chuyển các nhánh sang một không gian tên thay thế.

Nếu bạn cần phục hồi một nhánh đã được lưu trữ theo cách này, thì đơn giản như sau:

git branch foo archive/foo
git tag -d archive/foo       # Optional

Bây giờ chi nhánh đã trở lại như thể nó chưa bao giờ bị xóa.


5
@sardaukar: Điều này cũng có thể hoạt động với các kho lưu trữ từ xa bằng cách đẩy thẻ lưu trữ (sử dụng --tagstùy chọn để git push) và sau đó xóa nhánh từ xa (sử dụng :<branch-to-delete>refspec trong khi đẩy). Ví dụ:git tag archive/foo foo; git branch -D foo; git push --tags origin :foo
Dan Molding

Sẽ thật tuyệt nếu git có cách tự động thông báo cho mọi người "nhánh này đã được lưu trữ" và hiển thị thông báo cam kết, nếu mọi người cố gắng kéo từ một nhánh đã lưu trữ nhưng không được.
Robin Green

1
Câu trả lời rất hay, chính xác những gì tôi đang tìm kiếm! Chỉ để chắc chắn, điều này có hữu ích không nếu nhánh đã được hợp nhất trở lại chủ trước khi bị xóa?
claf 5/11/12

Một câu hỏi liên quan khác (nếu ai đó vẫn theo dõi chủ đề này) là làm cách nào để tôi "đóng" (hợp nhất trong chính hoặc lưu trữ trong thẻ hoặc bất cứ thứ gì) nếu có nhiều nhà phát triển tham gia vào nhánh này? xóa và gắn thẻ chi nhánh (cả cục bộ và từ xa) không phải là quá thô lỗ với các nhà phát triển khác của chi nhánh này?
claf

1
câu trả lời này là rất tốt, giải pháp tuyệt vời
Christopher Thomas

2

Các nhánh Git được lưu trữ dưới dạng tham chiếu đến một bản sửa đổi. Nếu bạn xóa nhánh, tham chiếu sẽ bị xóa; nếu không có gì khác tham chiếu đến bản sửa đổi đó, nó cuối cùng sẽ được thu gom. Ngoài ra, nếu bạn xóa chi nhánh thì nó sẽ biến mất hoàn toàn (khỏi kho lưu trữ của bạn). Nếu bạn muốn đánh dấu một nhánh là không được dùng nữa nhưng vẫn giữ nó để sử dụng sau này, bạn có thể di chuyển nhánh đó vào một thư mục con:

$ git branch
* master
  testing_feature_one
  testing_feature_two
$ git branch -m testing_feature_one deprecated/testing_feature_one
$ git branch
  deprecated/testing_feature_one
* master
  testing_feature_two

Ngoài ra, bạn có thể tạo một kho lưu trữ riêng cho các nhánh không dùng nữa, kéo chúng qua rồi xóa chúng khỏi bản gốc. Trong cả hai trường hợp, bạn sẽ ảnh hưởng đến bất kỳ người dùng nào đang theo dõi các nhánh - nội dung trong kho lưu trữ của họ sẽ không thay đổi (và bất kỳ tên nhánh nào của họ cũng vậy), nhưng nếu họ cố gắng kéo lại, họ sẽ phải thay đổi mục tiêu của họ trong cấu hình của họ.


2

git branch -D <branchName>sẽ xóa chi nhánh của bạn khỏi kho lưu trữ. Bạn sẽ không thể nhìn thấy nó hoặc điều hướng nữa. Ngoài ra, bạn sẽ mất tất cả các thay đổi tệp được thực hiện trong nhánh đó.

https://git-scm.com/docs/git-branch


0

Nó sẽ không thể điều hướng qua git branch và cho đến khi thực hiện thu dọn rác, nó sẽ không bị mất khỏi kho lưu trữ.

Nếu bạn muốn đánh dấu nhánh được đề cập là kết thúc thì chỉ cần làm như vậy (git có thể không làm điều này cho bạn nhưng bạn chắc chắn có thể)!

Dán nhãn nó (theo bất kỳ cách nào bạn muốn) như một tài liệu tham khảo lịch sử.

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.