碰巧我和我共用一个私人回购的git伙伴不得不拉扯很多,因为他没有拉一段时间。我想在他的~3h下载会议期间继续工作,但我也想避免麻烦。
因此,我想知道:
答案 0 :(得分:2)
TL; DR - 对这两个问题都是肯定的,但需要注意的是修改已经发布的提交通常是不好的做法。
- 他拉的时候推着是否安全?
醇>
首先,'pull'是两个操作 - 'fetch'然后'merge'。首先,git将“获取”远程存储库中的所有提交(指定HEAD的祖先),并将它们存储在本地存储库中。其次,它会将指定的远程HEAD“合并”到本地HEAD中(这可能是一个快速转发,或者是一个具有多个父项的新提交)。
“合并”部分是本地操作,并不是真正相关的。您的合作伙伴将根据从存储库中“获取”的内容进行“合并”。
所以问题归结为 - 当另一个人正在“推”时,“获取”是否安全?答案是 - 是的,当然!在“获取”结束时,您的合作伙伴将完成所有提交。如果他们不这样做,那么根据通常的git工作流程,将在下一次“推送”或“拉动”中发现剩余的提交。它在逻辑上等同于完成'pull',然后你'推送'新的提交。
- 可以安全地修改我上次提交的时间吗?
醇>
呃,作为一个过程问题,您可能不希望修改已经发布到远程存储库(google)的提交。但如果你真的想这样做,是的,你可以。而且,您的伴侣将再次获得这些更改(您在“获取”期间发布的更改),或者他们不会。如果没有,则无关紧要,因为这些更改将在稍后发现。
答案 1 :(得分:1)
您应该记住,分支只是git
中提交的引用。也就是说,更新分支实际上是一种非常快速和简单的操作,这也很容易以原子方式实现。是的,你还需要在push
/ fetch
操作中传输一些blob,但这些对于存储库的状态是无关紧要的:如果你在存储库中有一些blob并不重要不是(间接)连接到分支,它是通过重要的分支可以达到的blob。
这意味着,您可以预期所有push
和fetch
/ pull
操作都是原子的,这会导致push
/ fetch
操作影响到给定存储库一个总订单。 push
发生在fetch
之前,push
发生在fetch
之后,没有第三种选择。
关于修改提交的问题:这是一个纯粹的本地操作。您使用与要修改的祖先相同的祖先创建新的提交,并将分支指向该新提交。就是这样,没有涉及其他存储库。
但是,您永远不应该修改已经推送的提交:这是重写历史记录,重写历史记录的后果非常严重。如果不先了解正确你正在做什么,就不要试图这样做。