Quy tắc của ngón tay cái
- Sử dụng
~
hầu hết thời gian - để quay lại một số thế hệ, thường là những gì bạn muốn
- Sử dụng
^
trên các cam kết hợp nhất - bởi vì họ có hai hoặc nhiều cha mẹ (ngay lập tức)
Ghi nhớ:
- Tilde
~
gần như tuyến tính về ngoại hình và muốn đi lùi theo đường thẳng
- Caret
^
gợi ý một đoạn thú vị của một cái cây hoặc ngã ba đường
Dấu ngã
Phần chỉ định bản sửa đổi Phần của phần cứng của git rev-parse
tài liệu định nghĩa ~
là
<rev>~<n>
, ví dụ:master~3
Hậu tố ~<n>
cho tham số sửa đổi có nghĩa là đối tượng cam kết là tổ tiên thế hệ thứ n của đối tượng cam kết được đặt tên, chỉ theo sau cha mẹ đầu tiên. Ví dụ, tương đương với đó là tương đương với ...<rev>~3
<rev>^^^
<rev>^1^1^1
Bạn có thể nhận được cho cha mẹ của bất kỳ cam kết, không chỉ HEAD
. Bạn cũng có thể di chuyển trở lại qua các thế hệ: ví dụ: master~2
có nghĩa là ông bà của đỉnh của nhánh chính, ưu tiên cha mẹ đầu tiên trên các cam kết hợp nhất.
Caret
Lịch sử Git là phi tuyến: biểu đồ chu kỳ có hướng (DAG) hoặc cây. Đối với một cam kết chỉ có một cha mẹ, rev~
và rev^
có nghĩa là điều tương tự. Bộ chọn caret trở nên hữu ích với các cam kết hợp nhất vì mỗi người là con của hai hoặc nhiều cha mẹ - và ngôn ngữ chủng được mượn từ sinh học.
HEAD^
có nghĩa là cha mẹ trực tiếp đầu tiên của đầu của chi nhánh hiện tại. HEAD^
là viết tắt của HEAD^1
, và bạn cũng có thể giải quyết HEAD^2
và như vậy là phù hợp. Phần tương tự của git rev-parse
tài liệu định nghĩa nó là
<rev>^
, Ví dụ HEAD^
,v1.5.1^0
một hậu tố ^
để một tham số sửa đổi có nghĩa là phụ huynh đầu tiên về điều đó cam kết đối tượng. ^<n>
có nghĩa là cha mẹ thứ n ([ ví dụ ] tương đương với ). Như một quy tắc đặc biệt, có nghĩa là bản thân cam kết và được sử dụng khi<rev>^
<rev>^1
<rev>^0
<rev>
là tên đối tượng của đối tượng thẻ tham chiếu đến đối tượng cam kết.
Ví dụ
Các bộ xác định hoặc bộ chọn này có thể được xâu chuỗi tùy ý, ví dụ , topic~3^2
trong tiếng Anh là cha mẹ thứ hai của cam kết hợp nhất là ông bà (ba thế hệ trở lại) của đầu hiện tại của chi nhánhtopic
.
Phần nói trên của git rev-parse
tài liệu theo dõi nhiều đường dẫn thông qua lịch sử git nổi tiếng. Thời gian thường chảy xuống. Các cam kết D, F, B và A là các cam kết hợp nhất.
Đây là một minh họa, bởi Jon Loeliger. Cả hai nút cam kết B và C là cha mẹ của nút cam kết A. Các cam kết cha mẹ được sắp xếp từ trái sang phải.
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
Chạy mã dưới đây để tạo một kho git có lịch sử phù hợp với hình minh họa được trích dẫ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'";
Nó chỉ thêm bí danh trong repo ném mới chỉ cho git lol
vàgit lola
vì vậy bạn có thể xem lịch sử như trong
$ 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
Lưu ý rằng trên máy của bạn, tên đối tượng SHA-1 sẽ khác với các tên trên, nhưng các thẻ cho phép bạn giải quyết các cam kết theo tên và kiểm tra sự hiểu biết của bạ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
Bản sửa đổi chỉ định của người dùng trong git rev-parse
tài liệu có đầy đủ thông tin tuyệt vời và đáng để đọc. Xem thêm Công cụ Git - Lựa chọn sửa đổi từ cuốn sách Pro Git .
Thứ tự cam kết của phụ huynh
Cam kết 89e4fcb0dd từ lịch sử của git là một cam kết hợp nhất, như git show 89e4fcb0dd
biểu thị với dòng tiêu đề Hợp nhất hiển thị tên đối tượng của tổ tiên ngay lập tức.
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 […]
Chúng tôi có thể xác nhận việc đặt hàng bằng cách yêu cầu git rev-parse
hiển thị cha mẹ ngay lập tức của 89e4fcb0dd.
$ git rev-parse 89e4fcb0dd^1 89e4fcb0dd^2 89e4fcb0dd^3
c670b1f876521c9f7cd40184bf7ed05aad843433
649bf3a42f344e71b1b5a7f562576f911a1f7423
b67d40adbbaf4f5c4898001bf062a9fd67e43368
Truy vấn cha mẹ thứ tư không tồn tại dẫn đến một lỗi.
$ 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>...]'
Nếu bạn chỉ muốn trích xuất cha mẹ, hãy sử dụng định dạng đẹp %P
cho toàn bộ băm
$ git log -1 --pretty=%P 89e4fcb0dd
c670b1f876521c9f7cd40184bf7ed05aad843433 649bf3a42f344e71b1b5a7f562576f911a1f7423 b67d40adbbaf4f5c4898001bf062a9fd67e43368
hoặc %p
cho cha mẹ viết tắt.
$ git log -1 --pretty=%p 89e4fcb0dd
c670b1f876 649bf3a42f b67d40adbb