Một cam kết git có thể có nhiều hơn 2 cha mẹ?


48

Trong tài liệu này, nó được đề cập

Một đối tượng cam kết có thể có bất kỳ số lượng phụ huynh.

Nhưng theo hiểu biết của tôi, trường hợp duy nhất mà một cam kết sẽ có nhiều hơn 1 cha mẹ là khi một sự hợp nhất đã xảy ra, và trong trường hợp đó sẽ chỉ có hai cha mẹ. Vì vậy, câu hỏi của tôi là, một cam kết có thể có nhiều hơn 2 cha mẹ? Nếu sau đó?


11
github.com/torvalds/linux/commit/ Mạnh - Tôi không nghĩ Github biết cách hiển thị một khác biệt 27 chiều, nhưng hãy thoải mái sao chép kho lưu trữ và xem nó.
dùng253751

Câu trả lời:


43

Bạn có thể sử dụng git merge để hợp nhất nhiều hơn một cam kết vào chi nhánh hiện tại của bạn. Từ man git-merge(hoặc git help merge):

git-merge - Tham gia hai hoặc nhiều lịch sử phát triển cùng nhau

Kết quả sẽ là một cam kết với hơn hai cha mẹ khi bạn làm điều đó.


33
Hợp nhất nhiều hơn một nhánh (tức là một cam kết có nhiều hơn hai cha mẹ) được gọi chung là "hợp nhất bạch tuộc". Đó cũng là nguồn cảm hứng cho logo và linh vật của GitHub, chú mèo tám chân: ban đầu nó được gọi là Octopuss, nhưng được đổi tên thành Octocat thân thiện với công ty hơn.
Jörg W Mittag

4
Những lợi thế của việc hợp nhất ba hoặc nhiều chi nhánh trong một cam kết duy nhất, thay vì một loạt các cam kết là gì?
Tor Klingberg 30/03/2016

2
@TorKlingberg Lịch sử sạch hơn, nhưng hãy đảm bảo kiểm tra sản phẩm cuối cùng trước khi đẩy đến đại diện từ xa.
Ferrybig 30/03/2016

5
@KasunSiyambalapitiya - Có nhiều ví dụ trong một repo github cụ thể . Một trong nhiều con bạch tuộc hợp nhất trong repo đó có sự tham gia của 27 phụ huynh .
David Hammen

1
@ JörgWMittag Theo nghĩa đen không có gì là đúng. Nguồn: làm việc tại GitHub trong năm năm.
gjtorikian

5

Có, bố mẹ 100k thì sao?

Dưới đây là một ví dụ GitHub trực tiếp với sự hợp nhất của 100 nghìn cam kết: https://github.com/cirosantilli/test-octopus-100k Được tạo bằng tập lệnh này .

Câu đố

Linus không thích cam kết với hơn 60 phụ huynh: https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

Nó đã được kéo, và nó ổn, nhưng rõ ràng có sự cân bằng giữa "sự hợp nhất của bạch tuộc là tốt" và "Chúa Kitô, đó không phải là một con bạch tuộc, đó là sự hợp nhất của Cthulhu".

Hãy xem định dạng cho đối tượng cam kết Git

https://stackoverflow.com/questions/22968856/what-is-the-file-format-of-a-git-commit-object/37438460#37438460

Từ phân tích đó, chúng ta có thể thấy rằng danh sách danh sách cha mẹ là một danh sách loại mới được phân tách tùy ý:

parent {parent_1_sha}
parent {parent_2_sha}
...
parent {parent_N_sha}

và vì vậy một số lượng phụ huynh tùy ý được cho phép.

Ví dụ tối thiểu

Kịch bản:

#!/usr/bin/env bash
set -eu

mkdir tmp
cd tmp
git init

touch root
git add .
git commit -m root
sha_root="$(git log -1 --format="%H")"

touch 1
git add .
git commit -m 1
sha1="$(git log -1 --format="%H")"

git reset --hard "$sha_root"
touch 2
git add .
git commit -m 2
sha2="$(git log -1 --format="%H")"

git reset --hard "$sha_root"
touch 3
git add .
git commit -m 3
sha3="$(git log -1 --format="%H")"

git merge -m merge "$sha1" "$sha2"

Đầu ra:

*-.   2d2a6c2 (HEAD -> master) merge
|\ \  
| | * 2300c18 2
| * | 7e096cb 1
| |/  
* | 50aa125 3
|/  
* a1e94fd root

Tôi không chắc chắn nếu GitHub không thể xử lý sự hợp nhất của cường độ đó hoặc nếu bạn đã để nó làm kho lưu trữ riêng tư. Hoặc nếu GitHub chỉ có một số vấn đề không liên quan. Nhưng bất kể, liên kết hợp nhất 100k là một lỗi 500 đối với tôi.
8bittree

@ 8bittree không thể xử lý, repo riêng sẽ là 400 :-) github.com/isaacs/github/issues/1344
Ciro Santilli 改造 心 心 事件

Mối liên hệ nào giữa những người yêu râu xanh đeo ủng hộ FOSS và Lovecraft mà tôi liên tục gặp phải?
Neutrino

3

Bạn có thể chỉ định nhiều hơn một chi nhánh khi hợp nhất.

Ví dụ:

git merge branch_A branch_B branch_C [...]

Rồi cam kết có thêm bố mẹ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.