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

bmi*_*esp 194 git git-pull

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

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

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

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

我想要发生的是:我希望实时和测试站点的拉力总是覆盖/合并拉.总是.这些回购将是拉动的,因为它们不适合开发.

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

Amb*_*ber 485

真正做到这一点,理想的方式是不使用pull在所有的,而是fetchreset:

git fetch origin master
git reset --hard FETCH_HEAD
git clean -df
Run Code Online (Sandbox Code Playgroud)

(改变master你想要跟随的任何分支.)

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

clean根据系统的需要,您可能需要考虑稍微不同的选项.

  • `FETCH_HEAD`是一个由`fetch`自动创建的引用,用于表示获取的引用.它没有合并,只要你进行提取就直接覆盖.`clean`是一个删除未被`git`跟踪的文件的命令,`-df`标志告诉它删除目录(`-d`)并实际执行删除(`-f`). (21认同)
  • 你可能想在使用`git clean -df`之前使用`git clean -dn`,这样你就会看到哪些文件/文件夹会被删除.如果你有备份,`git clean -df`只能被撤销 (13认同)
  • 为什么没有这个关键字?我需要的不仅仅是拉动. (4认同)
  • @ user730569`reset --hard`是一个命令,用于强制工作目录(和当前分支)的状态为与特定提交的状态匹配的状态. (3认同)
  • @NickMiddleweek 我担心 `git clean -df` 也会删除 gitignored 文件,但事实证明它不会。`git clean --help` 表示“通常,只会删除 Git 未知的文件,但如果指定了 -x 选项,则会删除被忽略的文件。例如,这对于删除所有构建产品很有用。” (2认同)

use*_*007 20

你可以试试这个:

git reset --hard HEAD
git pull
Run Code Online (Sandbox Code Playgroud)

(从如何强制"git pull"覆盖本地文件?)

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


Mat*_*lfe 6

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

git reset --hard
git pull
Run Code Online (Sandbox Code Playgroud)

甚至

git stash
git pull
Run Code Online (Sandbox Code Playgroud)


And*_*son 5

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

git reset --hard origin/current_branch
Run Code Online (Sandbox Code Playgroud)

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


Dzm*_*try 5

git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch
Run Code Online (Sandbox Code Playgroud)