如何在执行 git pull
命令时强制覆盖本地文件?我的本地仓库中包含与服务器上相同文件名的文件。
错误:无法完成合并,未跟踪的工作树文件 'example.txt' 将被覆盖。
如何在执行 git pull
命令时强制覆盖本地文件?我的本地仓库中包含与服务器上相同文件名的文件。
错误:无法完成合并,未跟踪的工作树文件 'example.txt' 将被覆盖。
任何未提交到版本库的本地修改都将丢失,即使已经添加到暂存区。
但是任何未被 Git 追踪的本地文件不会受到影响。
首先,将所有origin/<branch>
引用更新到最新版本:
git fetch --all
备份当前分支(例如:master
):
git branch backup-master
跳转到 origin/master
上的最新提交并检出这些文件:
git reset --hard origin/master
git fetch
命令会从远程下载最新的代码,但不会尝试合并或变基任何内容。
git reset
命令将主分支重置为刚刚获取的内容。使用 --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 add
),也将丢失。确保stash
或提交您需要的任何内容。例如,运行以下命令:
git stash
之后(在执行 git reset
后),再次应用这些未提交的更改:
git stash pop
git reset --hard origin/分支名
。意思是重新设置本地代码为远程分支的最新代码,并强制覆盖本地修改。 - Abbas Gadhiagit reflog
进行恢复,该命令会列出所有提交记录,包括没有基础的记录。但在使用 git gc
清理本地副本之前,这些记录都有可能会丢失。 - Koen.这将移除所有未提交的更改,即使已暂存,
然后进行拉取操作:
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
...
.gitignore
中,否则它们将会被包含进来。 - Bleeding Fingersgit clean -dfx
命令。其中的-x
选项会忽略.gitignore
文件中的内容。通常,构建产物会被列入.gitignore
文件中。 - Paul Draper我认为Hedgehog的回答很糟糕。虽然Hedgehog的回答可能更好一些,但我认为它不够优雅。我找到的方法是使用fetch
和merge
来定义一个策略。只要您没有试图用其覆盖的文件之一来强制覆盖,这样做应该可以保留您的本地更改。
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
是该选项的值。如果存在冲突,您选择使用their
更改(另一个选项是ours
更改)。
git fetch other-repo
;2)git merge -s recursive -X theirs other-repo/master
。 - quux00不要做以下这样的事情:
git fetch --all
git reset --hard origin/master
我建议按照以下步骤进行:
git fetch origin master
git reset --hard origin/master
如果你要重置到origin/master分支,那么就不需要获取所有的远程仓库和分支对吧?
git add .
,然后再执行 git reset --hard
。 - Johanneke看起来最好的方法是首先进行:
git clean
要删除所有未跟踪的文件,然后继续进行常规的 git pull
操作...
git clean
是最好的答案吗?似乎删除文件并不一定是提问者想要的。他们要求的是“覆盖本地文件”,而不是删除。 - JohnAllen警告:如果你的.gitignore文件中有directory/*条目,那么这样做将永久删除你的文件。
一些回答似乎很糟糕。 @Lauri按照David Avsajanishvili的建议所做的事情就是一个例子。
更好的方式(git > v1.7.6):
git stash --include-untracked
git pull
稍后您可以清理stash历史记录。
手动逐个删除:
$ 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 stash apply
将所有未被跟踪的文件都恢复了,但是(正确地)排除了合并已经创建的文件:“已存在,无法检出”。完美解决。 - BigBlueHat你可能会发现这个命令有助于抛弃本地修改:
git checkout <your-branch> -f
然后进行清理操作(从工作树中删除未跟踪的文件):
git clean -f
如果您想除了未跟踪的文件之外,还要删除未跟踪的目录:
git clean -fd
不要使用git pull
合并代码,尝试以下操作:
git fetch --all
随后执行:
git reset --hard origin/master
。
origin/branch_to_overwrite
相同的状态,包括代码和提交记录。命令为:git reset --hard origin/branch_to_overwrite
。 - Andrew Atkinsongit branch <branch> -D
git reset <commit> --hard
git branch <branch>
git --set-upstream-to=origin/<branch> <branch>
git pull
git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
。 - Chloe