我有一个CENTRAL裸存储库,它有三个开发人员存储库正常拉动并推送它。
我还有另外两个来自CENTRAL裸仓库的存储库:一个是实时服务器,另一个是测试/阶段服务器 - 每个都来自各自的分支。
场景是这样的:我在CENTRAL repo上有一个post-update
钩子脚本,它自动访问测试和实时回购并在每个上运行一个pull命令。这会更新测试服务器和实时服务器,具体取决于具有新提交的分支。这一切都很有效。
问题在于:在紧急情况下有时可能会在服务器上直接更新文件(通过ftp或其他),然后CENTRAL更新后脚本将失败,因为会发生合并/覆盖冲突。没有办法避免这种情况,这是不可避免的。
我希望发生的是:我希望从实时和测试网站的拉动到总是覆盖/合并拉。 始终。 这些回购将仅限拉动,因为它们不用于开发。
在我的所有研究中,我找不到一个好的解决方案,让总是强制覆盖本地文件。这是可能吗?如果是这样,那将是一个很好的发展方案。
答案 0 :(得分:465)
真正理想的做法是完全不使用pull
,而是使用fetch
和reset
:
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
会将其重新绑定到远程存储库