2009-12-23 76 views
88

Tôi thấy một answer to a question ở đây giúp khôi phục tệp đã xóa trong git.Ký tự dấu mũ (^) có nghĩa là gì?

Giải pháp là

git checkout <deleting_commit>^ -- <deleted_file_path> 

gì nhân vật caret (^) làm gì? Tôi đã thấy nó ở nơi khác làm những điều rất hữu ích trong git. Thật kỳ diệu. Có người làm hỏng nó cho tôi và cho tôi biết nó làm gì?

+7

FYI trên cửa sổ:^không hoạt động như mong đợi trong vỏ hệ điều hành DOS. Sử dụng git bash shell và sau đó nó hoạt động. –

+5

Điều đó thậm chí không xảy ra với tôi khi tôi đã cố gắng sử dụng nó (đoán về ý nghĩa của nó). Dấu mũ ('^') là ký tự thoát trong cmd.exe. Mỗi khi tôi đã cố gắng sử dụng nó để xem nếu nó sẽ hữu ích tôi đã thực sự đi qua không có gì, mà giải thích tại sao các kết quả không bao giờ khác nhau. > _> Stupid cmd.exe. Bạn có thể thoát nó bằng cách tăng gấp đôi nó hoặc trích dẫn nó: 'git log master^^' hoặc 'git log 'master ^" ' – bambams

Trả lời

100

HEAD^ có nghĩa là cha mẹ đầu tiên của mũi của nhánh hiện tại.

Hãy nhớ rằng cam kết git có thể có nhiều hơn một phụ huynh. HEAD^ là viết tắt của HEAD^1 và bạn cũng có thể địa chỉ HEAD^2 và cứ tiếp tục khi thích hợp.

Bạn có thể liên hệ với cha mẹ của bất kỳ cam kết nào, không chỉ HEAD. Bạn cũng có thể di chuyển qua các thế hệ: ví dụ: master~2 nghĩa là ông bà của mũi của nhánh chính, ưu tiên cha mẹ đầu tiên trong trường hợp mơ hồ. Các thông số này có thể được ghép một cách tùy ý , ví dụ:, topic~3^2.

Để biết chi tiết đầy đủ, hãy xem phần “Specifying Revisions” của git rev-parse --help.

+1

Nhưng sau đó, trên lịch sử tuyến tính, tại sao' HEAD ^^^ 'trả về commit thứ ba cũ hơn tức là nó tương đương với 'HEAD ~~~'? – Vorac

+1

@Vorac Đối với lịch sử tuyến tính, có. –

7

Dấu mũ đề cập đến phụ huynh của một cam kết cụ thể. Ví dụ. HEAD^ đề cập đến phụ huynh của giao thức HEAD hiện tại. (cũng có, HEAD^^ đề cập đến ông bà).

19

Nó có nghĩa là "cha mẹ của". Vì vậy, HEAD^ có nghĩa là "phụ huynh của HEAD hiện tại". Bạn thậm chí có thể xâu chuỗi chúng lại với nhau: HEAD^^ có nghĩa là "cha đẻ của cha mẹ của HEAD hiện tại" (nghĩa là ông bà của HEAD hiện tại), HEAD^^^ có nghĩa là "cha mẹ của cha mẹ của HEAD hiện tại", và như vậy ra.

3

Carat thể hiện khoản cam kết bù trừ (cấp độ gốc). Ví dụ: HEAD^ có nghĩa là "một cam kết từ HEAD" và HEAD^^^ có nghĩa là "ba cam kết từ HEAD".

4

(^) lấy nguồn gốc của lệnh, tức là HEAD^sẽ nhận được cấp độ gốc của HEAD.

1

Greg Bacon đã có một liên kết tuyệt vời, nhưng nó khá dày đặc. Các tài liệu giới thiệu Git trực tuyến cũng giới thiệu phiên bản và phạm vi specifiers:

https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection

+3

Liên kết này có thể gần với vị trí dự định. http://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Ancestry-References – bholben

5

các ^ (caret) cũng có thể được sử dụng khi specifying ranges.

Để loại trừ cam kết truy cập từ một cam kết, một tiền tố^ký hiệu là sử dụng. Ví dụ.^r1 r2 nghĩa là các cam kết có thể truy cập từ r2 nhưng loại trừ các số có thể truy cập từ r1.

<rev>

Bao gồm các cam kết mà có thể truy cập từ (ví dụ: tổ tiên của).

^<rev>

Loại trừ các cam kết đó có thể truy cập từ (ví dụ: tổ tiên của).

4

Dưới đây là giải thích trực quan. Giả sử bạn có một lịch sử như vậy:

   master 

    A <- B <- C <- D 
     /
    E <- F 
      feature 

Khi đối tượng địa lý được hợp nhất thành chủ, C được tạo với hai tổ tiên. Git gán các số tổ tiên này. Tổ tiên đường chính B được gán 1 và tính năng tổ tiên F được gán 2.

Như vậy C^1 đề cập đến BC^2 đề cập đến F. C^ là bí danh cho C^1.

Bạn sẽ chỉ sử dụng <rev>^3. nếu bạn đã thực hiện hợp nhất ba nhánh.

Các vấn đề liên quan