Ký tự dấu mũ (^) có nghĩa là gì?


124

Tôi thấy một câu trả lời cho một câu hỏi ở đây giúp khôi phục một tập tin bị xóa trong git.

Giải pháp là

git checkout <deleting_commit>^ -- <deleted_file_path>

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. Ai đó hãy làm hỏng nó cho tôi và cho tôi biết nó làm gì?


8
FYI trên windows: ^ không hoạt động như mong đợi trong DOS shell. Sử dụng git bash shell và sau đó nó hoạt động.
Cincinnati Joe

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 ý nghĩa của nó). Dấu mũ ( ^) là ký tự thoát trong cmd.exe. Mỗi lần tôi thử sử dụng nó để xem nó có hữu ích không thì tôi thực sự không có gì, điều này giải thích tại sao kết quả không bao giờ khác nhau. > _> Cmd.exe ngu ngốc. Bạn có thể thoát khỏi nó bằng cách nhân đôi hoặc trích dẫn nó: git log master^^hoặcgit log "master^"
bambams

Câu trả lời:


138

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

Hãy nhớ rằng cam kết git có thể có nhiều hơn một cha mẹ. HEAD^là viết tắt của HEAD^1, và bạn cũng có thể giải quyết HEAD^2và như vậy là phù hợp.

Bạn có thể nhận được cho cha mẹ của bất kỳ cam kết, không chỉ HEAD. Bạn cũng có thể di chuyển trở lại qua các thế hệ: ví dụ: master~2có nghĩa là ông bà của đầu nhánh chính, ủng hộ cha mẹ đầu tiên trong trường hợp mơ hồ. Các specifier này có thể được xích tùy ý, ví dụ , topic~3^2. Xem câu trả lời liên quan đến sự khác biệt giữa HEAD^HEAD~trong Git là gì?

Đối với đầy đủ các chi tiết, vui lòng xem “Sửa đổi Xác định” phần của git rev-parse --help.


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

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

21

Nó có nghĩa là "cha mẹ của". Vậy HEAD^có nghĩa là "cha mẹ của TRỤ 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 mẹ của cha mẹ hiện tại" (nghĩa là ông bà của TRỤ hiện tại), HEAD^^^có nghĩa là "cha mẹ của cha mẹ của cha mẹ hiện tại", v.v.


16

Các ^(caret) cũng có thể được sử dụng khi xác định dãy .

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

<rev>

Bao gồm các cam kết có thể truy cập từ (tức là tổ tiên của).

^ <rev>

Không bao gồm các cam kết có thể truy cập từ (tức là tổ tiên của).


10

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

                      master  
  ... <- B <- C <- D
             /
... <- E <- F
              feature

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

Do đó C^1đề cập đến BC^2đề cập đến F. C^là một 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.


7

Các dấu mũ đề cập đến cha mẹ của một cam kết cụ thể. Ví dụ, HEAD^đề cập đến cha mẹ của TRƯỚC hiện tại. (cũng, HEAD^^đề cập đến ông bà).


4

Các carat đại diện cho một bù cam kết (cha mẹ). Vì vậy, ví dụ, HEAD^có nghĩa là "một cam kết từ CHÍNH" và HEAD^^^có nghĩa là "ba cam kết từ CHÍNH".


4

(^) Lấy nguồn gốc của lệnh, tức là CHÍNH ^ sẽ lấy cha mẹ của CHÍNH.


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.