Làm thế nào để các chi nhánh Git làm việc? Tôi có thể loại bỏ nhánh chủ?


22

Tôi có một dự án có 2 chi nhánh, phát triển và sản xuất. Tôi không sử dụng nhánh chính và mỗi lần tôi viết git statusnó sẽ cho tôi biết nhánh của mình cách chủ bao xa.

Khi tôi cố gắng xóa nhánh chủ git branch -d master, nó chỉ xóa nó trên kho lưu trữ cục bộ của tôi chứ không phải trên máy chủ git từ xa. Có ý kiến ​​gì không?

Câu trả lời:


34

Trong Git, một nhánh chỉ là một danh sách các lệnh xác nhận (hay còn gọi là: checkins). Một điều có thể hơi khó hiểu đối với người dùng mới là các chi nhánh không cần phải có tên (mặc dù trong hầu hết các trường hợp bạn muốn có một cái tên); và không có gì đặc biệt về bất kỳ chi nhánh cụ thể nào ( masterchi nhánh chỉ là chi nhánh mặc định được tạo cho bạn khi bạn khởi tạo kho lưu trữ).

Có thể bạn đã biết điều này, nhưng Git khác với một số hệ thống kiểm soát phiên bản khác như "Subversion" phổ biến, bởi vì mọi "bản sao làm việc" (theo ngôn ngữ Subversion) là một kho lưu trữ của riêng nó ... thực tế, không có gì đặc biệt đặc biệt về bất kỳ bản sao cụ thể; ngoại trừ một bản sao thường được đồng ý là bản "chính tắc" được sử dụng để lưu trữ sản phẩm cuối cùng.

Vì vậy, trở lại câu hỏi của bạn ... kho lưu trữ "chính tắc" mà bạn đã nhân bản khi bạn bắt đầu bản sao cục bộ của mình chứa một nhánh "chính" theo mặc định; và nó bị mắc kẹt xung quanh. Bây giờ, nếu bạn có quyền truy cập vào máy tính chứa kho lưu trữ chính, bạn có thể đăng nhập và chạy:

git branch -d master

Tuy nhiên, nếu bạn không thể làm điều đó, bạn vẫn có thể làm điều đó từ máy cục bộ của mình. Các git branchlệnh có một -rtùy chọn mà ảnh hưởng đến kho lưu trữ từ xa. Nói cách khác, chạy lệnh sau sẽ hoạt động:

git branch -d -r master

Lưu ý rằng trong cả hai trường hợp đó; Tôi giả định rằng nó masterđã được hợp nhất hoàn toàn vào lịch sử phát triển mà bản sao địa phương của bạn hiện đang ngồi. Nếu bạn chưa từng sử dụng mastertrước đây (nghĩa là: bạn chỉ từng đăng ký developmenthoặc production), bạn không có gì phải lo lắng. Tuy nhiên, nếu bạn (hoặc người khác) đã kiểm tra mọi thứ master, thì bạn có thể gặp vấn đề. Bạn có thể buộc xóa bằng cách thay đổi -dthành -Dtrong các lệnh trên; nhưng tôi rất khuyên bạn nên kiểm tra để xem những gì mastertrước! Nếu bạn không có quyền truy cập vào máy tính từ xa, có lẽ bạn sẽ không thể khôi phục nó!


Nhân tiện; nếu bạn (hoặc bất kỳ ai khác) chưa quen với Git, tôi khuyên bạn nên đọc Git từ dưới lên của John Wiegley . Mặc dù tôi đã sử dụng Git một chút trước khi tìm thấy bài viết này, tôi không thực sự hiểu nó hoạt động như thế nào cho đến khi tôi đọc nó. Nó khá hữu ích!


3
Đôi khi kể từ khi tôi viết bình luận ban đầu, hành vi của git đã thay đổi một chút. Kể từ git 1.7.12, git branch -d -r masterkhông còn xóa chi nhánh từ xa - nó sẽ xóa kiến ​​thức bản sao địa phương của bạn về chi nhánh từ xa. Lần sau bạn git fetch, chi nhánh sẽ trở lại! Thay vào đó, bạn sẽ muốn chạy git push origin :master. Về cơ bản những gì bạn đang làm ở đây là đẩy một nhánh null (tên nhánh trống sang bên trái :) phía trên nhánh từ xa (tên nhánh ở phía bên phải :), xóa nó một cách hiệu quả.
mparker17

Cũng cần lưu ý rằng khi bạn sao chép một kho lưu trữ, bạn thường mặc định để kiểm tra chính. Điều này phụ thuộc vào tài liệu tham khảo CHÍNH trong kho lưu trữ mà bạn đang nhân bản. Vì vậy, sau khi chủ bị xóa, hãy đảm bảo rằng các điểm chính tới nhánh bạn muốn làm mặc định.
Zitrax

Liên kết của bạn đến Git từ dưới lên đã chết, nhưng có vẻ như đây là văn bản bạn đang đề cập đến (?) Bạn có thể xác nhận và có thể cập nhật liên kết trong câu trả lời không?
HOẶC Mapper

HOẶC Mapper: Đó là văn bản tôi đang đề cập đến: cảm ơn bạn về liên kết mới! Tôi đã cập nhật liên kết trong câu trả lời.
mparker17

4

masterlà nhánh mặc định cho git. Tôi không biết tại sao nó quá khủng khiếp đối với bạn khi git cho bạn biết bạn ở xa chủ như thế nào, nhưng nếu bạn muốn xóa một nhánh trên kho lưu trữ từ xa của mình, xóa nó cục bộ là không đủ. Hãy thử điều này thay thế:

git push origin :master

Điều này sẽ đẩy không có gì (phần trước dấu hai chấm) đến máy chủ gốc của bạn và ghi đè lên bản gốc. Nói cách khác, nó nên xóa nhánh chủ từ xa.


Tôi nhận được: remote: error: từ chối xóa chi nhánh hiện tại: refs / Heads / master To github.com ***. Git! [từ chối từ xa] lỗi (xóa chi nhánh hiện tại bị cấm): không thể đẩy một số giới thiệu đến ' github.com ***. git'
Totty.js

1
@Totty có lẽ điều này có thể giúp: matthew-brett.github.io/pydagogue/gh_delete_master.html
MEM
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.