Jaka jest różnica między HEAD^ a HEAD~ w Git?

Kiedy określam obiekt commit przodka w Git, jestem zdezorientowany pomiędzy HEAD^ i HEAD~.

Oba mają "numerowaną" wersję jak HEAD^3 i HEAD~2.

Wydają mi się bardzo podobne lub takie same, ale czy są jakieś różnice między tyldą a karetą?

 848
git
Author: mkobit, 2010-02-08

16 answers

Zasady kciuka

  • używaj ~ przez większość czasu-aby cofnąć się o kilka pokoleń, zwykle to, co chcesz
  • Użyj ^ przy merge commits-ponieważ mają dwa lub więcej (bezpośrednich) rodziców

Mnemotechnika:

    Tylda ma niemal liniowy wygląd i chce się cofać w linii prostej.]} Jest to jeden z najbardziej znanych i cenionych na świecie gatunków drzew.]}

Tilde

The sekcja "określanie zmian" dokumentacji git rev-parse definiuje ~ jako

<rev>~<n>, np. master~3
Przyrostek ~<n> do parametru revision oznacza obiekt commit, który jest nTH generacja przodka nazwanego obiektu commit, podążającego tylko za pierwszymi rodzicami. Na przykład, {[18] } jest równoważne {[19] } co jest równoważne <rev>^1^1^1 ...

Możesz dostać się do rodziców każdego, nie tylko HEAD. Możesz również przenieść back through generations: na przykład master~2 oznacza dziadka wierzchołka gałęzi master, faworyzującego pierwszego rodzica przy łączeniu commitów.

Caret

Historia Gita jest nieliniowa: ukierunkowany Graf acykliczny (dag) lub drzewo. Dla commita z jednym rodzicem, rev~ i rev^ oznaczają to samo. Selektor caret staje się przydatny przy commitach merge, ponieważ każdy z nich jest dzieckiem dwóch lub więcej rodziców - i szczepi język zapożyczony z biologii.

HEAD^ oznacza pierwszy bezpośredni rodzic końcówki bieżącej gałęzi. {[25] } jest skrótem od HEAD^1, i możesz również adresować HEAD^2 i tak dalej, odpowiednio. W 1999 roku w ramach projektu "Budowa drogi mlecznej" rozpoczęto budowę linii kolejowej nr 100.]}

<rev>^, np. HEAD^, v1.5.1^0
Przyrostek ^ do parametru revision oznacza pierwszy rodzic tego obiektu zatwierdzania. ^<n>oznacza nTH parent ([ np.] <rev>^ jest równoważne <rev>^1). Jako specjalna reguła <rev>^0 oznacza sam commit i jest używana, gdy {[38] } jest nazwą obiektu znacznika, który odnosi się do obiektu commit.

Przykłady

Te specyfikatory lub selektory mogą być dowolnie łańcuchowane, np., topic~3^2 w języku angielskim jest drugim rodzicem commit merge, który jest pradziadkiem (trzy pokolenia wstecz) aktualnej końcówki gałęzi {40]}.

Wspomniany fragment git rev-parse dokumentacji śledzi wiele ścieżki przez hipotetyczną historię Gita. Czas płynie ogólnie w dół. Commity D, F, B I A są commitami scalającymi.

Oto ilustracja autorstwa Jona Loeligera. Oba węzły commit B I C są rodzicami węzła commit A. commity nadrzędne są uporządkowane od lewej do prawej. (Uwaga: polecenie git log --graph wyświetla historię w odwrotnej kolejności.)
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

Uruchom poniższy kod, aby utworzyć repozytorium git, którego historia pasuje do cytowanej ilustracji.

#! /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'";

Dodaje aliasy w nowym repo tylko dla git lol oraz git lola możesz więc przeglądać historię tak jak w

$ 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

Zauważ, że na twoim komputerze nazwy obiektów SHA-1 będą się różnić od powyższych, ale znaczniki pozwalają na adresowanie commitów po nazwie i sprawdzanie ich zrozumienia.

$ 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

The "określanie zmian" w git rev-parse dokumentacja jest pełna świetnych informacji i warta dogłębnej lektury. Zobacz także Git Tools-Revision Selection z książki Pro Git.

Kolejność commitów rodzica

Commit 89e4fcb0dd z własnej historii Gita jest commitem scalającym, jak wskazuje git show 89e4fcb0dd linia nagłówka scalającego, która wyświetla nazwy obiektów najbliższych przodków.

commit 89e4fcb0dd01b42e82b8f27f9a575111a26844df
Merge: c670b1f876 649bf3a42f b67d40adbb
Author: Junio C Hamano <[email protected]>
Date:   Mon Oct 29 10:15:31 2018 +0900

    Merge branches 'bp/reset-quiet' and 'js/mingw-http-ssl' into nd/config-split […]

Możemy potwierdzić zamówienie, prosząc git rev-parse o pokazanie kolejnych rodziców 89e4fcb0dd.

$ git rev-parse 89e4fcb0dd^1 89e4fcb0dd^2 89e4fcb0dd^3
c670b1f876521c9f7cd40184bf7ed05aad843433
649bf3a42f344e71b1b5a7f562576f911a1f7423
b67d40adbbaf4f5c4898001bf062a9fd67e43368

Odpytywanie nieistniejącego czwartego rodzica powoduje błąd.

$ 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>...]'

Jeśli chcesz wyodrębnić tylko dla rodziców, użyj ładnego formatu %P dla pełnych hashów

$ git log -1 --pretty=%P 89e4fcb0dd
c670b1f876521c9f7cd40184bf7ed05aad843433 649bf3a42f344e71b1b5a7f562576f911a1f7423 b67d40adbbaf4f5c4898001bf062a9fd67e43368

Lub %p dla skróconych rodziców.

$ git log -1 --pretty=%p 89e4fcb0dd
c670b1f876 649bf3a42f b67d40adbb
 892
Author: Greg Bacon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-31 18:32:54

Różnica między HEAD^ i HEAD~ jest dobrze opisana przez ilustrację (autorstwa Jona Loeligera) znalezioną na http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html .

Ta dokumentacja może być nieco niejasna dla początkujących, więc odtworzyłem tę ilustrację poniżej:

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
 347
Author: g_fred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-17 16:24:54

Zarówno ~ jak i ^ same odnoszą się do rodzica commita (~~ i ^^ Oba odnoszą się do commita dziadków itp.), Ale różnią się one znaczeniem, gdy są używane z liczbami:

  • ~2 oznacza dwa poziomy w hierarchii , poprzez pierwszego rodzica, jeśli commit ma więcej niż jednego rodzica

  • ^2 oznacza drugi rodzic gdzie commit ma więcej niż jednego rodzica (tzn. ponieważ jest to merge)

Te mogą być połączone, więc HEAD~2^3 oznacza HEAD's dziadkowy commit' s third rodzic commit.

 303
Author: Matthew Strawbridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-08 09:37:15

Moje dwa centy...

Tutaj wpisz opis obrazka

 288
Author: Alex Janzik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 22:57:23

Oto bardzo dobre wyjaśnienie zaczerpnięte dosłownie z http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde :

ref~ jest skrótem ref~1 i oznacza pierwszego rodzica commita. ref~2 oznacza pierwszego rodzica commita. ref~3 oznacza pierwszy rodzic commita. I tak dalej.

ref^ jest skrótem ref^1 i oznacza pierwszego rodzica commita. Ale gdzie dwa różnią się, to ref^2 oznacza drugi rodzic commita (pamiętaj, że commity mogą mieć dwoje rodziców, gdy są połączeniem).

Operatory ^ i ~ można łączyć.

Tutaj wpisz opis obrazka

 71
Author: dr_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Format ^<n> pozwala wybrać n-ty rodzic commita (istotny w połączeniach). Format ~<n> pozwala wybrać n-ty commit przodka, zawsze po pierwszym rodzicu. Niektóre przykłady można znaleźć w dokumentacji git-rev-parse.

 34
Author: jamessan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-29 07:47:53

Warto zauważyć, że git posiada również składnię do śledzenia "from-where-you-came" / "want-to-go-back-now" - na przykład, HEAD@{1} będzie odwoływać się do miejsca, z którego przeskoczyłeś do nowej lokalizacji zatwierdzania.

Zasadniczo HEAD@{} zmienne przechwytują historię ruchu głowicy i możesz zdecydować się na użycie konkretnej głowicy, patrząc na reflogs git za pomocą polecenia git reflog.

Przykład:

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

Przykładem może być to, że zrobiłem local-commits a->b->c - > d i wróciłem odrzucenie 2 zobowiązuje się sprawdzić mój kod - git reset HEAD~2 - a potem chcę przenieść głowę z powrotem do d - git reset HEAD@{1}.

 23
Author: ashish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 17:54:09

Uproszczone :

  • ~ określa przodków
  • ^ określa rodziców

Możesz określić jedną lub więcej gałęzi podczas scalania. Wtedy commit ma dwóch lub więcej rodziców i wtedy {[2] } jest przydatne do wskazania rodziców.

Załóżmy, że jesteś na gałęzi A i masz jeszcze dwie gałęzie: B i C .

Na każdej gałęzi trzy ostatnie commity to:

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

Jeśli teraz na gałęzi A wykonujesz polecenie:

git merge B C

Następnie łączysz trzy gałęzie razem (tutaj twój merge commit ma trzech rodziców)

I

~ wskazuje n ' - ty przodek w pierwszej gałęzi, więc

  • HEAD~ A3
  • HEAD~2 A2
  • HEAD~3 A1

^ oznacza rodzica n ' tego, więc

  • HEAD^ A3
  • HEAD^2 B3
  • HEAD^3 C3

Następne użycie ~ lub ^ obok siebie jest w kontekście commitu wyznaczonego przez poprzednie postaci.

Zawiadomienie 1:

  • HEAD~3 jest zawsze równa: HEAD~~~ i: HEAD^^^ (każdy wskazuje A1),

I ogólnie :

  • HEAD~n jest zawsze równa: HEAD~...~ (N razy ~) i do: HEAD^...^ (N razy ^).

Zawiadomienie 2:

  • HEAD^3 jest Nie to samo co HEAD^^^ (pierwszy wskazuje C3 a drugi wskazuje A1),

I ogólnie :

  • HEAD^1 jest tym samym co HEAD^,
  • ale dla n > 1: HEAD^n jest zawsze a nie to samo co HEAD^...^ (N razy ~).
 22
Author: simhumileco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-04 02:45:02

TLDR

~ jest tym, czego chcesz przez większość czasu, odwołuje się do poprzednich commitów do bieżącej gałęzi

^ odwołuje się do rodziców (git-merge tworzy drugi rodzic lub więcej)

A~ jest zawsze takie samo jak a^
A~ ~ jest zawsze takie samo jak a^^ i tak dalej
A~2 to nie to samo co a^2 jednak,
ponieważ ~2 jest skrótem od ~~
podczas gdy ^2 nie jest skrótem od niczego, oznacza to 2. rodzic

 17
Author: WeakPointer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-26 16:36:21

HEAD^^ jest tym samym co HEAD~3, wybierając trzeci commit przed HEAD

HEAD^2 określa drugi head w commicie scalającym

 11
Author: knittl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-08 13:01:31
  • HEAD~ określa pierwszego rodzica na"gałęzi"

  • HEAD^ pozwala wybrać konkretny rodzic commita

Przykład:

Jeśli chcesz podążać za boczną gałęzią, musisz podać coś w rodzaju

master~209^2~15
 9
Author: Diego Dias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-08 22:51:43

Rzeczywisty przykład różnicy między głową~ i głową^

HEAD^ VS HEAD~

 6
Author: Anas Alpure,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

~ to znaczy rodzic.

^ jeśli ma rodziców dwóch lub więcej, np. merge commit, możemy wybrać drugi rodzica lub inny.

Więc jeśli tylko jedna rzecz jak (HEAD~ lub HEAD^), ma same wyniki.

 1
Author: Margaux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-17 06:50:33

^ Selektor gałęzi
git checkout HEAD^2
Zaznacza drugą gałąź commita (merge), przechodząc do wybranej gałęzi (jeden krok wstecz na drzewie commitów)

~ COMMIT Selector
git checkout HEAD~2
Przesuwa 2 commity do tyłu na domyślnej / wybranej gałęzi


Definiowanie zarówno~, jak i ^ względnych referencji jako selektorów rodzicielskich jest zdecydowanie dominującą definicją opublikowaną wszędzie w Internecie, z którą do tej pory się natknąłem - w tym oficjalnym Git Book. Tak, są to selektory nadrzędne, ale problem z tym "wyjaśnieniem" polega na tym, że jest to całkowicie sprzeczne z naszym celem: czyli jak rozróżnić te dwa... :)

Inny problem polega na tym, że zachęcamy do użycia selektora gałęzi ^ do wyboru zmian (aka HEAD^ = = HEAD~).
Ponownie, tak, możesz go używać w ten sposób, ale nie jest to jego przeznaczony cel. Zachowanie selektora gałęzi ^ do tyłu jest efektem ubocznym, a nie jego celem.

Tylko przy scalonych commitach, czy numer należy przypisać do selektora gałęzi^. W związku z tym jego pełną zdolność produkcyjną można wykorzystać tylko wtedy, gdy istnieje potrzeba wyboru między oddziałami. Najprostszym sposobem wyrażenia zaznaczenia w forku jest przejście na wybraną ścieżkę / gałąź - to jest jeden krok wstecz na drzewie zatwierdzeń. Jest to tylko efekt uboczny, a nie jego główny cel.

 1
Author: Rich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-02 14:45:03

Mówiąc najprościej, dla pierwszego poziomu rodzicielstwa (pochodzenie, dziedziczenie, rodowód itp.) HEAD^ I HEAD~ oba wskazują na ten sam commit, który znajduje się (znajduje) jeden rodzic nad głową (commit).

Ponadto HEAD^ = HEAD^1 = HEAD~ = HEAD~1. Ale głowa^^ !/ Align = "left" // Align = "left" / Jednak głowa^^ = Głowa~2. Czytaj dalej.

Poza pierwszym poziomem rodzicielstwa, sprawy stają się trudniejsze, zwłaszcza jeśli działająca gałąź/gałąź master miała połączenia (z innych gałęzi). Jest też sprawa składnia z karetką, HEAD^^ = HEAD~2 (są równoważne) ale HEAD^^ != HEAD^2 (to zupełnie dwie różne rzeczy).

Każdy / karetka odnosi się do pierwszego rodzica głowy, dlatego karetki ułożone razem są równoważne wyrażeniom tyldy, ponieważ odnoszą się do pierwszego rodzica (pierwszego rodzica), itp., itd. oparte wyłącznie na liczbie na połączonych karetkach lub na liczbie po tyldzie (tak czy inaczej, obie oznaczają to samo), tzn. pozostają przy pierwszej rodzic i iść w górę x pokolenia.

HEAD~2 (lub HEAD^^) odnosi się do commita, który jest dwoma poziomami przodków w górę/powyżej bieżącego commita (głowy) w hierarchii, co oznacza commit dziadka głowy.

HEAD^2, z drugiej strony, odnosi się nie do commit pierwszego rodzica, ale po prostu do commit drugiego rodzica. Wynika to z faktu, że karetka oznacza rodzica commita, a Numer poniżej oznacza, do którego / do którego commita nadrzędnego się odnosi (pierwszy rodzica, w przypadku, gdy po karetce nie następuje liczba [ponieważ jest ona skrótem od liczby 1, czyli pierwszego rodzica]). W przeciwieństwie do karetki, liczba, która następuje po nim, nie oznacza kolejnego poziomu hierarchii w górę, ale raczej oznacza, ile poziomów na boki, w hierarchii, trzeba znaleźć właściwego rodzica (commit). W przeciwieństwie do liczby w wyrażeniu tyldy, jest ona tylko jednym rodzicem w hierarchii, niezależnie od liczby (bezpośrednio) postępującej karetka. Zamiast w górę, liczba końcowa opiekuna liczy się bokiem dla rodziców w całej hierarchii [na poziomie rodziców w górę, który jest równoważny liczbie kolejnych opiekunów].

Więc głowa^3 jest równa trzeciemu rodzicowi głowy (nie pradziadkowi, czyli tym, czym byłaby głowa^^ i głowa~3...).

 0
Author: Sean Tank Garvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-28 17:39:14

Jeśli zastanawiasz się, czy wpisać HEAD^ Czy HEAD~ w swoim poleceniu, po prostu użyj :

Obie są nazwami tego samego commita - pierwszego rodzica bieżącego commita.

Podobnie z master~ i master^ - obie nazwy dla pierwszego rodzica mistrza.

W taki sam sposób jak 2 + 2 i 2 x 2 są obie 4 - są różne sposoby dotarcia tam, ale odpowiedź jest taka sama.

To odpowiada na pytanie: Jaka jest różnica między HEAD^ I HEAD~ w Git?

Jeśli właśnie wykonałeś scalenie (tak, że Twój bieżący commit ma więcej niż jednego rodzica), lub nadal jesteś zainteresowany działaniem Careta i Tildy, zobacz inne odpowiedzi (których Nie będę powielał tutaj), aby uzyskać szczegółowe wyjaśnienie, a także Jak używać ich wielokrotnie (np.HEAD~~~) lub liczbami (np.HEAD^2). W przeciwnym razie, mam nadzieję, że ta odpowiedź zaoszczędzi ci trochę czasu.

 0
Author: M_M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-13 12:23:44