我目前正在与一个会议的博士后合作写一篇论文。我们使用版本控制软件进行了调查,git 似乎是一个很好的选择。现在我们必须真正体验它并且面临一些问题。具体来说,我们有时会在推送之前编辑相同的文件,从而导致第二个想要推送的人出错。
为了防止这种同时编辑,可以使用哪些技巧/工具/等?我知道 git 用于大型项目,有许多没有面临这些问题的合作者,那么我们做错了什么?
有任何想法吗?
我目前正在与一个会议的博士后合作写一篇论文。我们使用版本控制软件进行了调查,git 似乎是一个很好的选择。现在我们必须真正体验它并且面临一些问题。具体来说,我们有时会在推送之前编辑相同的文件,从而导致第二个想要推送的人出错。
为了防止这种同时编辑,可以使用哪些技巧/工具/等?我知道 git 用于大型项目,有许多没有面临这些问题的合作者,那么我们做错了什么?
有任何想法吗?
实际上,当你在写论文而不是代码时,git 可能不是完美的工具。通过使用谷歌文档或类似的东西,您将能够几乎实时地看到您的合作伙伴所做的更改。而且您不必经历提交/推送/合并的事情。
Git 没有像 TFS 那样“锁定”文件的任何机制。如果两个人都在积极编辑文件的同一部分,您应该预料到会有冲突。
主要事项:
和你的同事谈谈你在做什么。如果可以,请协调,如果必须,请警告他们。这似乎是一种行人,但它通常比它应该发生的晚。 Scrum很好,因为它使它成为你日常工作的一部分。
最大的因素是您对自己的更改保留多长时间。未完成更改的时间越长,重叠更改集的机会就越大。
在您正在共同开发的功能上创建集成分支是一件好事。如果您经常创建检查点、推送和变基,那么您就不太可能做出难以纠正的重大更改。不过,小冲突很容易处理。在推送到 master 之前,您可能需要返回并清理一些提交,但这通常很容易协调。
小事:
查看差异是了解一段代码如何变化的绝佳工具。人们在不同的格式偏好之间切换会破坏这个工具。
具有一致的格式有助于解决这些无关紧要的冲突。选择一致格式的过程是另一回事。;)
如果您正在处理一个函数并注意到空格不正确,您将修复它。从事相同功能的其他人也会这样做。
例如,左缩进:
namespace foo {
namespace bar {
class Foo {
public:
void something();
};
class Foo {
public:
void something();
};
}}
namespace foo {
namespace bar {
}
}
我个人更喜欢将所有命名空间像第一组一样左对齐。这将空白噪声保持在最低限度。不过,一致性很重要。
制表符与空格是另一个。从理论上讲,您选择哪一种并不重要,但一定要选择一种。
避免移动代码(显然没有充分的理由)。这很难做到,但如果你有更多的文件,每个文件中的东西更少,这不是一个问题。
将小的“内务处理”更改与您的功能/错误修复提交分开。这使得合并这些提交上的更改变得非常简单。如果一个是特征变化,一个是空格变化,那么你可以盲目地接受特征变化。
“锁定”在某种意义上是自动的。您有自己的副本,他们无法将其从您手中夺走!就像他们有他们的副本一样,您无法将其从他们手中夺走。这假设您正在使用 git DVCS 的分布式特性(而不是同时访问文件共享 :-( 您将各自拥有自己的克隆并交换分支或推送到公共裸仓库。
下一步是确保您使用的文档处理器适合 git 合并,理想情况下是纯文本源,例如 Latex 或 markdown。Git 会很高兴地合并您的单独贡献并突出显示您的冲突。但是不要使用很长的行。
如果您正在合作,您将能够讨论发生合并冲突的常见区域并同意最佳措辞。
享受同时工作的自由。