Làm cách nào để bạn hoàn nguyên về một thẻ cụ thể trong Git?


85

Tôi biết cách hoàn nguyên về các cam kết cũ hơn trong một nhánh Git, nhưng làm cách nào để hoàn nguyên về trạng thái của nhánh do thẻ ra lệnh? Tôi hình dung một cái gì đó như thế này:

git revert -bytag "Version 1.0 Revision 1.5"

Điều này có khả thi không?


Bạn có muốn "tua lại nhánh" (tức là loại bỏ các cam kết) hoặc thêm một cam kết mới vào chi nhánh hiện tại, thiết lập chi nhánh để tất cả các tệp đều "giống như chúng ở cam kết được cung cấp bởi thẻ đó"?

Hoặc nên được công việc làm, mặc dù tôi nghĩ rằng tôi thà thêm một mới cam kết các chi nhánh hiện tại theo cách bạn mô tả
zachd1_618

Trong trường hợp đó, hãy sử dụng git checkout <id> .phương pháp từ câu trả lời này .
torek

Câu trả lời:


130

Thẻ git chỉ là con trỏ tới cam kết. Vì vậy, bạn sử dụng chúng giống như cách bạn thực hiện HEAD, tên nhánh hoặc mã băm cam kết sha. Bạn có thể sử dụng các thẻ với bất kỳ lệnh git nào chấp nhận các đối số cam kết / sửa đổi. Bạn có thể thử nó với git rev-parse tagnameđể hiển thị cam kết mà nó trỏ tới.

Trong trường hợp của bạn, bạn có ít nhất hai lựa chọn thay thế sau:

  1. Đặt lại nhánh hiện tại thành thẻ cụ thể:

    git reset --hard tagname
    
  2. Tạo cam kết hoàn nguyên ở trên cùng để đưa bạn đến trạng thái của thẻ:

    git revert tag
    

Điều này có thể dẫn đến một số xung đột nếu bạn có các cam kết hợp nhất.


28
Tôi nghĩ rằng "git revert <tag>" sẽ hoàn nguyên các thay đổi trong cam kết được gắn thẻ, thay vì khôi phục bản sao làm việc của bạn về phiên bản đó.
Matt

Để loại bỏ các tệp chưa được kiểm soát / không được phiên bản, hãy làm theo stackoverflow.com/a/912737/923560
Abdull

3
Giống như @Matt đã nói, câu trả lời được chấp nhận chỉ đơn giản là không chính xác, vì nó chỉ hoàn nguyên những thay đổi trong cam kết được gắn thẻ. Đặt cược tốt nhất của bạn là sử dụng các băm cam kết và làm theo câu trả lời sau: stackoverflow.com/a/4114122/6348485
Swagga Ting

Xin chào, bạn có thể giải thích "tạo cam kết hoàn nguyên ở trên cùng để đưa bạn đến trạng thái của thẻ:" không? Tôi không biết điều này có nghĩa là gì.
John Little

12

Sử dụng git reset :

git reset --hard "Version 1.0 Revision 1.5"

(giả sử rằng chuỗi được chỉ định là thẻ).


1

Bạn có thể sử dụng git checkout.

Tôi đã thử giải pháp được chấp nhận nhưng gặp lỗi, warning: refname '<tagname>' is ambiguous'

Nhưng như câu trả lời đã nêu, các thẻ hoạt động giống như một con trỏ đến một cam kết, vì vậy, như bạn làm với băm cam kết, bạn chỉ cần kiểm tra thẻ. Sự khác biệt duy nhất là bạn mở đầu nó bằng tags/:

git checkout tags/<tagname>

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.