В чем разница между HEAD ^ и HEAD ~ в Git?

Самый простой способ, который я обнаружил, чтобы обойти спецификацию

BufferedReader br = new BufferedReader(new InputStreamReader(fis));    
while ((currentLine = br.readLine()) != null) {
                    //case of, remove the BOM of UTF-8 BOM
                    currentLine = currentLine.replace("","");
634
задан mkobit 31 August 2015 в 20:20
поделиться

5 ответов

Эмпирические правила

  • В большинстве случаев используйте ~ - чтобы вернуться на несколько поколений назад, обычно то, что вам нужно.
  • Используйте ^ при коммитах слияния - потому что у них есть два или более (непосредственных) родителя

Мнемоника:

  • Тильда ~ почти линейна по внешнему виду и хочет идти назад по прямой
  • Карет ^ предлагает интересный сегмент дерева или развилку на дороге

Тильда

Раздел «Указание редакций» документации git rev-parse определяет ~ как

~ , например master ~ 3
Суффикс ~ параметра версии означает, что объект фиксации является предком n -го поколения указанного объекта фиксации, после только первые родители. [Например,] ~ 3 эквивалентно ^^^ , что эквивалентно ^ 1 ^ 1 ^ 1

Вы можете получить доступ к родителям любого коммита, а не только HEAD . Вы также можете вернуться к предыдущим поколениям: например, master ~ 2 означает прародителя вершины основной ветки, отдавая предпочтение первому родителю при коммитах слияния.

Caret

История Git нелинейна: ориентированный ациклический граф (DAG) или дерево. Для фиксации только с одним родителем rev ~ и rev ^ означают одно и то же. Селектор каретки становится полезным при коммитах слияния, потому что каждый из них является потомком двух или более родителей - и искажает язык, заимствованный из биологии.

HEAD ^ означает первый непосредственный родительский элемент вершины текущей ветви. HEAD ^ - это сокращение от HEAD ^ 1 , и вы также можете обращаться к HEAD ^ 2 и т. Д. По мере необходимости. В том же разделе документации git rev-parse он определяется как

^ , например. HEAD ^ , v1.5.1 ^ 0
Суффикс ^ параметра редакции означает первого родителя этого объекта фиксации. ^ означает n -й родитель ([ например, ] ^ эквивалентно ^ 1 ). В качестве особого правила ^ 0 означает саму фиксацию и используется, когда - это имя объекта объекта тега, который ссылается на объект фиксации.

Примеры

Эти спецификаторы или селекторы могут быть связаны произвольно, например. , тема ~ 3 ^ 2 на английском языке является вторым родителем коммита слияния, который является прародителем (три поколения назад) текущей вершины ветки тема .

Вышеупомянутый раздел документации git rev-parse отслеживает множество путей через условную историю git. Время в основном течет вниз. Коммиты D, F, B и A - это коммиты слиянием.

Вот иллюстрация Джона Лелигера. Оба узла фиксации B и C являются родителями узла фиксации A. Родительские фиксации упорядочены слева направо.

 G H I J 
 \ / \ / 
D E F 
 \ | / \ 
 \ | / | 
 \ | / | 
BC 
 \ / 
 \ / 
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'";

Он добавляет псевдонимы в новое одноразовое репо только для 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 
Слияние: c670b1f876 649bf3a42f b67d40adbb 
Автор: Джунио С. Хамано (скрыто) 
Дата: пн, 29 октября, 10:15:31, 2018 г. + } 
Объединить ветки 'bp / reset-quiet' и 'js / mingw-http-ssl' в 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
660
ответ дан 22 November 2019 в 21:40
поделиться

~ это означает родителя родителя.

^, если это имеет родителей два или больше, как фиксация слияния, мы можем выбрать родителя вторых или другого.

поэтому, если всего одна вещь как (ВОЗГЛАВЛЯЮТ ~ или HEAD^), он имеет тот же результаты.

0
ответ дан 22 November 2019 в 21:40
поделиться

HEAD ^^^ совпадает с HEAD ~ 3, выбор третьей фиксации перед HEAD

HEAD ^ 2 указывает вторую голову в фиксации слияния

10
ответ дан 22 November 2019 в 21:40
поделиться
  • HEAD ~ определяет первого родителя в «ветке»

  • HEAD ^ позволяет вам выбрать конкретного родителя коммита

Пример:

Если вы хотите следовать по боковой ветви, вы должны указать что-то вроде

master~209^2~15
8
ответ дан 22 November 2019 в 21:40
поделиться

Формат ^ позволяет выбрать n-го родителя фиксации (актуально при слияниях). Формат ~ позволяет вам выбрать коммит n-го предка, всегда следующий за первым предком. См. Документацию git-rev-parse для некоторых примеров.

31
ответ дан 22 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: