Temel kurallar
~Çoğu zaman kullanın - genellikle istediğinizi istediğiniz birkaç nesile geri dönmek için
^Birleştirme taahhütlerinde kullanın - çünkü iki veya daha fazla (hemen) ebeveynleri var
Mnemonics:
- Tilde
~görünüşte neredeyse doğrusaldır ve düz bir çizgide geriye gitmek ister
- Caret
^, ilginç bir ağaç parçası veya yoldaki bir çatal önerir
Tilde
Ve “Belirleme Düzenlemeler” bölümü git rev-parse, onarım tanımlayıp ~olarak
<rev>~<n>Örneğinmaster~3
bir son ek ~<n>bir düzeltme parametresi olan nesne işlemek anlamına gelir n, inci adlı üretimi atası sadece ilk ebeveyn sonra, nesne işlemek. Örneğin, <rev>~3eşdeğerdir <rev>^^^eşdeğerdir hangi <rev>^1^1^1...
Sadece değil, herhangi bir taahhütten ebeveynlere de ulaşabilirsiniz HEAD. Nesiller arasında da geri gidebilirsiniz: örneğin, master~2ana dalın ucunun büyükanne veya büyükbaba anlamına gelir ve birleştirme taahhütlerinde ilk ebeveyni tercih eder.
Düzeltme işareti
Git geçmişi doğrusal değildir: yönlendirilmiş bir asiklik grafik (DAG) veya ağaç. Sadece bir ebeveyne bağlılık rev~ve rev^aynı şey demek. Caret seçici, birleştirme taahhütlerinde faydalı olur, çünkü her biri iki veya daha fazla ebeveynin çocuğudur - ve biyolojiden ödünç alınan dili zorlar.
HEAD^mevcut dalın ucunun ilk yakın ebeveyni anlamına gelir . HEAD^için kısadır HEAD^1ve ayrıca HEAD^2uygun şekilde adresleme vb. de yapabilirsiniz . Aynı kesiti git rev-parsebelgeleri olarak tanımlar
<rev>^, Örneğin HEAD^ ,v1.5.1^0
bir son ek ^bir düzeltme parametresine nesne işlemek bu ilk üst anlamına gelir. ^<n>anlamına gelir , n inci üst ([ örn ] <rev>^eşdeğerdir <rev>^1). Özel bir kural olarak, <rev>^0komutun kendisi <rev>anlamına gelir ve bir bitiş nesnesine başvuran bir etiket nesnesinin nesne adı olduğunda kullanılır .
Örnekler
Bu belirticilere veya seçiciler, keyfi olarak zincirleme edilebilir örneğin , topic~3^2İngiliz birleştirme ikinci üstüdür o (üç kuşak geriye) şubesi akım ucu büyük-büyükbaba olduğunu taahhüt topic.
Yukarıda bahsedilen bölüm git rev-parsebelgelerinde bir kavramsal git tarih boyunca birçok yolları izler. Zaman genellikle aşağı doğru akar. D, F, B ve A komisyonları birleştirme komisyonlarıdır.
İşte Jon Loeliger'den bir örnek. Hem B hem de C düğümleri A düğümünün A ebeveynleridir. Üst taahhütler soldan sağa doğru sıralanır.
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
Geçmişi alıntılanan çizimle eşleşen bir git deposu oluşturmak için aşağıdaki kodu çalıştırın.
#! /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'";
Yeni atılabilir depoya takma adlar ekler git lolvegit lola böylece geçmişi olduğu gibi görüntüleyebilirsiniz
$ 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
Makinenizde SHA-1 nesne adlarının yukarıdakilerden farklı olacağını, ancak etiketlerin taahhütleri ada göre ele almanızı ve anlayışınızı kontrol etmenizi sağladığını unutmayın.
$ 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
İçinde “belirtme Düzeltmeler” git rev-parsedokümantasyon büyük bilgi dolu ve değer derinlemesine bir okuma. Ayrıca bkz. Git Araçları - Pro Git kitabından Revizyon Seçimi .
Ana Taahhüt Sırası
Taahhüt 89e4fcb0dd olarak, git kendi geçmişinden bir birleştirme taahhüt olduğunu git show 89e4fcb0ddBirleştirme başlık satırından bu görüntüler hemen atalarının nesne adları ile gösterir.
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-parse89e4fcb0dd'nin anında ebeveynlerini sırayla göstermesini isteyerek siparişi onaylayabiliriz .
$ git rev-parse 89e4fcb0dd^1 89e4fcb0dd^2 89e4fcb0dd^3
c670b1f876521c9f7cd40184bf7ed05aad843433
649bf3a42f344e71b1b5a7f562576f911a1f7423
b67d40adbbaf4f5c4898001bf062a9fd67e43368
Var olmayan dördüncü üst öğeyi sorgulamak bir hatayla sonuçlanır.
$ 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>...]'
Yalnızca ebeveynleri ayıklamak istiyorsanız , tam karmalar için güzel format kullanın%P
$ git log -1 --pretty=%P 89e4fcb0dd
c670b1f876521c9f7cd40184bf7ed05aad843433 649bf3a42f344e71b1b5a7f562576f911a1f7423 b67d40adbbaf4f5c4898001bf062a9fd67e43368
veya %pkısaltılmış ebeveynler için.
$ git log -1 --pretty=%p 89e4fcb0dd
c670b1f876 649bf3a42f b67d40adbb