Aturan praktis
- Gunakan
~sebagian besar waktu - untuk kembali ke beberapa generasi, biasanya apa yang Anda inginkan
- Gunakan
^komitmen gabungan - karena mereka memiliki dua orang tua (langsung) atau lebih
Ilmu tentang cara menghafal:
- Tilde
~hampir linear dalam penampilan dan ingin mundur dalam garis lurus
- Caret
^menyarankan segmen yang menarik dari pohon atau garpu di jalan
Tilde
Bagian “Menentukan Revisi” dari git rev-parsedokumentasi ini didefinisikan ~sebagai
<rev>~<n>, Misalnyamaster~3
A akhiran ~<n>ke parameter revisi berarti komit objek yang adalah n th nenek moyang generasi bernama komit objek, berikut hanya orang tua pertama. Misalnya, <rev>~3setara dengan <rev>^^^yang setara dengan <rev>^1^1^1...
Anda dapat menjangkau orang tua dari komitmen apa pun, bukan hanya HEAD. Anda juga dapat bergerak turun-temurun: misalnya, master~2berarti kakek dari ujung cabang master, lebih menyukai orangtua pertama yang menggabungkan komitmen.
Tanda sisipan
Sejarah Git adalah nonlinier: grafik asiklik terarah (DAG) atau pohon. Untuk komit dengan hanya satu orangtua, rev~dan rev^berarti hal yang sama. Selektor tanda kuret menjadi berguna dengan menggabungkan komitmen karena masing-masing adalah anak dari dua atau lebih orang tua - dan bahasa yang dipinjam dari biologi.
HEAD^berarti induk langsung pertama dari ujung cabang saat ini. HEAD^kependekan dari HEAD^1, dan Anda juga bisa mengatasinya HEAD^2dan seterusnya sesuai kebutuhan. Bagian yang sama dari git rev-parsedokumentasi mendefinisikannya sebagai
<rev>^, misalnya HEAD^ ,v1.5.1^0
sufiks ^ke parameter revisi berarti induk pertama dari objek komit tersebut. ^<n>berarti orang tua ke- n ([ misalnya ] setara dengan ). Sebagai aturan khusus, berarti komit itu sendiri dan digunakan ketika adalah nama objek dari objek tag yang merujuk ke objek komit.<rev>^<rev>^1<rev>^0<rev>
Contohnya
Penentu atau penyeleksi ini dapat dirantai secara sewenang-wenang, misalnya , topic~3^2dalam bahasa Inggris adalah induk kedua dari komit gabungan yang merupakan kakek-nenek buyut (tiga generasi ke belakang) dari ujung cabang saat ini topic.
Bagian git rev-parsedokumentasi yang disebutkan di atas melacak banyak jalur melalui sejarah git nosional. Waktu mengalir secara umum ke bawah. Komit D, F, B, dan A adalah gabungan komit.
Ini sebuah ilustrasi, karya Jon Loeliger. Kedua node komit B dan C adalah orang tua dari node komit A. Komit induk diperintahkan dari kiri ke kanan.
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
Jalankan kode di bawah ini untuk membuat repositori git yang sejarahnya cocok dengan ilustrasi yang dikutip.
#! /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'";
Itu menambahkan alias di repo sekali pakai baru hanya untuk git loldangit lola sehingga Anda dapat melihat riwayat seperti di
$ 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
Perhatikan bahwa pada mesin Anda, nama objek SHA-1 akan berbeda dari yang di atas, tetapi tag memungkinkan Anda untuk mengatasi komit dengan nama dan memeriksa pemahaman Anda.
$ 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 “Menentukan Revisi” di git rev-parsedokumentasi penuh dengan informasi yang besar dan bernilai dibaca mendalam. Lihat juga Alat Git - Pilihan Revisi dari buku Pro Git .
Perintah Orangtua Berkomitmen
Komit 89e4fcb0dd dari sejarah git sendiri adalah gabungan komit, seperti yang git show 89e4fcb0ddditunjukkan dengan baris header Gabung yang menampilkan nama objek leluhur langsung.
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 […]
Kami dapat mengonfirmasi pemesanan dengan meminta git rev-parsemenunjukkan orang tua langsung 89e4fcb0dd secara berurutan.
$ git rev-parse 89e4fcb0dd^1 89e4fcb0dd^2 89e4fcb0dd^3
c670b1f876521c9f7cd40184bf7ed05aad843433
649bf3a42f344e71b1b5a7f562576f911a1f7423
b67d40adbbaf4f5c4898001bf062a9fd67e43368
Meminta orang tua keempat yang tidak ada menghasilkan kesalahan.
$ 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>...]'
Jika Anda ingin mengekstrak orang tua saja, gunakan format cantik %P untuk hash lengkap
$ git log -1 --pretty=%P 89e4fcb0dd
c670b1f876521c9f7cd40184bf7ed05aad843433 649bf3a42f344e71b1b5a7f562576f911a1f7423 b67d40adbbaf4f5c4898001bf062a9fd67e43368
atau %puntuk orang tua pendek.
$ git log -1 --pretty=%p 89e4fcb0dd
c670b1f876 649bf3a42f b67d40adbb