簡體   English   中英

新分支從復制的分支獲取所有先前的提交

[英]New branches get all previous commits from copied branch

如果我創建一個新分支,則來自復制分支的所有提交都將被復制到新分支。

我該如何阻止呢? 我想在新分支中添加新提交。

git中的提交包含對其父提交的引用。 這就是git生成存儲庫歷史的方式。

另一方面,分支僅指向特定的提交。 實際上是一個包含當前提交的SHA-1密鑰的文件。 您可以在存儲庫的.git/refs/heads文件夾中找到它們。


當您創建新分支而不指定提交時,該分支將指向HEAD當前指向的同一提交。 (請注意, HEAD並不直接指向提交,而是指向分支,但這是另一回事。)

假設您當前在development分支上,並且想要創建一個新分支來使用新功能。

git checkout -b new-branch

現在, developmentnew-branch將指向同一提交,可以說密鑰為DEF456 此提交包含對其父提交的引用(就像每次提交一樣),即ABC123 ,它又包含對其父提交的引用,依此類推。

您會看到,git在創建新分支時不會復制分支的歷史記錄,它只是指向與當前分支相同的提交。

如果您想了解有關git如何在內部存儲其信息的更多信息,可以查看gitpro書Git Objects一章


正如您已經在此問題中發現的那樣。 您可以使用git merge --no-ff <branch-to-merge>強制執行合並提交,而不是快進。

合並提交在某種意義上是特殊的,因為它不像git中的大多數提交那樣包含對父提交的引用,但是它包含對其父提交的多個引用。 這定義了合並。

聽起來您確實在問要強制執行“真實”合並而不是“快進”合並,以及有關“壁球”合並(根本不是實際合並)。 但是,為了完整起見,我想提到的是,在創建新的分支名稱時,您還可以做其他事情:

git checkout --orphan -b newbr

在這種情況下,git會讓您使用newbr而實際上尚未創建newbr 這意味着下一次提交將在您的存儲庫中啟動一個新的獨立提交圖。 換句話說,您將在一個存儲庫中擁有多個“根提交”(根提交是沒有父項的提交,而具有一個父項的普通提交和具有兩個或多個父級的合並提交)。

一個存儲庫中有多個獨立的提交圖是不常見的,但是受支持:例如git自己的源存儲庫就包含了它們。 (git程序使用git維護。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM