ความแตกต่างระหว่าง HEAD ^ และ HEAD ~ ใน Git คืออะไร


756

เมื่อฉันระบุบรรพบุรุษกระทำวัตถุใน Git ฉันสับสนระหว่างและHEAD^HEAD~

ทั้งสองมี "หมายเลข" รุ่นที่เหมือนและHEAD^3HEAD~2

พวกมันดูคล้ายกันมากหรือเหมือนกับฉัน แต่มีความแตกต่างระหว่างตัวหนอนและเครื่องหมายรูปหมวกไหม?


64
มันไม่ดีที่จะวางลิงค์ฉันรู้ แต่นี่เป็นคำอธิบายที่ดีที่สุดที่ฉันพบและมีรูปภาพอยู่ในนั้น paulboxley.com/blog/2011/06/git-caret-and-tilde
igor

4
ลิงค์โดยเฉพาะอย่างยิ่งไม่ดีเมื่อพวกเขาเสีย นั่นคือเหตุผลว่าทำไมมันมีความปลอดภัยที่จะตอบคำถามที่ช่วยป้องกันการนี้เพราะความสามารถในการคัดลอกวางคำอธิบายบาง :)
ซามูเอล

คำตอบ:


763

กฎของหัวแม่มือ

  • ใช้~เวลาส่วนใหญ่เพื่อย้อนกลับไปหลายชั่วอายุคนโดยทั่วไปเป็นสิ่งที่คุณต้องการ
  • ใช้^ในการรวมการกระทำ - เพราะพวกเขามีผู้ปกครองสองคนขึ้นไป (ทันที)

จำ:

  • Tilde ~นั้นมีลักษณะเป็นเส้นตรงเกือบทั้งหมดและต้องการย้อนกลับเป็นเส้นตรง
  • Caret ^แนะนำส่วนที่น่าสนใจของต้นไม้หรือทางแยกในถนน

ตัวหนอน

“ระบุการแก้ไข” ของ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

ดูเหมือนว่า ^ สามารถรับมือกับทุกกรณีและใคร ๆ ก็สงสัยว่าทำไม ~ ปรากฏตัวตั้งแต่แรก ทำไมไม่จำได้ว่า ^ ทำงานอย่างไร
Sbu

นี่คือความสับสนอย่างยิ่ง ... สมมติว่า G คือ HEAD ดังนั้นถ้าฉันทำ HEAD ^ นั่นจะเป็น D ... ใช่ไหม?
Patoshi パトシ

12
@duckx กราฟกำลังดำเนินการจากบนลงล่างดังนั้น A จึงเป็นคอมมิชชันล่าสุดและ G เป็นหนึ่งในกราฟที่เก่าแก่ที่สุด เส้นทางจาก G ถึง D เป็นไปข้างหน้าไม่ใช่ถอยหลังจากสิ่งที่ฉันสามารถบอกได้
goldenratio

@SimonBudin ฉันเดาว่ามันไม่สะดวกที่จะใช้^^^^^^^แทน~7ใช่ไหม? นั่นเป็นเหตุผลที่~มีประโยชน์
YakovL

1
@AdityaVikasDevarapalli นั่นจะเป็นคำถามที่ดี
Greg Bacon

340

ความแตกต่างระหว่าง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

12
แค่คำถามเดียว เป็นไปได้อย่างไรที่ความมุ่งมั่นที่จะมีพ่อแม่มากกว่าสองคน? (ดู B - เป็นพ่อแม่คือ D, E และ F) ฉันคิดว่าวิธีเดียวที่กระทำได้จะมีพ่อแม่สองคนคือเมื่อรวมเป็นการกระทำ ... แต่คุณจะรวม 3 คอมมิทในเวลาเดียวกันได้อย่างไร
tsikov

หากฉันไม่เข้าใจผิดนี่อาจชัดเจน แต่ฉันคิดว่าควรระบุว่า HEAD ~ จะตามสาขาปัจจุบัน (เช่น Diego Dias ที่กล่าวถึงด้านล่าง)
fibono

2
นอกจากนี้, F = A^2^.
Mateen Ulhaq

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
อเล็กซานเด Torstling

1
@AlexanderTorstling สิ่งนี้มีประโยชน์มากสำหรับฉัน อย่างไรก็ตามซ้ายและขวาหมายถึงอะไรที่นี่?
polynomial_donut

287

ทั้งสอง~และ^ของตัวเองหมายถึงแม่ของกระทำ ( ~~และ^^ทั้งอ้างถึงปู่ย่าตายายกระทำ ฯลฯ ) แต่พวกเขามีความหมายแตกต่างกันในเมื่อพวกเขาถูกนำมาใช้กับตัวเลข:

  • ~2หมายถึงสองระดับในลำดับชั้นผ่านผู้ปกครองคนแรกถ้าการกระทำมีมากกว่าหนึ่งผู้ปกครอง

  • ^2หมายถึงผู้ปกครองที่สองที่การกระทำมีมากกว่าหนึ่งผู้ปกครอง (เช่นเพราะมันคือการผสาน)

สิ่งเหล่านี้สามารถนำมารวมกันได้ดังนั้นความHEAD~2^3หมายหลักHEADของการกระทำที่สามของปู่ย่าตายาย


2
การอ่านสิ่งนี้ตามด้วยรูปภาพจากstackoverflow.com/questions/2221658/…ทำให้รู้สึกที่สมบูรณ์แบบ
kunigami

23
นี่ควรเป็นคำตอบที่ได้รับการยอมรับรัดกุมและมีประโยชน์มากกว่าคำตอบอื่น ๆ
RichVel

3
คำตอบนี้ทำให้ฉันเห็นความแตกต่างระหว่างคาเร็ต / ตัวหนอนโดยไม่ต้องใช้ตัวเลขและมีจำนวน! ฉันคิดว่า^^เหมือนกัน^2แต่มันไม่ใช่
Alexander Derck

278

สองเซ็นต์ของฉัน ...

ป้อนคำอธิบายรูปภาพที่นี่


และH=A~2^2ได้H=A~2^1อย่างไร
Mohammad Faisal

3
ถ้าผมคิดว่ามันออกมาได้อย่างถูกต้องกระทำA, B, D, Gอยู่ในสาขาเดียวกันและกระทำDเป็นของการผสานGและHจึงมีพ่อแม่ทั้งสอง ดังนั้นการกระทำ ( H) จากสาขาอื่น ๆ ^2คือการอ้างอิงโดย
Mohammad Faisal

62

นี่คือคำอธิบายที่ดีมากที่นำคำต่อคำจากhttp://www.paulboxley.com/blog/2011/06/git-caret-and-tilde :

ref~จดชวเลขref~1และหมายถึงผู้ปกครองคนแรกของคอมมิท ref~2หมายถึงการปกครองแรกของผู้ปกครองคนแรกของ ref~3หมายถึงการกระทำของผู้ปกครองคนแรกของผู้ปกครองคนแรกของผู้ปกครองคนแรก และอื่น ๆ

ref^จดชวเลขref^1และหมายถึงผู้ปกครองคนแรกของคอมมิท แต่ในกรณีที่ทั้งสองแตกต่างกันนั่นref^2หมายถึงผู้ปกครองคนที่สองของการกระทำ (โปรดจำไว้ว่าการกระทำสามารถมีผู้ปกครองสองคนเมื่อพวกเขารวมกัน)

ตัวดำเนินการ^และ~สามารถรวมกันได้

ป้อนคำอธิบายรูปภาพที่นี่


5
ขอบคุณสำหรับการอธิบายความแตกต่างมากกว่าการโพสต์โฮสต์ตัวอย่าง
Kirk Broadhurst

32

^<n>รูปแบบให้คุณเลือกผู้ปกครองที่ n กระทำ (ที่เกี่ยวข้องในการผสาน) ~<n>รูปแบบให้คุณเลือกที่ n บรรพบุรุษกระทำเสมอต่อไปนี้ผู้ปกครองครั้งแรก ดูตัวอย่างเอกสารของgit-rev-parse


21

เป็นที่น่าสังเกตว่าคอมไพล์ยังมีไวยากรณ์สำหรับการติดตาม "จากที่ที่คุณมา" / "ต้องการที่จะกลับไปตอนนี้" - ตัวอย่างเช่น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}-


17

แบบง่าย :

  • ~ ระบุบรรพบุรุษ
  • ^ ระบุผู้ปกครอง

คุณสามารถระบุสาขาหนึ่งสาขาขึ้นไปเมื่อทำการผสาน จากนั้นคอมมิทจะมีพ่อแม่สองคนขึ้นไปและจากนั้น^จะเป็นประโยชน์ในการระบุผู้ปกครอง

สมมติว่าคุณอยู่ในสาขาและคุณมีสองสาขาเพิ่มเติมได้ที่: BและC

ในแต่ละสาขาการกระทำครั้งสุดท้ายสามครั้งคือ:

  • A : A1 , A2 , A3
  • B : B1 , B2 , B3
  • C : C1 , C3 , C3

หากตอนนี้ที่สาขาAคุณดำเนินการคำสั่ง:

git merge B C

ถ้าคุณรวมสาขาสามสาขาเข้าด้วยกัน (ที่นี่การรวมของคุณมีผู้ปกครองสามคน)

และ

~ แสดงบรรพบุรุษที่ไม่อยู่ในสาขาแรกดังนั้น

  • HEAD~หมายถึงA3
  • HEAD~2หมายถึงA2
  • HEAD~3หมายถึงA1

^ หมายถึงผู้ปกครอง n'th ดังนั้น

  • HEAD^หมายถึงA3
  • HEAD^2หมายถึงB3
  • HEAD^3บ่งชี้C3

การใช้งานครั้งถัดไป~หรือ^ถัดจากกันและกันอยู่ในบริบทของการคอมมิทที่กำหนดโดยตัวละครก่อนหน้า

ประกาศ 1 :

  • HEAD~3เท่ากับ: HEAD~~~และถึง: HEAD^^^(ทุกตัวบ่งชี้A1 ),

        และโดยทั่วไป :

  • HEAD~nเท่ากับ: HEAD~...~( nครั้ง~) และ: HEAD^...^( nครั้ง^)

แจ้งให้ทราบ 2 :

  • HEAD^3คือไม่ได้เช่นเดียวกับHEAD^^^(ที่บ่งชี้แรกC3และครั้งที่สองที่บ่งชี้A1 )

        และโดยทั่วไป :

  • HEAD^1เป็นเช่นเดียวกับHEAD^,
  • แต่สำหรับn > 1: HEAD^nจะไม่เหมือนกับHEAD^...^( nครั้ง~) เสมอ

15

TLDR

~ คือสิ่งที่คุณต้องการมากที่สุดของเวลามันอ้างอิงที่ผ่านมามุ่งมั่นที่จะสาขาปัจจุบัน

^ ผู้ปกครองอ้างอิง (git-merge สร้างผู้ปกครองที่ 2 ขึ้นไป)

A ~ เสมอเหมือนกับ A ^
A ~~ เสมอเหมือนกับ A ^^ และ
A ~ 2 ไม่เหมือนกับ A ^ 2 อย่างไรก็ตาม
เนื่องจาก ~ 2 เป็นการย่อสำหรับ ~~
ในขณะที่ ^ 2 ไม่ การจดชวเลขอะไรก็หมายความว่าผู้ปกครองคนที่ 2


11

HEAD ^^^ เหมือนกับ HEAD ~ 3 โดยเลือกการกระทำที่สามก่อนที่ HEAD

HEAD ^ 2 ระบุส่วนหัวที่สองในการคอมมิชชันผสาน


9
  • HEAD ~ ระบุพาเรนต์แรกบน "branch"

  • HEAD ^ อนุญาตให้คุณเลือกพาเรนต์เฉพาะของการส่ง

ตัวอย่าง:

หากคุณต้องการติดตามสาขาคุณต้องระบุสิ่งที่ชอบ

master~209^2~15


0

ใส่เพียงสำหรับระดับแรกของบิดามารดา (บรรพบุรุษตระกูลเชื้อสายและอื่น ๆ ) 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 จะเป็น ... )


-1

~ นี่หมายถึงผู้ปกครอง

^ หากมีผู้ปกครองสองคนขึ้นไปเช่นการรวมการกระทำเราสามารถเลือกที่สองของผู้ปกครองหรืออื่น

ดังนั้นหากสิ่งหนึ่งเช่น (HEAD ~ หรือ HEAD ^) มันมีผลลัพธ์เหมือนกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.