以下Git提交策略是否正确?

时间:2012-02-17 19:15:00

标签: git git-merge git-commit merge-conflict-resolution

我刚刚用Git做了以下事情,但我不确定这是否是正确的做事方式。我所拥有的是一个有一些东西的文件。然后有一个分支,为这个文件添加额外的东西(扩展它,它是我们单独出售的插件)。假设branch1和branch2有一个包含以下内容的文件:

-----------
branch1
-----------
123

-----------
branch2
-----------
123
qwe
-----------

然后我对branch1中的一个主要功能做了一些工作,并对该分支进行了提交。之后,我将branch1合并到branch2中,以便将此新功能重新应用于该文件的插件版本。现在文件是

-----------
branch1
-----------
1234

-----------
branch2
-----------
1234
qwe
-----------

但代码并不完全有效,我现在需要切换到branch2并对扩展文件的代码进行一些更改(将“qwe”更改为“qwer”)。然而,在工作时我也发现基本代码(“1234”)中的一些错误并修复它们(将“1234”更改为“12345”)。现在我的工作目录HEAD在branch2中有以下

-----------
branch2 (working directory)
-----------
12345
qwer
-----------

现在我需要提交这个,我的目标是

-----------
branch1
-----------
12345

-----------
branch2
-----------
12345
qwer
-----------

我担心如果我只是将它提交给branch2然后将另外重新应用1234-> 12345更改为branch1并提交它,这将产生我正在寻找的结果但Git会认为这是两个独立的完全独立的提交,当我将来要经历类似的过程时(例如,branch1中的12345-> 123456然后branch1-> branch2合并),我会在那个地方发生冲突。所以我的解决方案是使用交互式分段只提交qwe-> qwer更改为branch2。然后隐藏剩余的更改(否则它将不允许切换回branch1),切换到另一个分支,应用存储,将1234-> 12345提交到branch1,最后合并branch1-> branch2。

然而这就是诀窍,因为我对Git相对较新,我不太确定我是否正确使用并且以最佳方式使用。如果上述内容有意义,请告诉我,如果没有,请告诉我更好的方法。

3 个答案:

答案 0 :(得分:1)

你的方法对我来说似乎是合理的。不过我会这样做:

  1. 一旦我看到基码中的错误,就会藏匿并切换到branch1,并在那里修复它们。 测试,擦亮,提交。

  2. 将branch1的旧合并抛出到branch2并使用步骤1中的修复重做(我知道手动合并git-rerere可以减少重复的工作,但我从未使用过它) ,或者只是再次合并,并生活在稍微混乱的历史中。

  3. 这确保了“错误修复”实际上适用于branch1而不是在branch2代码之外巧妙地破解,并且它们在两个分支中都是相同的。

    另一方面,“不要那样做”答案:“插件”要求修改主程序代码的软件架构不好;这使得不是真正的插件。如果你解决这个问题,那么主程序和插件就会成为独立的树(就你对Git的使用而言)并且不需要合并(尽管仍然可能需要更新兼容性,如qwe→qwer)。

答案 1 :(得分:1)

您可以使用交互式添加(git add -p)来进行'qwer'更改并将其提交到branch2,但不是使用:

git stash
git checkout branch1
git stash pop
你可以:

git checkout -m branch1

将您的更改传输到branch1的工作树中,并为您节省一些git命令

答案 2 :(得分:0)

我们使用发布候选分支来组合不同的功能。 Rerere是你想要依靠的东西。进一步阅读:

http://dymitruk.com/blog/2012/02/05/branch-per-feature/