Самый простой способ, который я обнаружил, чтобы обойти спецификацию
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
while ((currentLine = br.readLine()) != null) {
//case of, remove the BOM of UTF-8 BOM
currentLine = currentLine.replace("","");
~
- чтобы вернуться на несколько поколений назад, обычно то, что вам нужно. ^
при коммитах слияния - потому что у них есть два или более (непосредственных) родителя Мнемоника:
~
почти линейна по внешнему виду и хочет идти назад по прямой ^
предлагает интересный сегмент дерева или развилку на дороге Раздел «Указание редакций» документации git rev-parse
определяет ~
как
, например
~ master ~ 3
Суффикс~
параметра версии означает, что объект фиксации является предком n -го поколения указанного объекта фиксации, после только первые родители. [Например,]эквивалентно
~ 3 , что эквивалентно
^^^ …
^ 1 ^ 1 ^ 1
Вы можете получить доступ к родителям любого коммита, а не только HEAD
. Вы также можете вернуться к предыдущим поколениям: например, master ~ 2
означает прародителя вершины основной ветки, отдавая предпочтение первому родителю при коммитах слияния.
История 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
~
это означает родителя родителя.
^
, если это имеет родителей два или больше, как фиксация слияния, мы можем выбрать родителя вторых или другого.
поэтому, если всего одна вещь как (ВОЗГЛАВЛЯЮТ ~ или HEAD^), он имеет тот же результаты.
HEAD ^^^ совпадает с HEAD ~ 3, выбор третьей фиксации перед HEAD
HEAD ^ 2 указывает вторую голову в фиксации слияния
HEAD ~ определяет первого родителя в «ветке»
HEAD ^ позволяет вам выбрать конкретного родителя коммита
Пример:
Если вы хотите следовать по боковой ветви, вы должны указать что-то вроде
master~209^2~15
Формат ^
позволяет выбрать n-го родителя фиксации (актуально при слияниях). Формат ~
позволяет вам выбрать коммит n-го предка, всегда следующий за первым предком. См. Документацию git-rev-parse для некоторых примеров.