簡體   English   中英

如何在git中管理合並和重新定位?

[英]How do I manage merging and rebasing in git?

我給出了rebase的目的。 對於我,這說得通。 基本上我有一個我正在研究的功能分支,我准備把它放到主分支中我會做一個rebase來將我的所有提交壓縮成一個干凈的一個,這樣它就可以很容易地集成到master中而不會讓所有的混亂歷史。 對?

這就是我們一直在做的事情。

  1. 創建功能分支
  2. 在我們構建功能時添加一堆提交
  3. 定期將主分支合並到功能分支中(以避免在路上進行痛苦的合並)
  4. 一切都完成后,將功能分支合並到主服務器中

我看到的問題是,定期將master合並到功能分支會導致重新定位時出現問題,因為現在我的功能簽入中混合了一堆主分支簽到。

這里的工作流程是什么? 以下逗號在哪里發揮作用:

  • git rebase -i Head ^#
  • git rebase master
  • git merge master
  • 混帳rerere
  • git reset --hard HEAD ^

在分支的生命周期結束時,您應該只與主服務器合並一次。 功能/主題分支的想法是它只包含與功能相關的更改; 當你反復合並master時,你會失去它。 (你可以讀一下git維護者Junio Hamano對分支的看法。)

你可以做一個“練習”合並,你將扔掉,並使用git-rerere讓Git自動記錄你的合並分辨率,以便在你真正准備合並時可以重復使用它們。 有關背景和教程,請參閱http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html 這真的很酷,因為它可以讓你完成合並的工作,而無需在任何地方明確地提交它,然后當你真正准備創建合並時,“神奇地”恢復工作。 因此,在最后,您可以進行一系列較小的,希望更簡單的中間“練習”合並,而不是最后一次大的痛苦合並。 粗略地說:

# Enable rerere
git config --global rerere.enabled 1
# Start a feature branch
git checkout -b feature
# Hack hack hack
git commit
git commit
# Practice merge
git merge master
# ...then throw the merge commit away, the work is saved by rerere
git reset --hard HEAD^
# Hack hack hack
git commit
# Really merge to master, reusing any saved work from rerere
git checkout master
git merge feature
git branch -d feature

另請參閱http://progit.org/2010/03/08/rerere.html以獲取其他教程。

您還可以定期在master上重新分配主題分支,然后在最后進行合並。

為了處理你當前所處的情況,使用一個主題分支(比如命名feature ),其中包含一系列與main混合的各種正在進行的提交,最簡單的方法是將一個壓縮合並到生成一個“合並”的工作樹,然后在main上創建一個新的提交(或一系列提交)。 例如:

git checkout master
git merge --squash feature
git commit

這將生成一個提交,表示功能頭部的樹狀態,合並為主。

當然,你也可以做一個定期的合並,以master這種變化,留下的凌亂的歷史feature現在,只是在今后的工作中更加干凈。 例如,簡單地說

git checkout master
git merge feature

然后繼續前進。

如果你要改變(我建議你這樣做),那么就不要與master合並。 rebase工作流基於以下想法:主題分支包含從主要到新要素的路徑,而不包含任何其他內容。 當主人向前移動時,你對新功能的改變隨之移動。

當您最終准備好將更改帶入master時,您有兩個主要選項:

  1. 最后一次重新掌握master,然后進行正常的快進合並,這實際上將你所有分支的提交逐個引入master。 這保留了更細粒度的歷史記錄,但如果中間提交破壞了構建,那么您可能更願意壓縮它們。 交互式rebase(-i)可以幫助安排這些提交。

  2. 使用merge --squash在master中進行單個提交,其中包含所有分支的更改。

無論如何你要重新定義分支,只要你想要“合並”變化,就可以進行重新定義。在准備好將該分支“合並”為主分支之前,你不必重新加注。

我相信簡短的回答是:

使用git merge --squash if:

如果您有一個功能分支,並且在工作時從另一個分支進入該分支,例如,您切換到功能並定期運行git merge master以在主分支中合並。 或者你正在把那個分支拉到或推到別人或像github這樣的中央倉庫。

使用git rebase如果:

如果你有一個功能分支,你沒有推或拉給別人,你沒有定期合並另一個分支,如上所述

暫無
暫無

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

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