乐闻世界logo
搜索文章和话题

如何强制使用 git pull 覆盖本地文件?

9 个月前提问
5 个月前修改
浏览次数82

5个答案

1
2
3
4
5

首先,将所有 origin/<branch>参考更新为最新:

shell
git fetch --all

备份当前分支(例如 master):

shell
git branch backup-master

跳转到最新提交 origin/master并签出这些文件:

shell
git reset --hard origin/master

解释:

git fetch从远程下载最新版本,而无需尝试合并或重新设置任何内容。

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


维护当前的本地提交

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

shell
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 add),也会丢失。确保 stash或承诺您需要的任何事情。例如,运行以下命令:

shell
git stash

稍后(在 之后 git reset),重新应用这些未提交的更改:

shell
git stash pop

这可能会产生合并冲突。

2024年6月29日 12:07 回复

这将删除所有未提交的更改,即使是暂存的,
然后拉取:

shell
git reset --hard HEAD git pull

但任何未被 Git 跟踪的本地文件都不会受到影响。

2024年6月29日 12:07 回复

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


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

shell
# WARNING: this can't be undone! git reset --hard HEAD git clean -f -d git pull

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

首先考虑使用-n( --dry-run) 标志。这将向您显示将删除的内容,而无需实际删除任何内容:

shell
git clean -n -f -d

输出示例:

shell
Would remove untracked-file-1.txt Would remove untracked-file-2.txt Would remove untracked/folder ...
2024年6月29日 12:07 回复

就像刺猬一样,我认为答案很糟糕。但是,尽管刺猬的答案可能更好,但我认为它并没有达到应有的优雅。我发现做到这一点的方法是使用fetch明确merge的策略。只要本地更改不是您尝试强制覆盖的文件之一,这应该会保留您的本地更改。

首先提交您的更改

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

然后获取更改并覆盖(如果存在冲突)

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

-X是选项名称,theirs是该选项的值。如果存在冲突,您将选择使用their更改(另一个选项是更改)。ours

2024年6月29日 12:07 回复

而不是这样做:

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

我建议执行以下操作:

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

如果您要重置到 origin/master 分支,则无需获取所有遥控器和分支,对吗?

2024年6月29日 12:07 回复

你的答案