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

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

该方案如下:

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

这是我得到的错误:

错误:未跟踪的工作树文件 “public / images / icon.gif” 将被合并覆盖

如何强制 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文件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并没有帮助。如果您有未跟踪的目录,还需要 - 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
...

像刺猬一样,我认为答案很糟糕。但是,尽管刺猬的答案可能更好,但我认为它并没有它的优雅。我发现做到这一点的方法是通过使用已定义策略的 “提取” 和 “合并”。应该这样做,以便保留本地更改,只要它们不是您要强制覆盖的文件之一即可。

首先提交您的更改

git add *
 git commit -a -m "local file server commit message"

然后获取更改并在发生冲突时覆盖

git fetch origin master
 git merge -s recursive -X theirs origin/master

“-X” 是选项名称,“theirs” 是该选项的值。如果发生冲突,您选择使用 “他们的” 更改,而不是 “您的” 更改。

而不是做:

git fetch --all
git reset --hard origin/master

我建议您执行以下操作:

git fetch origin master
git reset --hard origin/master

如果您要重置为 Origin / master 分支,就不需要获取所有的遥控器和分支吗?

看来最好的方法是先这样做:

git clean

要删除所有未跟踪的文件,然后继续执行常规的git pull ...

警告,如果您在 gitignore 文件中有任何目录 / * 条目,这样做将永久删除您的文件。

一些答案似乎很糟糕。在遵循 David Avsajanishvili 的建议后,@ Lauri 发生了什么事情,真是太糟糕了。

而是(git> v1.7.6):

git stash --include-untracked
git pull

稍后,您可以清除存储历史记录。

手动一对一:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

一次残酷地:

$ git stash clear

当然,如果您想回到自己的藏身之处:

$ git stash list
...
$ git stash apply stash@{5}

您可能会发现此命令有助于丢弃本地更改:

git checkout <your-branch> -f

然后进行清理(从工作树中删除未跟踪的文件):

git clean -f

如果要除去未跟踪文件之外的其他未跟踪目录,请执行以下操作:

git clean -fd

而不是与git pull合并,请尝试以下操作:

git fetch --all

其次是:

git reset --hard origin/master

唯一对我有用的是:

git reset --hard HEAD~5

这将带您退回五次提交,然后

git pull

通过查找如何撤消 Git 合并 ,我发现了这一点。