Làm cách nào để gắn thẻ một cam kết cũ hơn trong Git?


949

Chúng tôi chưa quen với git và tôi muốn đặt thẻ ở đầu kho lưu trữ của chúng tôi. Mã sản xuất của chúng tôi giống như kho lưu trữ ban đầu, nhưng chúng tôi đã thực hiện các cam kết kể từ đó. Một thẻ ở đầu sẽ cho phép chúng tôi "khôi phục" sản xuất về trạng thái ổn định, đã biết.

Vậy làm thế nào để thêm một thẻ vào một cam kết cũ hơn, tùy ý?


Tôi đến đây để tìm trợ giúp xóa một thẻ cũ cục bộ và trên một điều khiển từ xa và cuối cùng thấy nó hữu ích, có lẽ nó cũng sẽ giúp người khác: gist.github.com/mobilemind/7883996
Aleksander Lidtke

1
Và đừng quên Làm thế nào để đẩy thẻ vào kho lưu trữ từ xa bằng Git? bởi vì Git sẽ không đẩy một thẻ mà không làm điều gì đó đặc biệt.
jww

Câu trả lời:


1511

Thí dụ:

git tag -a v1.2 9fceb02 -m "Message here"

Đâu 9fceb02là phần bắt đầu của id xác nhận.

Sau đó, bạn có thể đẩy thẻ bằng cách sử dụng git push origin v1.2.

Bạn có thể làm git logđể hiển thị tất cả các id cam kết trong chi nhánh hiện tại của bạn.

Ngoài ra còn có một chương tốt về gắn thẻ trong sách Pro Git.

Cảnh báo: Điều này tạo ra các thẻ có ngày hiện tại (và giá trị đó là những gì sẽ hiển thị trên trang phát hành GitHub chẳng hạn). Nếu bạn muốn thẻ được ghi ngày với ngày cam kết, vui lòng xem câu trả lời khác .


45
Bạn cũng có thể thực hiện việc này trong menu chuột phải trong gitk - thuận tiện nếu đó là cách bạn tìm thấy SHA1.
Cascabel

62
Bỏ qua phần -avà các -m "Message here"phần nếu bạn không muốn thêm một tin nhắn:git tag v1.2 9fceb02
devius 7/12/2015

3
Bạn cũng có thể sử dụng ID cam kết đầy đủ.
j08

1
@devius Sự khác biệt giữa sử dụng -a-m. Trang người đàn ông dường như nói -alà ngụ ý khi -mđược sử dụng.
John Strood

7
git push --tags origin mastersẽ đẩy tất cả các thẻ trên chi nhánh địa phương đến từ xa. Thích git push origin <tag_name>chỉ đẩy thẻ đã tạo. Tham khảo: stackoverflow.com/a/5195913/452708 , git-scm.com/book/en/v2/Git-Basics-Tagging
Abhijeet

144

Chỉ là mã

# Set the HEAD to the old commit that we want to tag
git checkout 9fceb02

# temporarily set the date to the date of the HEAD commit, and add the tag
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" \
git tag -a v1.2 -m"v1.2"

# set HEAD back to whatever you want it to be
git checkout master

Chi tiết

Câu trả lời của @dkinzer tạo ra các thẻ có ngày là ngày hiện tại (khi bạn chạy git taglệnh), không phải ngày của cam kết. Trợ giúp Git cho tagcó phần "Trên các thẻ Backdating" có nội dung:

Nếu bạn đã nhập một số thay đổi từ một VCS khác và muốn thêm thẻ cho các bản phát hành chính của tác phẩm của mình, sẽ rất hữu ích khi có thể chỉ định ngày để nhúng bên trong đối tượng thẻ; dữ liệu đó trong đối tượng thẻ ảnh hưởng, ví dụ, thứ tự các thẻ trong giao diện gitweb.

Để đặt ngày được sử dụng trong các đối tượng thẻ trong tương lai, hãy đặt biến môi trường GIT_COMMITTER_DATE(xem phần thảo luận sau về các giá trị có thể; dạng phổ biến nhất là "YYYY-MM-DD HH: MM").

Ví dụ:

$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1

Trang "Cách gắn thẻ trong Git" cho chúng ta thấy rằng chúng ta có thể trích xuất thời gian của cam kết CHÍNH thông qua:

git show --format=%aD  | head -1
#=> Wed, 12 Feb 2014 12:36:47 -0700

Chúng tôi có thể trích xuất ngày của một cam kết cụ thể thông qua:

GIT_COMMITTER_DATE="$(git show 9fceb02 --format=%aD | head -1)" \
git tag -a v1.2 9fceb02 -m "v1.2"

Tuy nhiên, thay vì lặp lại cam kết hai lần, có vẻ như chỉ cần thay đổi CHÍNH thành cam kết đó và sử dụng nó trong cả hai lệnh:

git checkout 9fceb02 

GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a v1.2 -m "v1.2"

4
@ColonelPanic, điều ước của bạn là mệnh lệnh của tôi! github.com/lucasrangit/git-custom-commands/blob/master/NH
Lucas

Nếu bạn sử dụng Github để quản lý các bản phát hành và quan tâm đến ngày hiển thị trên trang / thẻ dự án của bạn, việc đặt GIT_COMMITTER_DATE là đặc biệt quan trọng!
Lesley

2
@ColonelPanic Tôi đã đưa cho bạn một upvote cho trò chơi chữ và ước tôi có thể đưa cho bạn một cái thứ hai cho mã, nhưng một ngôi sao github sẽ phải làm.
andyhasit

96

Cách đơn giản nhất để làm điều này là:

git tag v1.0.0 f4ba1fc

với f4ba1fcsự khởi đầu của hàm băm của cam kết bạn muốn gắn thẻ và v1.0.0là phiên bản bạn muốn gắn thẻ.


Cảm ơn hoàn hảo :).
Saleh men Shohag


36

OK , bạn chỉ cần làm:

git tag -a <tag> <commit-hash>

Vì vậy, nếu bạn muốn thêm thẻ: 1.0.2 để cam kết e50f795, chỉ cần thực hiện:

git tag -a 1.0.2 e50f795

Ngoài ra, bạn thêm một tin nhắn ở cuối, sử dụng -m, một cái gì đó như thế này:

git tag -a 1.0.2 e50f795 -m "my message"

Rốt cuộc, bạn cần đẩy nó đến remote, để làm điều đó, chỉ cần làm:

git push origin 1.0.2 

Nếu bạn có nhiều thẻ mà bạn không muốn đề cập từng cái một, chỉ cần làm:

git push origin --tags

để đẩy tất cả các thẻ lại với nhau ...

Ngoài ra, tôi đã tạo các bước trong hình ảnh bên dưới, để làm rõ hơn các bước: tạo thẻ trên hàm băm cam kết

Bạn cũng có thể dd thẻ trong Hub hoặc sử dụng các công cụ như SourceTree , để tránh các bước trước đó, tôi đã đăng nhập vào Bitbucket của mình trong trường hợp này và thực hiện từ đó:

  1. Đi đến chi nhánh của bạn và tìm cam kết bạn muốn thêm thẻ vào và nhấp vào nó:

tìm cam kết của bạn trong bitbucket

  1. Trong trang cam kết , ở bên phải, tìm nơi nó nói No tagsvà nhấp vào +biểu tượng:

tìm nơi nó nói Không có thẻ

  1. Trong hộp tên thẻ, thêm thẻ của bạn:

thêm tên thẻ

  1. Bây giờ bạn thấy rằng thẻ đã được tạo thành công:

nhập mô tả hình ảnh ở đây


11

Đây là một câu hỏi cũ và các câu trả lời đã được đưa ra cho tất cả các công việc, nhưng cũng có một lựa chọn mới có thể được xem xét.

Nếu bạn đang sử dụng SourceTree để quản lý kho git của mình, bạn có thể nhấp chuột phải vào bất kỳ cam kết nào và thêm thẻ vào đó. Với một mouseclick khác, bạn cũng có thể gửi thẻ thẳng đến chi nhánh gốc.


6

Dựa trên câu trả lời của những người khác, đây là giải pháp một lớp đặt ngày thẻ thành khi nó thực sự xảy ra, sử dụng thẻ chú thích và không yêu cầu git checkout:

tag="v0.1.3" commit="8f33a878" bash -c 'GIT_COMMITTER_DATE="$(git show --format=%aD $commit)" git tag -a $tag -m $tag $commit'
git push --tags origin master

nơi tagđược đặt thành chuỗi thẻ mong muốn và commitbăm xác nhận.


3

Câu trả lời của @Phrogz rất hay, nhưng không hoạt động trên Windows. Đây là cách gắn thẻ một cam kết cũ với ngày ban đầu của cam kết bằng Powershell:

git checkout 9fceb02
$env:GIT_COMMITTER_DATE = git show --format=%aD | Select -First 1
git tag v1.2
git checkout master
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.