簡體   English   中英

git reset --soft - 它是返回到 git checkout 點還是最后一個 git 合並點?

[英]git reset --soft - does it go back to git checkout point or to the last git merge point?

我想我要找的是兩個分支的最老的共享祖先,或者類似的東西,這個問題似乎觸及了它: 用 Git 尋找一個分支點?

但是,而不是 OP 中的圖表,這更像是我所看到的:

-- I -- I -- I -- I -- I -- I -- I  (integration branch) 
          \         \          /
           \         \        /
             F -- F -- F -- F  (feature branch)

我的問題是 - 如果我們從集成中簽出一個功能分支並進行一些更改和一些提交,然后我們在進行時更新/合並集成幾次。 又名,提交提交,與集成合並,提交提交,與集成合並等。 如果我們然后執行git reset --soft <integration> ,是否將在使用git checkout時將其重置為集成提交,或者它會簡單地將它重置到最后一次git merge與集成發生的點嗎?

目標是讓我可以將我的功能變成一個大的提交。 如果git reset --soft只能追溯到最后一次 git 與集成合並,那么我的功能可能有 100 次提交,這不是 bueno,我將需要另一種技術。

可以使用git reset --soft ,但您必須先做一些其他的事情——或者更確切地說,不要做——首先。

目標是讓我可以將我的功能變成一個大的提交。

在這種情況下,請確保您不要從以下內容開始:

-- o -- A -- B -- C -- D -- E -- IM   <-- integration
          \         \          /
           \         \        /
            F1 -- F2 - FM - F4   <-- feature

請注意,我在這里替換了單個字母,以便我可以談論特定的提交。 就 Git 本身而言,兩個最有趣的提交是F4 ,它是名為feature的分支的提示提交,以及IM ,它是名為integration的分支的提示提交。

標記為FM的提交不是問題,即使它合並提交。 標記為IM的提交一個問題。 那是因為這個提交可以從integration的尖端到達。 有關一般可達性概念的(更多)更多信息,請參閱Think Like (a) Git 每當提交IM本身可以通過從integration點的提交開始,向后(向左)工作時,提交IM本身到達的所有提交也是如此。 提交IM會導致提交E (不是問題)和F4 (問題!)。

如果您消除了commit IM ,那么您將擁有:

-- o -- A -- B -- C -- D -- E   <-- integration
          \         \
           \         \
            F1 -- F2 - FM - F4   <-- feature

您現在可以使用git checkout feature並運行git reset --soft integration ,結果如下:

-- o -- A -- B -- C -- D -- E   <-- feature (HEAD), integration
          \         \
           \         \
            F1 -- F2 - FM - F4   [abandoned, but remembered as feature@{1}]

但是,您的索引工作樹與檢出提交F4時沒有變化,因此您現在可以運行git commit將當前索引轉換為提交。 名稱feature現在將指向新的提交:

                              F   <-- feature (HEAD)
                             /
-- o -- A -- B -- C -- D -- E   <-- integration
          \         \
           \         \
            F1 -- F2 - FM - F4   [feature@{1}]

新提交F快照將與提交F4快照匹配:

git diff feature@{1} feature

根本不會打印任何內容。 但是新提交F項是現有提交E (提交F也有一個新的作者和提交者以及相應的“現在”時間戳,這也與F4區分開來。)

每次將功能合並回integration ,您都在移動integration (現在引用新的合並提交)

您需要在進行feature分支和合並之前標記integration ,以便返回到它。

一個可能的標記是origin/integration :您上次獲取integration )。

另一個是git merge-base --fork-point (基於reflog ,所以不可靠)或兩個分支的git rev-list --first-parent之間的一些差異。

在任何情況下,您的git reset --soft都必須使用該標記,而不是本地集成分支。

暫無
暫無

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

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