重构后Git是否足够合并

时间:2013-02-02 16:48:32

标签: java git

假设我有一个班级。

package org.my.domain;

public class BestClassEver{}

我的工作流程

通过一些重构,我改变了这个类的包。

package org.another.domain;

public class BestClassEver{}

我使用git将其提交到我的本地存储库并将其推送到远程存储库。

git add .
git commit -m "Refactoring"
git push origin master

另一个开发人员的工作流程

另一位开发人员修改了该类,但没有提取我的更改。

package org.my.domain;

public class BestClassEver{
    private String something;
}

然后提交并推送到远程存储库

git add .
git commit -m "Some Changes"
git push origin master

问题

  1. Git会将其他开发人员的更改合并到课程中吗?
  2. 如果没有,会发生什么?
  3. 这个工作流程是否需要在团队之间进行协调?

3 个答案:

答案 0 :(得分:1)

  1. Git不允许其他开发人员在没有拉动的情况下推动他的更改。
  2. 它会抛出两个引用不匹配的错误,因此需要使用远程引用更新其本地分支。

    几乎所有人都知道这一点。如果远程存储库中有更改,除非您执行强制推送,否则如果远程更改,git将不允许您推送更改。

    修改

    一旦他拉出,如果文件中有任何冲突,开发人员将不得不纠正任何冲突,提交它们,然后他才能推送。

    如果没有冲突,git会自动合并这些更改,开发人员可以在拉动后推送。

    再次编辑

    我没有意识到你正在移动文件。在任何情况下,运行git status都可以让您了解拉动后本地存储库的状态。如果有任何冲突,您可以纠正它们。

    注意

    On git rebasegit pull --rebase通常用于为您提供更清晰的提交历史记录,因为它们几乎会在任何其他更改的基础上应用任何本地更改。

    另一方面,git pullgit merge通常会进行额外的提交以链接分支上的更改。

    有关详情,请参阅本指南Git Rebasing

答案 1 :(得分:1)

让人们在计划的不同部分工作总是好主意。

在这种情况下,合并或变换应该是完全自动的,但在现实世界中,它总是有点戏剧性,有时会有一些冲突。当然,这个merge / rebase将在服务器拒绝推送非快进之后完成。

答案 2 :(得分:0)

当这样的事情失败时,一些解决方法包括:

  1. 在合并之前,只需在另一个分支中重复“重构”;
  2. 将工作转换为修补程序(git format-patch),编辑修补程序(将“refactor”应用于它)并应用已编辑的修补程序(git am)。这就像手动变基。
  3. 我认为最好将合并复杂的重构(例如涉及重命名的重构)和通常的次要重构分开。

    有时,对于合并复杂的重构,可以编写脚本(例如find -name '*.c' -exec sed 's/something/anything/g' -i '{}' ';')。该脚本用于在我们需要时在不同的地方多次重复重构,因此避免将重构的代码与非重构的代码合并。