【发布时间】:2011-05-01 00:58:37
【问题描述】:
我相信标题已经说明了这一点。我是源代码管理的新手。
假设我有两个开发人员在同一个项目上工作,他们同时开始编辑同一个文件,然后每个人都在稍微不同的时间发送新版本。据我了解,最后发送更改的人将保留他的更改,其他人的代码将仅在存档中!!!
对吗?
请澄清。谢谢。
【问题讨论】:
我相信标题已经说明了这一点。我是源代码管理的新手。
假设我有两个开发人员在同一个项目上工作,他们同时开始编辑同一个文件,然后每个人都在稍微不同的时间发送新版本。据我了解,最后发送更改的人将保留他的更改,其他人的代码将仅在存档中!!!
对吗?
请澄清。谢谢。
【问题讨论】:
不,这不太正确。这在某种程度上取决于您使用的版本控制软件,但我喜欢 Git,所以我会谈谈。
假设我们有一个文件 Foo.java:
class Foo {
public void printAWittyMessage() {
// TODO: Be witty
}
}
Alice 和 Bob 都修改了文件。爱丽丝这样做:
class Foo {
public void printAWittyMessage() {
System.out.println("Alice is the coolest");
}
}
鲍勃会这样做:
class Foo {
public void printAWittyMessage() {
System.out.println("Alice is teh suk");
}
}
Alice 首先检查她的版本。当 Bob 尝试签入时,Git 会警告他存在冲突,并且不允许将提交推送到主存储库中。 Bob 必须更新他的本地存储库并修复冲突。他会得到这样的东西:
class Foo {
public void printAWittyMessage() {
<<<<< HEAD:<some git nonsense>
System.out.println("Alice is the coolest");
=====
System.out.println("Alice is teh suk");
>>>>> blahdeblahdeblah:<some more git nonsense>
}
}
<<<<<、===== 和 >>>>> 标记显示同时更改了哪些行。 Bob 必须以某种合理的方式解决冲突,移除标记并提交结果。
所以最终存在于存储库中的是:
原始版本 -> Alice 的版本 -> Bob 的冲突修复版本。
总结:第一个提交没有任何问题,第二个提交必须在进入存储库之前解决冲突。您永远不应该以自动破坏某人的更改而告终。显然 Bob 可以错误地解决冲突,但版本控制的美妙之处在于您可以回滚错误的修复并修复它。
【讨论】:
很大程度上取决于您使用的系统。
但是,在常见情况下:谁第二次提交他的更改必须执行“合并”操作。这意味着他/她需要比较这两个文件并提出合并版本。但是(!)许多流行的系统(包括 IDE)都带有智能工具来帮助您做到这一点。
以下是一些类似的工具: http://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools
【讨论】: