2010-04-20 90 views

回答

4

這是顯示父母的關係。在Git中,特定的提交知道它的父項,但不一定關於它的子項。 (顯然,這些信息可以根據家長的聯繫中得到,但我不認爲這是直接存儲在commit對象。)

+2

Correct - 提交對象的內容是提交的元數據(作者,提交者,消息),樹(目錄樹的內部表示)以及父提交的SHA1。也就是說,一個承諾通過SHA1「指向」其父母(而不是其子女),正如箭頭所示。 – Cascabel 2010-04-20 15:24:29

+0

這個箭讓我發狂。仍然理解爲什麼這些信息對於所有圖像都是必需的。 – 2010-04-20 15:36:40

+0

這些箭頭很有用,因爲您可以通過圖表中的箭頭告訴很多關於歷史的信息。例如,查看提交C3,C4和C5。從箭頭中可以看出,C3和C4共享一個以C2開始的共同歷史記錄(即它們每個都從C2分支出來),C5向我們顯示它是C3和C4合併的結果,這意味着它包含C3和C4的變化,以及這兩個提交的共同歷史。 – mipadi 2010-04-20 15:48:15

6

箭頭體現在這裏代表提交的在歷史的方向,接着一個DAG, Directed Acyclic Graph Git(從最近到最早)。

這表示是不是一個「完美」的一個,爲Eric Sink details in his article

一個關於基於DAG的版本控制工具的最酷的事情是,DAG是合併歷史的表達。我們將DAG中的箭頭解釋爲「我有這個」。

alt text

所以,當談到時間做從5B在合併到(一)分支,我們可以使用DAG中的信息,要知道,3B和2b已經完成


同一篇文章詳細介紹了代表性的限制:

Cherrypicking

但DAG只是一種實現,合併的歷史,它肯定是不完美的。

版本控制中的箭頭DAG從子項到父項。它告訴我們該孩子包含父母中的所有更改。和它的祖父母。和它的曾祖父母。等等。

但是,如果這不是事實呢?

請看下面的圖片:

alt text

我想創建變更4.
我想在變更1開始,然後我想申請從3變更的變化,但不是變更集2中的東西。
此操作有時稱爲「挑剔」。我不想將所有更改從一個分支合併到另一個分支。我只想採用一個變更集(或變更集的一部分)並將其作爲補丁應用於其他某個地方。

我該如何在DAG中表示這一點?

我不行。

  • 我可以畫一個箭頭從4到3(紅色如上所示)。這可以正確地說4包含3中的變化,但它會不當地聲稱4包含變化2.
  • 或者,我可以不繪製箭頭。實際上,我的合併歷史會簡單地不記錄的事實,4是真的3轉換成一個補丁,並應用於1

在這兩種情況下,壞事要發生下一次,我從一個分支合併其他:

  • 如果我繪製躺在箭,我不會給應用變更2的機會,因爲合併歷史認爲我已經做到了。
  • 如果我不繪製任何箭頭,該工具將指望我處理變更集3,因爲沒有合併歷史記錄我已經完成的事實。

這些問題都不足以造成晚間新聞災難,但仍然如此。

這就是爲什麼a rebase is never far經過櫻桃挑選操作後,爲了找回更經典的DAG。