เมื่อฉันระบุบรรพบุรุษกระทำวัตถุใน Git ฉันสับสนระหว่างและHEAD^
HEAD~
ทั้งสองมี "หมายเลข" รุ่นที่เหมือนและHEAD^3
HEAD~2
พวกมันดูคล้ายกันมากหรือเหมือนกับฉัน แต่มีความแตกต่างระหว่างตัวหนอนและเครื่องหมายรูปหมวกไหม?
เมื่อฉันระบุบรรพบุรุษกระทำวัตถุใน Git ฉันสับสนระหว่างและHEAD^
HEAD~
ทั้งสองมี "หมายเลข" รุ่นที่เหมือนและHEAD^3
HEAD~2
พวกมันดูคล้ายกันมากหรือเหมือนกับฉัน แต่มีความแตกต่างระหว่างตัวหนอนและเครื่องหมายรูปหมวกไหม?
คำตอบ:
~
เวลาส่วนใหญ่เพื่อย้อนกลับไปหลายชั่วอายุคนโดยทั่วไปเป็นสิ่งที่คุณต้องการ^
ในการรวมการกระทำ - เพราะพวกเขามีผู้ปกครองสองคนขึ้นไป (ทันที)จำ:
~
นั้นมีลักษณะเป็นเส้นตรงเกือบทั้งหมดและต้องการย้อนกลับเป็นเส้นตรง^
แนะนำส่วนที่น่าสนใจของต้นไม้หรือทางแยกในถนน“ระบุการแก้ไข” ของgit rev-parse
เอกสารกำหนด~
เป็น
<rev>~<n>
เช่นmaster~3
ต่อท้าย~<n>
พารามิเตอร์แก้ไขหมายความว่ากระทำวัตถุที่เป็นn วันที่บรรพบุรุษสร้างชื่อกระทำวัตถุต่อไปเพียง แต่พ่อแม่เป็นครั้งแรก ตัวอย่างเช่น<rev>~3
เทียบเท่ากับ<rev>^^^
ซึ่งเท่ากับ<rev>^1^1^1
...
HEAD
คุณจะได้รับไปยังผู้ปกครองใดกระทำไม่ได้เป็นเพียง นอกจากนี้คุณยังสามารถย้อนกลับไปหลายชั่วอายุคนได้ตัวอย่างเช่นmaster~2
หมายถึงปู่ย่าตายายของส่วนปลายของสาขาหลักซึ่งเป็นที่นิยมของผู้ปกครองคนแรกในการรวม
ประวัติ Git ไม่เชิงเส้น: กราฟ acyclic (DAG) หรือต้นไม้โดยตรง สำหรับการผูกมัดกับผู้ปกครองเพียงคนเดียวrev~
และrev^
หมายถึงสิ่งเดียวกัน ตัวเลือกคาเร็ตจะมีประโยชน์เมื่อทำการผสานเพราะแต่ละอันเป็นลูกของพ่อแม่สองคนขึ้นไปและภาษาที่ยืมมาจากชีววิทยา
HEAD^
หมายถึงผู้ปกครองทันทีแรกของเคล็ดลับของสาขาปัจจุบัน HEAD^
สั้นHEAD^1
และคุณยังสามารถที่อยู่HEAD^2
และอื่น ๆ ตามความเหมาะสม ส่วนที่เหมือนกันของgit rev-parse
เอกสารกำหนดเป็น
<rev>^
, เช่นHEAD^
,v1.5.1^0
ต่อท้าย^
พารามิเตอร์แก้ไขหมายความว่าพ่อแม่เป็นครั้งแรกที่กระทำวัตถุ^<n>
หมายความว่าn THผู้ปกครอง ([ เช่น ]<rev>^
เทียบเท่ากับ<rev>^1
) ในฐานะกฎพิเศษ<rev>^0
หมายถึงการส่งมอบเองและใช้เมื่อ<rev>
เป็นชื่อวัตถุของแท็กวัตถุที่อ้างถึงวัตถุที่กระทำ
specifiers เหล่านี้หรือตัวเลือกจะถูกผูกมัดพลเช่น , topic~3^2
ในภาษาอังกฤษเป็นพ่อแม่คนที่สองของการผสานกระทำที่เป็นปู่ย่าตายายที่ดี (สามรุ่นหลัง) topic
ของปลายปัจจุบันของสาขา
ส่วนดังกล่าวข้างต้นของgit rev-parse
เอกสารร่องรอยหลายเส้นทางผ่านประวัติศาสตร์ที่คอมไพล์สัญญา เวลาที่ไหลลงโดยทั่วไป คอมมิท D, F, B และ A เป็นการรวมคอมมิท
นี่คือภาพประกอบโดย Jon Loeliger ทั้งสองโหนดการยอมรับ B และ C เป็นพาเรนต์ของโหนดการยอมรับ A. การคอมมิทเตอร์หลักจะเรียงลำดับจากซ้ายไปขวา
G H I J \ / \ / D E F \ | / \ \ | / | \|/ | B C \ / \ / A A = = A^0 B = A^ = A^1 = A~1 C = A^2 D = A^^ = A^1^1 = A~2 E = B^2 = A^^2 F = B^3 = A^^3 G = A^^^ = A^1^1^1 = A~3 H = D^2 = B^^2 = A^^^2 = A~2^2 I = F^ = B^3^ = A^^3^ J = F^2 = B^3^2 = A^^3^2
เรียกใช้รหัสด้านล่างเพื่อสร้างที่เก็บ git ที่มีประวัติตรงกับภาพประกอบที่ยกมา
#! /usr/bin/env perl
use strict;
use warnings;
use subs qw/ postorder /;
use File::Temp qw/ mkdtemp /;
my %sha1;
my %parents = (
A => [ qw/ B C / ],
B => [ qw/ D E F / ],
C => [ qw/ F / ],
D => [ qw/ G H / ],
F => [ qw/ I J / ],
);
sub postorder {
my($root,$hash) = @_;
my @parents = @{ $parents{$root} || [] };
postorder($_, $hash) for @parents;
return if $sha1{$root};
@parents = map "-p $sha1{$_}", @parents;
chomp($sha1{$root} = `git commit-tree @parents -m "$root" $hash`);
die "$0: git commit-tree failed" if $?;
system("git tag -a -m '$sha1{$root}' '$root' '$sha1{$root}'") == 0 or die "$0: git tag failed";
}
$0 =~ s!^.*/!!; # / fix Stack Overflow highlighting
my $repo = mkdtemp "repoXXXXXXXX";
chdir $repo or die "$0: chdir: $!";
system("git init") == 0 or die "$0: git init failed";
chomp(my $tree = `git write-tree`); die "$0: git write-tree failed" if $?;
postorder 'A', $tree;
system "git update-ref HEAD $sha1{A}"; die "$0: git update-ref failed" if $?;
system "git update-ref master $sha1{A}"; die "$0: git update-ref failed" if $?;
# for browsing history - http://blog.kfish.org/2010/04/git-lola.html
system "git config alias.lol 'log --graph --decorate --pretty=oneline --abbrev-commit'";
system "git config alias.lola 'log --graph --decorate --pretty=oneline --abbrev-commit --all'";
มันเพิ่มนามแฝงใน repo ใหม่ของการโยนทิ้งเท่านั้นgit lol
และgit lola
เพื่อให้คุณสามารถดูประวัติได้เช่นเดียวกับใน
$ git lol
* 29392c8 (HEAD -> master, tag: A) A
|\
| * a1ef6fd (tag: C) C
| |
| \
*-. \ 8ae20e9 (tag: B) B
|\ \ \
| | |/
| | * 03160db (tag: F) F
| | |\
| | | * 9df28cb (tag: J) J
| | * 2afd329 (tag: I) I
| * a77cb1f (tag: E) E
* cd75703 (tag: D) D
|\
| * 3043d25 (tag: H) H
* 4ab0473 (tag: G) G
โปรดทราบว่าชื่อวัตถุ SHA-1 ในเครื่องของคุณจะแตกต่างจากที่กล่าวข้างต้น แต่แท็กอนุญาตให้คุณระบุที่อยู่ตามชื่อและตรวจสอบความเข้าใจของคุณ
$ git log -1 --format=%f $(git rev-parse A^)
B
$ git log -1 --format=%f $(git rev-parse A~^3~)
I
$ git log -1 --format=%f $(git rev-parse A^2~)
F
“ระบุการแก้ไข” ในgit rev-parse
เอกสารเต็มไปด้วยข้อมูลที่ดีและมีมูลค่าการอ่านในเชิงลึก ดูเพิ่มเติมเครื่องมือ Git - การเลือกการทบทวนจากหนังสือPro Git
การยอมรับ 89e4fcb0ddจากประวัติของ git คือการคอมมิชชันคอมมิชชันตามที่git show 89e4fcb0dd
ระบุด้วยบรรทัดส่วนหัวเวียนที่แสดงชื่อออบเจกต์ของบรรพบุรุษทันที
commit 89e4fcb0dd01b42e82b8f27f9a575111a26844df Merge: c670b1f876 649bf3a42f b67d40adbb Author: Junio C Hamano <gitster@pobox.com> Date: Mon Oct 29 10:15:31 2018 +0900 Merge branches 'bp/reset-quiet' and 'js/mingw-http-ssl' into nd/config-split […]
เราสามารถยืนยันการสั่งซื้อโดยขอgit rev-parse
ให้แสดงผู้ปกครองทันทีของ 89e4fcb0dd ตามลำดับ
$ git rev-parse 89e4fcb0dd^1 89e4fcb0dd^2 89e4fcb0dd^3
c670b1f876521c9f7cd40184bf7ed05aad843433
649bf3a42f344e71b1b5a7f562576f911a1f7423
b67d40adbbaf4f5c4898001bf062a9fd67e43368
การเคียวรีพาเรนต์ที่สี่ที่ไม่มีอยู่นั้นส่งผลให้เกิดข้อผิดพลาด
$ git rev-parse 89e4fcb0dd^4
89e4fcb0dd^4
fatal: ambiguous argument '89e4fcb0dd^4': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
หากคุณต้องการแยกผู้ปกครองเท่านั้นให้ใช้รูปแบบที่สวยงาม %P
สำหรับแฮชแบบเต็ม
$ git log -1 --pretty=%P 89e4fcb0dd
c670b1f876521c9f7cd40184bf7ed05aad843433 649bf3a42f344e71b1b5a7f562576f911a1f7423 b67d40adbbaf4f5c4898001bf062a9fd67e43368
หรือ%p
สำหรับผู้ปกครองที่ยาก
$ git log -1 --pretty=%p 89e4fcb0dd
c670b1f876 649bf3a42f b67d40adbb
^^^^^^^
แทน~7
ใช่ไหม? นั่นเป็นเหตุผลที่~
มีประโยชน์
ความแตกต่างระหว่างHEAD^
และHEAD~
อธิบายไว้อย่างดีจากภาพประกอบ (โดยจอน Loeliger) ที่พบในhttp://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html
เอกสารนี้อาจคลุมเครือเล็กน้อยสำหรับผู้เริ่มต้นดังนั้นฉันจึงทำซ้ำภาพประกอบด้านล่างนี้:
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
A = = A^0
B = A^ = A^1 = A~1
C = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2
F = A^2^
.
^ == ^1 == LEFTMOST PARENT
, ^2 == SECOND LEFTMOST PARENT
และอื่น ๆ และ,~ == ~1 == LEFTMOST PARENT
~2 == LEFTMOST PARENTS LEFTMOST PARENT == LEFTMOST GRANDPARENT
โดยการขยาย~2^2 == LEFTMOST GRANDPARENTS SECOND LEFTMOST PARENT
ทั้งสอง~
และ^
ของตัวเองหมายถึงแม่ของกระทำ ( ~~
และ^^
ทั้งอ้างถึงปู่ย่าตายายกระทำ ฯลฯ ) แต่พวกเขามีความหมายแตกต่างกันในเมื่อพวกเขาถูกนำมาใช้กับตัวเลข:
~2
หมายถึงสองระดับในลำดับชั้นผ่านผู้ปกครองคนแรกถ้าการกระทำมีมากกว่าหนึ่งผู้ปกครอง
^2
หมายถึงผู้ปกครองที่สองที่การกระทำมีมากกว่าหนึ่งผู้ปกครอง (เช่นเพราะมันคือการผสาน)
สิ่งเหล่านี้สามารถนำมารวมกันได้ดังนั้นความHEAD~2^3
หมายหลักHEAD
ของการกระทำที่สามของปู่ย่าตายาย
^^
เหมือนกัน^2
แต่มันไม่ใช่
สองเซ็นต์ของฉัน ...
H=A~2^2
ได้H=A~2^1
อย่างไร
A
, B
, D
, G
อยู่ในสาขาเดียวกันและกระทำD
เป็นของการผสานG
และH
จึงมีพ่อแม่ทั้งสอง ดังนั้นการกระทำ ( H
) จากสาขาอื่น ๆ ^2
คือการอ้างอิงโดย
นี่คือคำอธิบายที่ดีมากที่นำคำต่อคำจากhttp://www.paulboxley.com/blog/2011/06/git-caret-and-tilde :
ref~
จดชวเลขref~1
และหมายถึงผู้ปกครองคนแรกของคอมมิทref~2
หมายถึงการปกครองแรกของผู้ปกครองคนแรกของref~3
หมายถึงการกระทำของผู้ปกครองคนแรกของผู้ปกครองคนแรกของผู้ปกครองคนแรก และอื่น ๆ
ref^
จดชวเลขref^1
และหมายถึงผู้ปกครองคนแรกของคอมมิท แต่ในกรณีที่ทั้งสองแตกต่างกันนั่นref^2
หมายถึงผู้ปกครองคนที่สองของการกระทำ (โปรดจำไว้ว่าการกระทำสามารถมีผู้ปกครองสองคนเมื่อพวกเขารวมกัน)ตัวดำเนินการ
^
และ~
สามารถรวมกันได้
^<n>
รูปแบบให้คุณเลือกผู้ปกครองที่ n กระทำ (ที่เกี่ยวข้องในการผสาน) ~<n>
รูปแบบให้คุณเลือกที่ n บรรพบุรุษกระทำเสมอต่อไปนี้ผู้ปกครองครั้งแรก ดูตัวอย่างเอกสารของgit-rev-parse
เป็นที่น่าสังเกตว่าคอมไพล์ยังมีไวยากรณ์สำหรับการติดตาม "จากที่ที่คุณมา" / "ต้องการที่จะกลับไปตอนนี้" - ตัวอย่างเช่นHEAD@{1}
จะอ้างอิงสถานที่ที่คุณข้ามไปยังตำแหน่งกระทำใหม่
โดยทั่วไปHEAD@{}
ตัวแปรจับภาพประวัติศาสตร์ของการเคลื่อนไหวของศีรษะและคุณสามารถตัดสินใจที่จะใช้หัวโดยเฉพาะอย่างยิ่งการมองเข้าไปใน reflogs git reflog
ของคอมไพล์โดยใช้คำสั่ง
ตัวอย่าง:
0aee51f HEAD@{0}: reset: moving to HEAD@{5}
290e035 HEAD@{1}: reset: moving to HEAD@{7}
0aee51f HEAD@{2}: reset: moving to HEAD@{3}
290e035 HEAD@{3}: reset: moving to HEAD@{3}
9e77426 HEAD@{4}: reset: moving to HEAD@{3}
290e035 HEAD@{5}: reset: moving to HEAD@{3}
0aee51f HEAD@{6}: reset: moving to HEAD@{3}
290e035 HEAD@{7}: reset: moving to HEAD@{3}
9e77426 HEAD@{8}: reset: moving to HEAD@{3}
290e035 HEAD@{9}: reset: moving to HEAD@{1}
0aee51f HEAD@{10}: reset: moving to HEAD@{4}
290e035 HEAD@{11}: reset: moving to HEAD^
9e77426 HEAD@{12}: reset: moving to HEAD^
eb48179 HEAD@{13}: reset: moving to HEAD~
f916d93 HEAD@{14}: reset: moving to HEAD~
0aee51f HEAD@{15}: reset: moving to HEAD@{5}
f19fd9b HEAD@{16}: reset: moving to HEAD~1
290e035 HEAD@{17}: reset: moving to HEAD~2
eb48179 HEAD@{18}: reset: moving to HEAD~2
0aee51f HEAD@{19}: reset: moving to HEAD@{5}
eb48179 HEAD@{20}: reset: moving to HEAD~2
0aee51f HEAD@{21}: reset: moving to HEAD@{1}
f916d93 HEAD@{22}: reset: moving to HEAD@{1}
0aee51f HEAD@{23}: reset: moving to HEAD@{1}
f916d93 HEAD@{24}: reset: moving to HEAD^
0aee51f HEAD@{25}: commit (amend): 3rd commmit
35a7332 HEAD@{26}: checkout: moving from temp2_new_br to temp2_new_br
35a7332 HEAD@{27}: commit (amend): 3rd commmit
72c0be8 HEAD@{28}: commit (amend): 3rd commmit
ตัวอย่างอาจเป็นได้ว่าฉันไม่ท้องถิ่นกระทำ a-> B-> C-> d และจากนั้นผมก็กลับทิ้ง 2 มุ่งมั่นที่จะตรวจสอบรหัสของฉัน - git reset HEAD~2
- และแล้วหลังจากที่ฉันต้องการที่จะย้ายกลับหัวของฉันไป d git reset HEAD@{1}
-
แบบง่าย :
~
ระบุบรรพบุรุษ^
ระบุผู้ปกครองคุณสามารถระบุสาขาหนึ่งสาขาขึ้นไปเมื่อทำการผสาน จากนั้นคอมมิทจะมีพ่อแม่สองคนขึ้นไปและจากนั้น^
จะเป็นประโยชน์ในการระบุผู้ปกครอง
สมมติว่าคุณอยู่ในสาขาและคุณมีสองสาขาเพิ่มเติมได้ที่: BและC
ในแต่ละสาขาการกระทำครั้งสุดท้ายสามครั้งคือ:
หากตอนนี้ที่สาขาAคุณดำเนินการคำสั่ง:
git merge B C
ถ้าคุณรวมสาขาสามสาขาเข้าด้วยกัน (ที่นี่การรวมของคุณมีผู้ปกครองสามคน)
และ
~
แสดงบรรพบุรุษที่ไม่อยู่ในสาขาแรกดังนั้น
HEAD~
หมายถึงA3HEAD~2
หมายถึงA2HEAD~3
หมายถึงA1^
หมายถึงผู้ปกครอง n'th ดังนั้น
HEAD^
หมายถึงA3HEAD^2
หมายถึงB3HEAD^3
บ่งชี้C3การใช้งานครั้งถัดไป~
หรือ^
ถัดจากกันและกันอยู่ในบริบทของการคอมมิทที่กำหนดโดยตัวละครก่อนหน้า
ประกาศ 1 :
HEAD~3
เท่ากับ: HEAD~~~
และถึง: HEAD^^^
(ทุกตัวบ่งชี้A1 ),และโดยทั่วไป :
HEAD~n
เท่ากับ: HEAD~...~
( nครั้ง~
) และ: HEAD^...^
( nครั้ง^
)แจ้งให้ทราบ 2 :
HEAD^3
คือไม่ได้เช่นเดียวกับHEAD^^^
(ที่บ่งชี้แรกC3และครั้งที่สองที่บ่งชี้A1 )และโดยทั่วไป :
HEAD^1
เป็นเช่นเดียวกับHEAD^
,HEAD^n
จะไม่เหมือนกับHEAD^...^
( nครั้ง~
) เสมอTLDR
~ คือสิ่งที่คุณต้องการมากที่สุดของเวลามันอ้างอิงที่ผ่านมามุ่งมั่นที่จะสาขาปัจจุบัน
^ ผู้ปกครองอ้างอิง (git-merge สร้างผู้ปกครองที่ 2 ขึ้นไป)
A ~ เสมอเหมือนกับ A ^
A ~~ เสมอเหมือนกับ A ^^ และ
A ~ 2 ไม่เหมือนกับ A ^ 2 อย่างไรก็ตาม
เนื่องจาก ~ 2 เป็นการย่อสำหรับ ~~
ในขณะที่ ^ 2 ไม่ การจดชวเลขอะไรก็หมายความว่าผู้ปกครองคนที่ 2
HEAD ^^^ เหมือนกับ HEAD ~ 3 โดยเลือกการกระทำที่สามก่อนที่ HEAD
HEAD ^ 2 ระบุส่วนหัวที่สองในการคอมมิชชันผสาน
HEAD ~ ระบุพาเรนต์แรกบน "branch"
HEAD ^ อนุญาตให้คุณเลือกพาเรนต์เฉพาะของการส่ง
ตัวอย่าง:
หากคุณต้องการติดตามสาขาคุณต้องระบุสิ่งที่ชอบ
master~209^2~15
ใส่เพียงสำหรับระดับแรกของบิดามารดา (บรรพบุรุษตระกูลเชื้อสายและอื่น ๆ ) HEAD ^ และ HEAD ~ ทั้งคู่ชี้ไปที่กระทำเดียวกันซึ่งคือ (อยู่) ผู้ปกครองคนหนึ่งเหนือศีรษะ (กระทำ)
นอกจากนี้ HEAD ^ = HEAD ^ 1 = HEAD ~ = HEAD ~ 1 แต่ HEAD ^^! = HEAD ^ 2! = HEAD ~ 2 ยังเป็นหัวหน้า ^^ = HEAD ~ 2 อ่านต่อ.
นอกเหนือจากระดับแรกของการเป็นบิดามารดาสิ่งต่าง ๆ มีความซับซ้อนโดยเฉพาะอย่างยิ่งถ้าสาขาที่ทำงาน / สาขาหลักมีการผสาน (จากสาขาอื่น) นอกจากนี้ยังมีเรื่องเกี่ยวกับไวยากรณ์ของเครื่องหมายรูปหมวกด้วย HEAD ^^ = HEAD ~ 2 (เทียบเท่ากัน) แต่ HEAD ^^! = HEAD ^ 2 (ทั้งสองต่างกันอย่างสิ้นเชิง)
แต่ละคาเร็ตหมายถึงพ่อแม่คนแรกของ HEAD ซึ่งเป็นเหตุผลว่าทำไมคาเร็ตเข้าด้วยกันนั้นเทียบเท่ากับการแสดงออกของตัวหนอนเพราะพวกมันอ้างถึงพ่อแม่คนแรกของพ่อแม่คนแรก (พ่อแม่คนแรก) เป็นต้นเป็นต้น หรือตามจำนวนตัวหนอน (อย่างใดอย่างหนึ่งพวกเขาทั้งสองหมายถึงสิ่งเดียวกัน) คืออยู่กับผู้ปกครองคนแรกและขึ้นไปรุ่น x
HEAD ~ 2 (หรือ HEAD ^^) หมายถึงการกระทำที่เป็นบรรพบุรุษสองระดับขึ้นไป / การกระทำปัจจุบัน (HEAD) ในลำดับชั้นหมายถึงการกระทำของปู่ย่าตายาย
ในทางกลับกัน HEAD ^ 2 หมายถึงไม่ใช่การกระทำของผู้ปกครองคนที่สองของผู้ปกครองคนแรก แต่เพียงแค่การกระทำที่ผู้ปกครองที่สอง นั่นเป็นเพราะเครื่องหมายรูปหมวกหมายถึงผู้ปกครองของการกระทำและจำนวนต่อไปนี้หมายถึงสิ่งที่ผู้ปกครองกระทำ / สิ่งที่เรียกว่า (ผู้ปกครองคนแรกในกรณีที่ผู้ดูแลไม่ได้ตามด้วยหมายเลข [เพราะมันเป็นย่อสำหรับหมายเลข เป็น 1 หมายถึงผู้ปกครองคนแรก]) ต่างจากคาเร็ตตัวเลขที่ตามมาหลังจากนั้นไม่ได้บ่งบอกถึงลำดับชั้นของอีกระดับหนึ่ง แต่มันบอกเป็นนัย ๆ ว่ามีกี่ระดับด้านข้างในลำดับชั้นเราต้องไปหาพาเรนต์ที่ถูกต้อง (คอมมิชชัน) ไม่เหมือนกับตัวเลขในนิพจน์ tilde เป็นเพียงพาเรนต์เดียวในลำดับชั้นโดยไม่คำนึงถึงหมายเลข (ทันที) ดำเนินการคาเร็ต แทนที่จะขึ้นด้านบนเครื่องหมายรูปหมวก '
ดังนั้น HEAD ^ 3 จึงเท่ากับบิดามารดาคนที่สามของ HEAD (ไม่ใช่ปู่ย่าตายายที่ยิ่งใหญ่ซึ่งเป็นสิ่งที่ HEAD ^^^ และ HEAD ~ 3 จะเป็น ... )
~
นี่หมายถึงผู้ปกครอง
^
หากมีผู้ปกครองสองคนขึ้นไปเช่นการรวมการกระทำเราสามารถเลือกที่สองของผู้ปกครองหรืออื่น
ดังนั้นหากสิ่งหนึ่งเช่น (HEAD ~ หรือ HEAD ^) มันมีผลลัพธ์เหมือนกัน