1

假设我有一堂课。

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. 这个工作流程是否需要在团队之间进行协调?
4

4 回答 4

1
  1. Git 不允许其他开发人员在没有拉取的情况下推送他的更改。

它将抛出两个 ref 不匹配的错误,因此需要使用远程 ref 更新他的本地分支。

这几乎就是所有关于它的知识。如果远程仓库有变化,除非你强制推送,否则如果远程有变化,git 将不允许你推送变化。

编辑

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

如果没有冲突,git 将自动合并这些更改,开发人员将能够在拉取后推送。

再次编辑

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

笔记

On git rebaseorgit pull --rebase通常用于为您提供更清晰的提交历史记录,因为它们几乎会将任何本地更改应用到已拉出的任何其他更改之上。

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

有关更多信息,请查看本指南Git Rebasing

于 2013-02-02T16:51:44.187 回答
1

让人们处理程序的不同部分总是一个好主意。

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

于 2013-02-02T16:55:26.120 回答
0

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

  1. 只需在合并之前在另一个分支中重复“重构”;
  2. 将工作转换为补丁(git format-patch),编辑补丁(将“重构”应用到它)并应用编辑后的补丁(git am)。这就像手动变基。

我认为最好将合并复杂的重构(例如,涉及重命名的重构)和通常的次要重构分开。

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

于 2013-02-02T17:10:54.087 回答
0

是的。Git 能够识别这些更改。我正在我自己的 fork 上使用 git 进行一个项目(从起源分叉)。与此同时,另一位开发人员在原始分叉上重构了代码库,其中包括更改包结构。

我使用了以下命令:

  • git stash save // 这会将您的所有工作保存到个人存储中
  • git pull // 获取主分支上的所有最新更改并合并
  • git stash apply stash@{0} // 或者任何你保存个人工作的 stash

现在您将拥有重构的代码库+您的更改。您现在可以提交而不会发生任何冲突,并且包装不会更改。

请注意,在我的情况下,我等待原始分叉被重构,然后我提交了我的更改,这些更改只是对少数文件的更改,而不是重新打包。

另请注意,如果您添加了新文件,则可能需要编辑一些导入以确保导入正确。例如。导入 org.my.domain;现在应该编辑为:import org.another.domain;

于 2016-04-13T22:16:03.023 回答