如何正确修复我的git工作流程

时间:2018-04-24 12:53:11

标签: git

我目前正在编写一个我需要提供给客户端的代码(通过将其放在服务器上),我希望有一个正确的工作流程,所以我只给他他需要的东西(以及当前正在工作的东西) )。此外,我希望该客户端的分支与主分支不同,因为我们稍后可能会将此代码重新用于其他客户端的不同功能。

因此,如果我正确理解this tutorialthis one(非常相似),我的分支应该是这样的:

(version)        0.1                 0.2  

Master            C'                 H''  
                  |                  |  
Client1           C'                 H''     
                  |                  |  
Release        C--C'             H'--H''  
               |   \             |  
Develop--A--B--C----C'-D----G----H'------I--J  
                        \       /  
Feature1                 E--F--H  

我的问题是我开始开发(并使用git)而没有考虑使用这种流程的方式。这意味着目前,我有一个主分支,实际上是我的开发分支......

所以这是我的问题:

  1. 我可以将主分支重命名为开发分支,然后重新创建主分支吗?或者我应该创建一个名为develop的新分支,从主分支中推送所有内容,并在使用主分支时开始使用delveop分支? (当我的代码的稳定版本准备交付时,只触及主分支)

  2. 我不确定我是否真的明白如何正确地推动'我从分支机构到另一个分支机构的工作,我通过使用git merge说,但每当我看到图表显示合并它时,似乎更像是关闭'更新它的分支是这样的吗?例如,当我想将我的发布分支中的代码放到主服务器或客户端时,我希望这些分支可用于将来的合并更新。我是否误解了合并的概念?

  3. 在本地工作时,我应该只停留在用于修改代码的开发,发布,修补程序和功能分支中,对吗? (如果我结账到主服务器或客户服务部门只会更新它们?)

  4. 同样在本地工作时,如果我在推到遥远的回购之前结帐到另一个分行,我会失去我所做的更改吗? (我说如果我使用git commit,当我再次结帐到上一个分支时,我会找到这些更改。)

  5. 假设我有我的开发分支和我的主分支,我需要使用哪些命令才能获得此配置?是否可以标记版本?

  6. (version)     0.1      0.2  
    
    Master         C        F     
                   |        |       
    Develop--A--B--C--D--E--F--H
    

    对不起那些新手问题,我阅读并尝试了几个教程,但在我的脑海中仍然非常模糊,我的团队中没有人使用git。事实上,他们有点让我负责学习和推广它,所以我想有一个正确的方法来管理工作流程而不是扔掉所有东西...

    感谢您的帮助,不要犹豫,询问您是否需要更多精确度。

1 个答案:

答案 0 :(得分:0)

我不能说我完全理解你正在拍摄的工作流程。您绘制的图形对于git提交图不是典型的,这本身就没问题,但是这个图似乎不能以git中准确的方式表示提交和分支之间的关系。所以我大部分都要接受你已经找到一个或多或少合适的工作流程,并将我的答案限制在你提出的直接问题上:

1)因为分支只是指向提交的指针,所以您可以轻松地将master重命名为develop,然后在任意位置重新创建master

git checkout master
git checkout -b develop
git branch -d master

请注意,一旦您在其他地方创建master,它可能会以非预期的方式移动。因此,如果master已被推送到远程,则下一次推送master的尝试将失败,除非您使用push -f(或更好,push --force-with-lease)。这将是一次强制推动,但是强行推动将使共享遥控器的所有其他人进入“破损”状态,因此需要与他们协调一些清理工作。 (未能协调此操作可能会导致强制推送被撤消。)请参阅“从上游rebase恢复”下的git rebae文档。 https://git-scm.com/docs/git-rebase

2)合并不会“关闭”分支。源分支不受合并影响。目标分支要么(a)移动到源分支指示的提交(在快进的情况下),要么(b)接收包含来自源分支的更改的新“合并提交”。

3)可能。我再次不知道您的工作流程规则已完全解释为我们对此发表评论。

4)一旦完成工作,就很难失去它,即使它只是“本地”承诺;这就是git的重点

5)同样,这些图并不反映git中提交和分支相关的方式。你可以得到像

这样的东西
O ----------- MC ----------------- MH <--(master)
 \           /                   /
  A -- B -- C -- D -- E -- F -- H <--(develop)

其中MCMHdevelop合并为master的地方。请注意,在这种情况下,单个提交仍然是master历史记录的一部分。您有时可以“专注于”此图表“顶线”上的提交 - 即git log --first-parent master;但如果你与另一个回购共享master,它就会得到一切。避免这种情况比仅仅“创建正确的分支”更复杂。

有几种方法可以分享有限历史记录的持续更新。

一种方法是保持git认为与开发历史“无关”的客户端分支。它可能会像这样工作:

您拥有本地仓库中正在进行的任何分支结构,并最终合并以掌握您要共享的“版本1.0”。

... V1 <--(master)

所以你要像这样创建client分支

git checkout master
git checkout --orphan client
git commit -m "Version 1.0"

现在你有了

C1 <--(client)

... V1 <--(master)

现在有更多的事情发生在本地,直到你有2.0版

C1 <--(client)

... V1 -- V2 <--(master)
         /
    ... X

现在,我已经制定了各种方案来跟踪客户端分支上的内容,和/或计算V1V2的变化,以便应用它到客户端分支...但事实是,如果V1C1匹配,那么你真正关心的是“如何创建一个新的提交C2,其父级是C1且其内容(TREE对象)与V2匹配?“

git checkout client
git merge $(git commit-tree -p client -m "Version 2.0" master^{tree})

现在你有了

C1 -- C2 <--(client)

... V1 -- V2 <--(master)
         /
    ... X

如果您从客户端整合补丁,可能需要额外考虑。