如何强制git pull在每次拉取时覆盖所有内容?


203

我有一个CENTRAL裸存储库,其中有三个开发人员存储库,这些存储库通常都可以拉到该存储库。

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

场景是这样的:我post-update在CENTRAL存储库上有一个钩子脚本,该脚本可自动访问测试和实时存储库,并在每个库上运行pull命令。这将同时更新测试服务器和实时服务器,所有这些都取决于哪个分支具有新提交。这一切都很好。

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

我想发生的事情是这样的:我希望来自实时站点和测试站点的请求总是覆盖/合并。总是。这些存储库将仅用于拉动,因为它们不用于开发。

在我所有的研究中,我找不到一个很好的解决方案来始终使请求强制覆盖本地文件。这是可能吗?如果这样的话,这将为一个伟大的发展方案做出贡献。


1
尽管我投票赞成以下“重置为您刚刚获取的内容”,但我认为解决您真正的问题的方法是不进行带外更改。修改,无论多么紧急,都应始终通过版本控制。除操作员外,没有人可以直接访问运行中的站点(例如,没有开发人员)。始终使用版本控制意味着您可以记录何时进行更改,进行更改的人以及可以使用它们的更好的工具。为什么要颠覆它,却没有真正的好处?
Phil Miller'3

1
@Novelocrat对,我明白你在说什么。不幸的是,在许多情况下,有人可以将文件直接上载到服务器。在那种情况下,我将需要运行许多命令来重新同步存储库。以前,我们使用FTP脚本将文件从存储库移至服务器。上面提出的方法将简单地消除FTP步骤,该步骤在过去非常有效。
bmilesp 2012年

3
因此,不要让人们直接访问服务器。锁定FTP和SSH访问,或告诉他们进行不负责任的更改将被解雇。从长远来看,继续这种做法只会伤害您和您的团队。
Phil Miller

Answers:


510

确实,实现此目的的理想方法是完全不使用pull,而是使用fetchand reset

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

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

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

您可能需要考虑略微不同的选项,以clean取决于系统的需求。


3
@ user730569 reset --hard是一个命令,用于将工作目录(和当前分支)的状态强制为与特定提交的状态匹配的状态。
2012年

25
FETCH_HEAD是一个自动创建的引用,fetch用来表示获取的引用。它不会合并,只要进行提取就直接覆盖。clean是消除这些不被跟踪文件的命令git,该-df标志告诉它删除目录(-d)和实际做的去除(-f)。
2012年

4
为什么没有关键字呢?我比拉需要更多的时间。
Wolfgang Fahl,

14
您可能需要在使用git clean -dn之前使用,git clean -df以便查看将删除哪些文件/文件夹。git clean -df如果有备份则只能撤消
Ibrahim Lawal 2013年

1
@NickMiddleweek我担心过git clean -df也会删除gitignored文件,但事实证明不会。git clean --help说:“通常,只删除Git未知的文件,但是,如果指定-x选项,也会删除忽略的文件。例如,这对于删除所有构建产品很有用。”
nickang '17


6

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

git reset --hard
git pull

甚至

git stash
git pull

要在一个命令来运行:git reset --hard && git pull。或者,但没有更好的,git reset --hard; git pull&&如果第一个命令成功,则using 将仅运行第二个命令。;不管第一个命令的退出代码如何,都将运行它。
mazunki

5

要提取分支的副本并从原始位置强制覆盖本地文件,请使用:

git reset --hard origin/current_branch

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


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

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 ...

2
x做什么?请解释一下开关
史蒂夫ķ

2
我认为x应该删除所有未跟踪的文件。在手册页上很难讲,这就是为什么我们有SO。
JosephK

2
@JosephK:那是不对的。的基本目的git clean已经是“从工作树中删除未跟踪的文件”(页面顶部)。通常,这不包括被忽略的文件,但是会-x告诉git clean您也包括被忽略的文件(除非这不会影响该-e选项忽略的文件)。
Dietrich Epp

2

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

git checkout *
git pull

checkout将使用上一次本地提交清除您的本地更改, pull并将其同步到远程存储库

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.