簡體   English   中英

將分支和子分支合並回母版

[英]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)

您所描述的是AB應該合並為master 因為AB正是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到達,則合並提交會將那些更改與AB的更改合並在一起。

無論哪種方式, B1始終指向AB2始終指向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

現在檢查B1hello.txt的內容。 真好 對?
同樣,轉到master分支並將B1中所做的更改合並到master。 那里有它。

暫無
暫無

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

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