克隆并覆盖本地代码库

9

我希望能定期在我的服务器上拥有最新的Bitbucket存储库副本,但不确定要发出哪些git命令以避免拉取时可能发生的合并冲突。
我唯一想到的正确方法是将其克隆到临时目录,然后复制/覆盖本地存储库。
但一定有更好的方法来实现这一点吧?

2个回答

14

不要将代码克隆到临时目录并用该新克隆替换本地版本库,而是可以从远程仓库 获取 最新代码,并对本地版本库进行 强制重置

git fetch origin master
git reset --hard origin/master

由于您只是获取origin/master中的内容,因此不会出现合并冲突。


5
合并冲突仅在执行合并操作时才会发生,例如:
- 将您的提交进行变基 - 将您的提交与其他人的提交合并,反之亦然 - 使用git revert撤消提交,以便创建与其不同的自己的分支
请注意这里的共同主题:您必须拥有属于自己的提交,即自己的工作(或部分撤消其工作的提交,但再次强调,这些是您正在添加的自己的提交)。
因此,如果您从未进行过自己的提交,则永远不会有任何冲突。 当然,这意味着您永远无法进行任何更改 - 或者如果您确实进行更改,则必须将它们保留在您的分支上,始终与他们的分支分开。
但这正是Git一开始就做的事情,只要您避免运行git merge(以及git rebase等)。 git pull 命令由 git fetchgit merge 组成。(好吧,你可以配置或告诉它使用 git rebase 而不是 git merge。但你都不想要。)所以...不要使用 git pull
对于任何新手来说,这是一个好建议:避免使用 git pull,因为它会做两件事情,而你只想做一件事情,然后再考虑一下你是否想要任何第二件事情,更不用说 git merge 或者 git rebase 作为第二件事情了。
janos的回答所述,如果你没有自己的提交,但想要使当前分支与origin/master完全匹配,可以简单地使用git reset --hard。请注意,当你运行git fetch时——我建议使用git fetch origin,而不是git fetch origin master1——你的Git将获取所有他们的分支,但会将它们重命名:他们的master变成了你的origin/master,他们的develop变成了你的origin/develop,他们的feature/thing变成了你的origin/feature/thing等。

如果你确实需要并因此进行了自己的提交,在自己的分支上,请确保不要将它们命名为origin/whatever(这会很困惑2),在确定这是一个好主意之前,请不要尝试合并或变基它们。


在当前/现代的Git中,添加master会限制你的Git仅选择他们的master,而你的Git像往常一样更新origin/master。在旧版本(1.8.4之前)的Git中,添加master同样会限制你的Git,但也会使它不更新origin/master。所以你得到了他们的工作,但你立即忘记了所有关于它的内容,这对你没有好处。只获取master可以节省一些网络时间,然后你会浪费数小时来尝试弄清楚为什么你什么都没得到,只发现你选择的Linux发行版出于某种难以理解的原因使用了一个400年前的Git版本。:-) Git不会被搞糊涂——它非常了解本地和远程跟踪分支——但对于人类来说,将origin/bruce作为本地分支和不同的origin/bruce作为远程跟踪分支会非常令人困惑。
略微夸张一下以增加幽默效果。

那么您的意思是,如果我只对此本地存储库执行拉取操作,而没有进行任何提交 - 无论有多少人在远程提交,我都不会在拉取时在本地遇到合并冲突? - steakoverflow
漂亮的回答(+1)。但我仍然认为主要建议应该是 git fetch origin master,而 git fetch origin 只是次要的(仅适用于旧版本)。 - janos
@janos:你觉得这样能节省很多时间吗?我发现它很少会节省什么时间:通常从拉取其他分支带来的额外开销,在这些提交合并时至少会回收大部分成本。我现在花费了约5秒钟,明天花费了约2秒钟,而不是现在花费约3秒钟,明天花费约3.5秒钟。当然,6.5比7少一点,但我花费的时间比那还多,因为我要删除打错的字。 :-) 我想这可能很大程度上取决于你的代码库的性质。 - torek
@vani,我真的认为你应该接受torek的答案,而不是我的。他的回答更详细地解决了你的问题,并且比我写的要完整得多(还有幽默)。 - janos
@janos:我也是这样做的(git fetch),但我经常设置多个远程,所以最终不得不运行几个 git fetch,或者定义一个远程组或其他什么。我曾经认为版本2.0之前的Git很少见,但某些未被提及的咳咳centos咳咳发行版仍然使用1.7.x! - torek
显示剩余2条评论

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