使用Git将开发分支与主分支合并以进行生产版本

6

我正在使用Git进行代码版本控制。

我有一个开发分支,在这个分支上进行所有的开发工作。

每当我发布一个生产版本到外部时,我想将它放在我的主分支下。

问题是,每次我合并开发和主分支时,主分支都会收到所有开发历史记录。

我想保持一切简洁,所以分支看起来像这样:

development

"init commit"

"developing"

"Version 1.0"

"bug fixing"

"bug fixing"

"Version 1.1"

master

"Version 1.0"

"Version 1.1"

是否可能实现?如果可以,怎么做?

更新 我尝试了Gauthier的回答,但它并没有按照我想要的方式工作。

我采取的步骤如下: 1. 在master中创建初始提交。 2. 切换到development。 3. 添加几个提交到development。 4. 检出master。 5. git merge development --no-ff

合并成功了,但是当我在高层次上查看我的仓库时,我发现在我的主分支上有所有开发分支的历史记录,而我只想要init-----version 1.0。

这是屏幕截图:

development分支: enter image description here

master分支: enter image description here


你是使用 "git merge" 还是 "git rebase"? - Chris Maes
2
为什么不使用git tag功能来标记发布点呢? - Amir
3个回答

4

你了解--no-ff吗?

当前你拥有:

o init commit
|
o developing
| 
o Version 1.0
|
o bug fixing
|
o bug fixing
|
o Version 1.1
|
o Version 1.0
|
o Version 1.1  - development - master

(时间向下,与您的示例相同,而不是像git loggitk那样)

我的猜测是您对master感到不满,因为所有内容都直接到达了同一级别。

如果您可以接受以下情况:

o init commit
|\
| o developing
|/ 
o Merge branch 'development' - Version 1.0
|\
| o bug fixing
| |
| o bug fixing
|/
o Merge branch 'development' - Version 1.1 - development - master

当您想要发布在开发分支上的内容时,请使用--no-ff合并到主分支(master),然后打上标签(tag):

$ git checkout master
$ git merge development --no-ff
$ git tag "v1.0"

请注意,您应该考虑使用以您正在开发的功能命名的分支来工作,而不是在development中进行所有工作。这将导致更好的合并消息,例如“合并分支'killer_feature'”。也许这已经存在于development中,如果是这样,请原谅。

@AsafNevo:--no-ff 意味着不使用快进方式合并。快进是一种合并类型,如果您要合并的分支(开发)自创建以来没有新提交,则将当前分支移动到合并分支的最后一个提交。它不会创建任何合并提交。实际上,这是一种合并(所有更改都在那里),但是您没有合并提交的事实有点隐藏了您拥有一个分支的事实。我也不喜欢它,我喜欢显示哪些提交属于一个分支。在 man git merge 中查找快进合并。 - Gauthier
显示master分支将始终显示所有必需的提交以达到提交。 git不记得提交是在哪个分支创建的。在git中,分支只是对提交的引用。反过来,提交有对其父提交的引用(对于合并提交有多个)。当您显示master时,它从master指向的提交开始,然后是此提交的父项,依此类推。为什么开发中创建的提交出现是个问题? - Gauthier
但我的建议是主分支应该保持干净。目前它保存了所有开发分支的历史记录。 - Asaf Nevo
然后在合并时可以使用 --squash,但是再次问:这为什么是个问题呢?git 允许的提交粒度细化是一件好事! - Gauthier
这并不是一个问题。也许更像是强迫症 :) 我只是希望(如果可能的话)有一个干净的主分支,仅包含分布版本,而开发分支则包含开发过程中的混乱提交。 - Asaf Nevo
显示剩余3条评论

0

在同一代码库中是不可能的。所有分支共享相同的历史记录。Git 分支不是您提交的独立副本,而是尽可能重用现有数据的轻量级解决方案。

解决方案:

  • 但是,仍然可以为主分支创建新的“干净”提交,从而压缩许多“脏”开发提交。请参见this solution

  • 如果您想要一个“干净”的代码库,请考虑创建另一个公共代码库。您只需复制每个新版本并提交一个提交即可。


0
首先,让我说一句,你不应该这样做 :) 你可以使用 git merge 的 --squash 参数,并重新提交更改为一个提交,附上你想要的消息。此时,您将需要将开发分支硬重置为主分支,以避免下次将开发分支合并到主分支时合并相同的更改。

第二种方法是避免编写像“对代码进行更改”这样的提交消息,或者在开发分支上完成功能/工作后压缩临时提交,然后合并到主分支。

P.S. git log master --merges 将按您想要的方式提供主分支的历史记录,并且您不会失去您的 git 历史记录(前提是您的合并消息正确,并且在合并时使用 --no-ff)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接