[英]Merging branch and sub-branch back to master
我對git的了解有限。
我已經從master創建了一個分支B1,進行了一些編輯並提交給該分支。
我想從B1創建另一個分支B2,在B2中進行一些編輯
而且我還想提交並推送B2(來自B2和B1的編輯)回主
如何做到這一點,文檔假設您總是從master而不是另一個分支創建分支。 我為自己的git愚蠢而道歉。
tayfun的回答從根本上是正確的。 如果您想了解更多有關為什么的概念背景:
該文檔不應該對從master分支進行假設(至少,如果您正在查看規范的git文檔,則不會這樣;顯然,我不知道您正在查看的文檔)。 示例可能只是從簡單的示例而開始,而從master
開始,但是要理解的是:
master
沒什么特別的。
分支就是分支; 其中一個恰好是第一個出現,按照慣例,它稱為master
。
另外,git沒有“父分支”之類的內存。 在任何給定時間,您都可以專注於當前的提交拓撲。 所以:
我已經從master創建了一個分支B1,進行了一些編輯並提交給該分支。
x -- O <--(master)
\
A <--(B1)
我想從B1創建另一個分支B2,在B2中進行一些編輯
x -- O <--(master)
\
A <--(B1)
\
B <--(B2)
在這一點上,git不知道或不在乎B2
是“從B1
創建的”。 您可以說:
B2
A
) B
) A
並創建分支B1
一切都會一樣。
而且我還想提交並推送B2(來自B2和B1的編輯)回主
在這里,您的術語感到困惑。
push
是更新遠程存儲庫引用。 通常,您的遙控器可能有一個對應於每個本地分支的分支。 盡管git非常靈活,您可以以其他方式使用push,但它似乎仍然不符合您的意思。
將從一個本地分支的更改merge
到另一個本地分支就是merge
。 (實際上有幾種方法可以解決此問題,但從概念上講,最簡單的方法是合並...)
同樣,這觸及了關於git中分支的常見誤解-更改“屬於”該分支或該分支。 在許多源代碼控制系統中,這可能是正確的,但在git中卻不是。 相反,從分支(或其他引用)可以“到達”或不可以“到達”更改; 而且很多引用都可以(通常)進行更改。
(本質上,分支(或其他ref)是指向提交的指針;該提交可從ref到達。如果該提交具有父級,則父提交是可訪問的。這將通過父級指針遞歸地繼續進行,因此整個歷史記錄最多可以從該參考到達。)
回到圖上
x -- O <--(master)
\
A <--(B1)
\
B <--(B2)
您所描述的是A
和B
應該合並為master
。 因為A
和B
正是B2
可以到達但master
不能到達的提交,所以就像
git checkout master
git merge B2
請注意,默認情況下,git將在此處采取捷徑,方法是執行“快進”而不是真正的合並。 之所以可以這樣做,是因為master
沒有B2
無法達到的更改。 在這種情況下,git可以將master
更新為將其移至與B2
相同的提交。
x -- O -- A <--(B1)
\
B <--(B2)(master)
您可能不希望git那樣做。 (某些分支/合並策略要求保留分支拓撲。)在這種情況下,您可以說
git checkout master
git merge --no-ff B2
這會給你
x -- O --------------- M <--(master)
\ /
A <--(B1) /
\ /
B --------/
^
(B2)
其中M
是“合並提交”。 如果還有其他更改可以從master
到達但不能從B2
到達,則合並提交會將那些更改與A
和B
的更改合並在一起。
無論哪種方式, B1
始終指向A
, B2
始終指向B
,因此它們都可以從master
完全到達。
沒有什么可以阻止您將任何分支合並回master。 該分支可以從master或任何其他分支分支。 只需做:
git checkout master
git merge B2
嘗試這個。 如果您想將其重置為原始狀態,則可以始終執行git reset --hard origin/master
(假設您的遠程倉庫稱為Origin,或者如果您沒有遠程倉庫,則也可以提供提交哈希)。
讓我給您簡要介紹git
工作原理,以便您理解。
讓我們在temp/
文件夾中創建一個存儲庫
$ cd temp
$ git init
現在,使用以下文本創建文件hello.txt
in master
保存,提交更改,並使用檢查您的分支名稱
$ git add hello.txt
$ git commit -m 'committed in master'
$ git branch
* master # the output
好,現在您創建一個分支名稱為B1
$ git checkout -b B1
現在檢查一下hello.txt
中的內容。
$ cat hello.txt
in master
它與master分支具有相同的文本。 現在編輯文件並添加一些文本
in master
in B1
您將文件保存在B1分支中,並且它具有更新的數據。 提交更改並在B1中創建一個新分支
$ git add hello.txt
$ git commit -m 'committed in B1'
創建分支名稱為B2
而不返回主節點
$ git checkout -b B2
如果您檢查B2中hello.txt的內容,您將擁有與B2中相同的文本,因為分支B2源自分支B1。 現在,如果您回到master分支並看到hello.txt的內容,您只會in master
找到==>,分支B1和B2中的更改不會影響master分支
現在更改hello.txt的內容
in master
in B1
in B2
保存並提交更改。
現在回到您的問題 ,您想將 B2分支中的更改合並 ( 不推送 )到B1中 。 您可以返回到分支B1來執行此操作。
$ git branch B1 # To change the branch to B1
$ git merge B2 # It will merge changes made in B2 to B1
現在檢查B1中hello.txt的內容。 真好 對?
同樣,轉到master分支並將B1中所做的更改合並到master。 那里有它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.