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-parse
dokumentasi 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>~3
setara 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~2
berarti 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^2
dan seterusnya sesuai kebutuhan. Bagian yang sama dari git rev-parse
dokumentasi 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^2
dalam 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-parse
dokumentasi 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 lol
dangit 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-parse
dokumentasi 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 89e4fcb0dd
ditunjukkan 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-parse
menunjukkan 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 %p
untuk orang tua pendek.
$ git log -1 --pretty=%p 89e4fcb0dd
c670b1f876 649bf3a42f b67d40adbb