如何使用git防止多个用户编辑同一文件

3

我目前与一位博士后合作为一场会议撰写论文。我们调查了使用版本控制软件,Git似乎是一个不错的选择。现在我们已经开始实践,但是遇到了一些问题。具体来说,我们有时会在推送之前编辑相同的文件,这会导致想要第二次推送的人出现错误。

有什么建议/工具/等可以用来防止同时编辑?我知道Git被用于有许多合作者的大型项目,他们不会遇到这些问题,那么我们做错了什么?

有什么想法吗?


3
Git和大多数现代版本控制系统一样,专门设计了同时编辑作为一个理想的功能。 - Don Branson
每次提交都会存储你/他所做的更改。在合并期间,git提供了一种机制来将更改组合成一个统一的文档。有时它会失败,要求你手动执行合并操作。有时(很少)它会出错。我建议你阅读有关基本git操作的git手册。 - Xyand
2
Git可以通过比较行来建立上下文,成功地合并文本文件。我没有意识到有人认为这是一个问题,这是团队软件开发的基本功能,工作相当稳定,只偶尔会出现错误。但对于二进制文件来说,这将是一个问题。 - Don Branson
我们在谈论什么类型的文件?扩展名是什么? - Jesse Webb
尽早且经常提交代码,可以最小化冲突解决步骤。 - Luke Hutton
显示剩余2条评论
3个回答

1

Git没有像TFS那样的“锁定”文件的机制。如果两个人都在积极编辑同一部分文件,则应该预期会发生冲突。

主要事项:

与同事讨论您正在做什么。如果可以协调,如果必须警告他们。这似乎有点平凡,但通常比应该晚一些发生。Scrum很好,因为它使其成为您例行公事的一部分。

最大的因素是您将更改保留给自己的时间有多长。您拥有未解决更改的时间越长,就越有机会出现重叠的更改集。

在一起工作的功能上创建集成分支是一件好事。如果您经常创建检查点、推送和变基,那么您就不太可能进行难以纠正的大型更改。小冲突相当简单处理。您可能需要回去清理一些提交,然后再推送到主分支,但通常很容易协调。

次要事项:

查看差异是了解代码如何更改的不可思议的工具。人们在不同的格式设置偏好之间转换会破坏此工具。

保持一致的格式有助于解决这些不重要的冲突。选择一致的格式的过程又是另外一回事。

如果您在处理某个函数时发现空格不正确,您会进行修复。同样处理该函数的其他人也会这么做。

例如,左缩进:

namespace foo {
namespace bar {

    class Foo {
    public:
        void something();
    };

    class Foo {
        public:
            void something();
    };

}}

namespace foo {
    namespace bar {
    }
}

我个人更喜欢将所有命名空间左对齐,就像第一组一样。这样可以将空格噪音降到最低。但是一致性才是最重要的。

制表符与空格也是一个问题。理论上,选择哪一个都无所谓,但确实需要选择一个。

避免移动代码(除非有充分的理由)。这很难做到,但如果您有更多文件,每个文件中的内容较少,则这不是一个问题。

将小的“清理”更改与您的功能/错误修复提交分开。这使得合并这些提交的更改变得非常简单。如果其中一个是功能更改,另一个是空格更改,则可以盲目地采用功能更改。


1

实际上,如果你在写论文而不是代码,Git可能不是最完美的工具。使用Google文档或类似工具,你将能够几乎实时地看到你的合作者所做的更改。而且你不必经历提交/推送/合并的过程。


0
“锁定”在某种程度上是自动的。你有自己的副本,他们无法从你手中夺走它!就像他们有自己的副本,你也无法从他们那里夺走它。这假定你正在使用分布式Git版本控制系统的本质(而不是同时访问文件共享 :-( ),你们每个人都会有自己的克隆版本,并交换分支或推送到一个共同的裸仓库。
下一步是确保您使用的文档处理器适合于Git合并,理想情况下应该是纯文本源代码,例如LaTeX或Markdown。Git将高兴地合并您的独立贡献并突出显示您的冲突。不要使用非常长的行。
如果您正在协作,您将能够讨论合并冲突发生的常见区域,并达成最佳措辞的共识。
享受同时并行工作的自由。

假设我正在编辑某个文件。另一个同事也在他的克隆中编辑同一个文件,而彼此并不知道该文件正在被其他人编辑。最终,两个人都将自己的副本推送到服务器上,其中一个会被拒绝。这不是对其中一个人的时间浪费吗?有没有办法防止这种情况发生? - Isuru
@Isuru,啊哈,这就是你的工作流程和分支的用处。最简单的方法是每个开发人员都在自己的主题分支上工作,处理相对独立的代码部分(在那个文件中)。因此,当他们推送时,他们会推送到主题分支(复数),然后进行单独的合并到适当的主线。鉴于相对独立性,两个更改都将很好地合并,并且每个代码更改都会像平常一样进行测试。请阅读http://nvie.com/posts/a-successful-git-branching-model/。问候。 - Philip Oakley
仍然希望有一种方法可以“锁定”文件,以防止其他人能够编辑它,只是为了避免这个问题。您可能正在与一个只想保持简单的团队合作。 - Robbiegod
@Robbiegod,鉴于Git是真正分布式的,这是团队(包括领导)之间的政治(社会)问题。应该实行关注点分离。工具无法解决人员问题。 - Philip Oakley
@PhilipOakley 谢谢Phil的回复。我看到Gitlab提供了一种“锁定”文件的方法,但Github似乎没有这个功能。如果我们可以锁定文件,使其他人无法编辑,那么事情就会变得不那么复杂。也许还有其他的方法。在Github上是否有一种通知我们开发团队A正在编辑文件的方式?这样他们至少就会收到通知。 - Robbiegod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接