如何强制git pull覆盖每次拉动的所有内容?

时间:2012-03-06 18:36:29

标签: git git-pull

我有一个CENTRAL裸存储库,它有三个开发人员存储库正常拉动并推送它。

我还有另外两个来自CENTRAL裸仓库的存储库:一个是实时服务器,另一个是测试/阶段服务器 - 每个都来自各自的分支。

场景是这样的:我在CENTRAL repo上有一个post-update钩子脚本,它自动访问测试和实时回购并在每个上运行一个pull命令。这会更新测试服务器和实时服务器,具体取决于具有新提交的分支。这一切都很有效。

问题在于:在紧急情况下有时可能会在服务器上直接更新文件(通过ftp或其他),然后CENTRAL更新后脚本将失败,因为会发生合并/覆盖冲突。没有办法避免这种情况,这是不可避免的。

我希望发生的是:我希望从实时和测试网站的拉动到总是覆盖/合并拉。 始终。 这些回购将仅限拉动,因为它们不用于开发。

在我的所有研究中,我找不到一个好的解决方案,让总是强制覆盖本地文件。这是可能吗?如果是这样,那将是一个很好的发展方案。

7 个答案:

答案 0 :(得分:465)

真正理想的做法是完全不使用pull,而是使用fetchreset

git fetch origin master
git reset --hard FETCH_HEAD
git clean -df

(将master更改为您想要关注的任何分支。)

pull是围绕以某种方式合并更改而设计的,而reset是围绕简单地使本地副本与特定提交匹配而设计的。

根据您的系统需求,您可能需要考虑与clean略有不同的选项。

答案 1 :(得分:20)

你可以试试这个:

git reset --hard HEAD
git pull

(来自How do I force "git pull" to overwrite local files?

另一个想法是删除整个git并制作一个新的克隆。

答案 2 :(得分:6)

我不确定如何在一个命令中执行此操作,但您可以执行以下操作:

git reset --hard
git pull

甚至

git stash
git pull

答案 3 :(得分:5)

从原点使用拉出分支的副本并强制覆盖本地文件

git reset --hard origin/current_branch

所有当前的工作都将丢失,然后它将与原始分支相同

答案 4 :(得分:4)

git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch

答案 5 :(得分:2)

您可以更改挂钩以擦除所有内容。

# Danger! Wipes local data!

# Remove all local changes to tracked files
git reset --hard HEAD

# Remove all untracked files and directories
git clean -dfx

git pull ...

答案 6 :(得分:2)

如果您自上次拉取/克隆以来尚未提交本地更改,则可以使用:

git checkout *
git pull

checkout将使用上次本地提交清除您的本地更改,并且 pull会将其重新绑定到远程存储库