Kiểm tra thẻ Git dẫn đến trạng thái ĐẦU tách rời


166

Tôi đang phát triển một kịch bản triển khai cho dự án git của mình và tôi mới bắt đầu sử dụng các thẻ. Tôi đã thêm một thẻ mới gọi là v2.0:

git tag -a v2.0 -m "Launching version 2.0"

Và tôi đã đẩy thẻ này vào kho lưu trữ từ xa

git push --tags

Khi tôi cố gắng thực thi tập lệnh triển khai và kiểm tra v2.0thẻ tôi nhận được thông báo này:

Bạn đang ở trạng thái 'tách rời'. Bạn có thể nhìn xung quanh, thực hiện các thay đổi thử nghiệm và cam kết chúng, và bạn có thể loại bỏ bất kỳ cam kết nào bạn thực hiện trong trạng thái này mà không ảnh hưởng đến bất kỳ chi nhánh nào bằng cách thực hiện thanh toán khác. Nếu bạn muốn tạo một nhánh mới để giữ lại các cam kết bạn tạo, bạn có thể làm như vậy (bây giờ hoặc sau này) bằng cách sử dụng -b với lệnh thanh toán một lần nữa. Ví dụ: git checkout -b new_branch_name HEAD hiện tại

Điều đó có bình thường không? Các kho lưu trữ là trong limbo bởi vì nếu tôi làm:

git branch

Tôi nhận được kết quả này:

* (no branch)
  master

Xin lỗi nếu điều này là hiển nhiên nhưng tôi không thể tìm ra nó.


Khi bạn nói, "thực thi tập lệnh triển khai và kiểm tra v2.0" mã của bạn có giống như "git checkout v2.0" không? Tôi đang cố gắng cải tiến tập lệnh phát hành của mình và khi tôi chạy "git checkout v2.0" từ máy sản xuất của mình, tôi nhận được, "error: pathspec 'v2.0' không khớp với bất kỳ tập tin nào được biết đến với git." Mặc dù tôi đã chạy, "git push origin --tags" trên máy cục bộ của tôi trước khi thực hiện "git checkout v2.0" khi sản xuất. Tôi cũng đã thử chạy, "git pull --tags" và "git fetch --tags" khi sản xuất trước khi gọi "git checkout v2.0" và điều đó cũng không hoạt động ... Tôi vẫn nhận được lỗi. Bất kỳ ý tưởng?
John Erck

3
Tôi đã định xóa bình luận trên nhưng sau đó tìm cách giữ nó có thể giúp đỡ người khác. Tôi đã gặp lỗi vì tôi có TYPO trong tên thẻ khi tôi đang chạy, "git checkout v2.0". Tuy nhiên, lỗi liên quan đến lỗi chính tả là lỗi chính xác giống như bạn sẽ gặp nếu bạn chạy, "git checkout v2.0" KHÔNG CÓ lỗi đánh máy TRƯỚC KHI chạy, "git fetch --tags". Vì vậy, cuối cùng, vấn đề của tôi đã được giải quyết bằng cách chạy, "git fetch --tags" PRIOR để chạy, "git checkout v2.0" mà không có lỗi chính tả nào. Phù!
John Erck

Thật tuyệt, vâng, bạn cần thực hiện tìm nạp --tags trước (hoặc git fetch sẽ lấy tất cả từ xa) để git có thể kiểm tra thẻ. Xin lỗi tôi vừa thấy bình luận của bạn ngày hôm nay.
Khriz

Câu trả lời:


429

Được rồi, đầu tiên một vài điều khoản hơi quá đơn giản.

Trong git, một tag(giống như nhiều thứ khác) là cái được gọi là cây . Đó là một cách đề cập đến một điểm trong lịch sử của dự án. Treeishes có thể là một thẻ, một cam kết, một công cụ xác định ngày, một công cụ xác định thứ tự hoặc nhiều thứ khác.

Bây giờ a branchgiống như một thẻ nhưng có thể di chuyển. Khi bạn "bật" một nhánh và thực hiện một cam kết, nhánh đó sẽ được chuyển sang cam kết mới mà bạn đã thực hiện cho biết vị trí hiện tại của nó.

Con HEADtrỏ của bạn đến một nhánh được coi là "hiện tại". Thông thường khi bạn sao chép một kho lưu trữ, HEADnó sẽ trỏ đến masterđó lần lượt sẽ trỏ đến một cam kết. Sau đó, khi bạn làm một cái gì đó như thế git checkout experimental, bạn chuyển sang HEADtrỏ đến experimentalnhánh có thể trỏ đến một cam kết khác.

Bây giờ giải thích.

Khi bạn thực hiện a git checkout v2.0, bạn đang chuyển sang một cam kết không được chỉ ra bởi a branch. Các HEADhiện đang "vô tư" và không trỏ đến một chi nhánh. Nếu bạn quyết định thực hiện một cam kết ngay bây giờ (như bạn có thể), không có con trỏ nhánh để cập nhật để theo dõi cam kết này. Chuyển về cam kết khác sẽ khiến bạn mất đi cam kết mới này bạn đã thực hiện. Đó là những gì tin nhắn đang nói với bạn.

Thông thường, những gì bạn có thể làm là nói git checkout -b v2.0-fixes v2.0. Điều này sẽ tạo ra một con trỏ nhánh mới tại cam kết được chỉ ra bởi cây v2.0(một thẻ trong trường hợp này) và sau đó chuyển bạn HEADđể trỏ đến đó. Bây giờ, nếu bạn thực hiện các cam kết, sẽ có thể theo dõi chúng (sử dụng v2.0-fixeschi nhánh) và bạn có thể làm việc như bạn thường làm. Không có gì "sai" với những gì bạn đã làm đặc biệt là nếu bạn chỉ muốn xem v2.0mã. Tuy nhiên, nếu bạn muốn thực hiện bất kỳ thay đổi nào mà bạn muốn theo dõi, bạn sẽ cần một chi nhánh.

Bạn nên dành chút thời gian để hiểu toàn bộ mô hình DAG của git. Nó đơn giản đáng ngạc nhiên và làm cho tất cả các lệnh khá rõ ràng.


Ok cảm ơn, tôi không cần thực hiện bất kỳ thay đổi nào trong mã vì vậy tôi nghĩ rằng nó ổn. Tôi không cần tạo chi nhánh. Cảm ơn rất nhiều!
Khriz

1
Tôi đã bị mất lần đầu tiên khi tôi xem qua câu trả lời này nhưng sau khi tôi đọc tài liệu phân nhánh Git: http://git-scm.com/book/en/Git-Branching-What-a-Branch- thì nó rõ ràng hơn nhiều .
đánh dấu cọc

3
Câu trả lời tuyệt vời, nhưng tôi có thể thêm vào: "Chuyển trở lại một cam kết khác sẽ khiến bạn mất đi cam kết mới này mà bạn đã thực hiện." - bạn vẫn có thể tìm thấy cam kết git reflog, đây là một lệnh tuyệt vời để biết! Trừ khi việc thu gom rác đã xảy ra, dường như "không thể" để mất một cam kết.
Dmitry Minkovsky

Cam kết không được ước tính có thể bị mất bởi một hoạt động thu gom rác.
Noufal Ibrahim

1
Url sai vì họ thay đổi bố cục của trang.
jcubic

12

Vâng, đó là bình thường. Điều này là do bạn kiểm tra một cam kết duy nhất, không có đầu. Đặc biệt nó là (sớm hay muộn) không phải là người đứng đầu của bất kỳ chi nhánh.

Nhưng thường không có vấn đề với trạng thái đó. Bạn có thể tạo một nhánh mới từ thẻ, nếu điều này làm bạn cảm thấy an toàn hơn :)


1
Ok, tôi sẽ giữ nó theo cách đó ... dù sao thì sự an toàn cũng được đánh giá cao;)
Khriz

Như bạn đã nhận xét trong câu trả lời của Noufals (tôi phải nói là tốt hơn;)): Miễn là bạn không thay đổi bất cứ điều gì, không có gì bạn phải lo lắng. Tuy nhiên, nếu bạn cho rằng , bạn có thể thay đổi một cái gì đó, bạn chỉ cần tạo một nhánh, vì chúng rẻ trong git và bạn có thể xóa nó (và tạo lại sau này và cứ thế).
KingCrunch
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.