簡體   English   中英

Git - 如何反復壓縮合並到主分支

[英]Git - How to recurringly squash merge to a master branch

我有兩個分支:

  1. 我每天提交幾次的個人分支。
  2. 一個“開發”分支,我偶爾想將我的個人分支更改合並到,但提交消息被壓縮。

合並后,我想繼續使用我相同的個人分支,然后可以隨意重新合並回 dev 分支。

使用 svn,這很容易做到,而不會發生任何合並沖突。

  1. 在個人分支上提交多項更改
  2. 將更改合並到 dev 分支,該分支將記錄單個提交消息
  3. 將步驟 2 中的更改合並回個人分支,但“只記錄合並信息”,這樣它就不會合並任何內容。
  4. 重復步驟 1。

現在,dev 分支知道它從個人分支中獲得了什么,而我的個人分支知道它擁有來自 master 分支的所有內容。

使用 git,我嘗試使用git merge --squash到 go 從個人分支到開發分支,第一次效果很好。 但是第二次我遇到了一堆沖突。 由於merge --squash不會合並原始提交,而是進行與原始提交無關的新提交,因此 git 沒有意識到我已經將一堆內容從我的個人分支合並到 dev 分支.

git 中的這個工作流程有什么解決方案嗎? 似乎如果我merge --squash一個分支,我必須為下一次創建一個新分支。

您是否希望壓縮的修訂支持開發人員? 就像,一個又一個壁球修訂? 如果是這種情況,您可以這樣做:

git checkout --detach my-branch
git reset --soft the-previous-squash-commit
git commit -m "A new squash operation that covers revisions x, y and z"
git checkout dev
git merge -m "Merging a new squash commit" HEAD@{1} # given that I didn't have a branch set up for the squashed revision

我認為那里不應該有任何沖突。

首先要了解的是,您描述所需行為的方式(僅合並到目標記錄 1 次提交)正是默認合並的工作方式。

看起來不是這樣的原因是,默認情況下,許多 git 命令遵循所有進入合並的分支。 您可以通過為命令提供--first-parent選項來更改它

git log --first-parent

常規合並和“squash 合並”都准確記錄一個新提交並將其放置在目標分支上(即,當您發出命令時,分支已簽出)。

不同之處在於 squash 合並假裝他們沒有編寫合並 - 也就是說,新提交的唯一父級是目標分支的先前提示。 正常的合並有第二個父級 - 無論您合並到哪個分支 - 正如您所注意到的,如果您希望后續合並正常工作,這是必需的。

您可以跳過箍來重新發明輪子。 例如,eftshift0 為您提供了一種方法,可以隨時使dev與您的其他分支的尖端相匹配 - 這有點像合並而不管合並基礎如何,只要您的分支對dev有貢獻。 如果您搜索 SO,您甚至可以找到更通用的解決方案。

但所有這些解決方案的共同點是,它們與 git 的工作原理背道而馳。 按預期使用 git 確實要容易得多 - 即,當您想要進行這些更改時,只需將您的分支合並到 dev 中,如果您想要不遵循側分支的 output 使用first-parent

git merge --squash之后,不應使用分支進行進一步合並。

如果你堅持使用 squash 合並,你可以使用這個流程:

git checkout dev
git merge --squash personal
git tag personal_1_0 personal  #optional to save old personal branch
git checkout -B personal

實際上,您從當前的開發人員創建了一個新的個人分支,稍后您可以從中壓縮合並。 每次壓縮合並時都執行此操作(每次使用不同的標簽)。

暫無
暫無

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

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