协慌网

登录 贡献 社区

如何强制 “git pull” 覆盖本地文件?

如何在git pull上强制覆盖本地文件?

场景如下:

  • 团队成员正在修改我们正在处理的网站的模板
  • 他们正在向 images 目录添加一些图像(但忘记在源代码管理下添加它们)
  • 他们稍后通过邮件发送图像给我
  • 我在源控件下添加图像并将其与其他更改一起推送到 GitHub
  • 他们无法从 GitHub 中提取更新,因为 Git 不想覆盖他们的文件。

这是我得到的错误:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

如何强制 Git 覆盖它们?这个人是设计师 - 通常我会手动解决所有冲突,因此服务器具有他们只需要在他们的计算机上更新的最新版本。

答案

重要提示:如果您有任何本地更改,它们将丢失。无论有没有--hard选项,任何未被推送的本地提交都将丢失。 [*]

如果您有任何未被 Git 跟踪的文件(例如上传的用户内容),则这些文件不会受到影响。


我认为这是正确的方法:

git fetch --all

然后,您有两个选择:

git reset --hard origin/master

或者如果你在其他分支上:

git reset --hard origin/<branch_name>

说明:

git fetch从远程下载最新版本而不尝试合并或重新绑定任何内容。

然后git reset将 master 分支重置为刚刚获取的分支。 --hard选项更改工作树中的所有文件以匹配origin/master中的文件


维护当前的本地提交

[*] :值得注意的是,可以通过在重置之前从master创建分支来维护当前的本地提交:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

在此之后,所有旧提交将保留在new-branch-to-save-current-commits

未提交的更改

然而,未提交的更改(即使是暂存的)也将丢失。确保存储并提交您需要的任何内容。为此,您可以运行以下内容:

git stash

然后重新应用这些未提交的更改:

git stash pop

尝试这个:

git reset --hard HEAD
git pull

它应该做你想要的。

警告: git clean删除所有未跟踪的文件 / 目录,无法撤消。


有时只是clean -f没有帮助。如果您有未跟踪的 DIRECTORIES,还需要 - d 选项:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

警告: git clean删除所有未跟踪的文件 / 目录,无法撤消。

首先考虑使用-n ( - --dry-run )标志。这将显示在没有实际删除任何内容的情况下将删除的内容:

git clean -n -f -d

输出示例:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...