如何在执行 git pull
命令时强制覆盖本地文件?我的本地仓库中包含与服务器上相同文件名的文件。
错误:无法完成合并,未跟踪的工作树文件 'example.txt' 将被覆盖。
如何在执行 git pull
命令时强制覆盖本地文件?我的本地仓库中包含与服务器上相同文件名的文件。
错误:无法完成合并,未跟踪的工作树文件 'example.txt' 将被覆盖。
以下是我们正在使用的最干净的解决方案:
# Fetch the newest code
git fetch
# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
rm -f -- "$file"
done
# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
git checkout -- "$file"
done
# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
第一条命令获取最新的数据。
第二条命令检查是否有任何文件被添加到仓库,并从本地仓库中删除这些未跟踪的文件,这将引起冲突。
第三条命令检出所有在本地修改过的文件。
最后,我们执行拉取操作以更新到最新版本,但这次没有冲突,因为不再存在在repo中的未跟踪文件,而且所有在本地修改过的文件已经与仓库中的文件相同了。
git merge origin/master
会更快,而且可能更安全。因为如果在删除此脚本文件期间有人推送了新更改(虽然不太可能,但仍有可能),整个拉取过程可能会失败。我之所以加入 pull
是因为有些人可能不是在主分支上工作,而是在其他分支上,我希望这个脚本是通用的。 - Strahinja Kustudic.gitignore
中。 - Sebi首先,尝试标准方法:
git reset HEAD --hard # To remove all not committed changes!
git clean -fd # To remove all untracked (non-git) files and folders!
警告:如果您没有提交数据/文件,则上述命令可能会导致数据/文件丢失!如果您不确定,请首先备份整个存储库文件夹。
然后再次拉取它。
如果上述方法无效,且您不关心未跟踪的文件/目录(为了安全起见,请先备份),请尝试以下简单步骤:
cd your_git_repo # where 'your_git_repo' is your git repository folder
rm -rfv * # WARNING: only run inside your git repository!
git pull # pull the sources again
这将删除所有 git 文件(除了你拥有所有提交的 .git/
目录)并重新拉取。
为什么 git reset HEAD --hard
在某些情况下会失败?
.gitattributes
文件中自定义规则
在 .gitattributes 文件中添加 eol=lf
规则可能导致 git 修改一些文件更改,将某些文本文件中的 CRLF 换行符转换为 LF。
如果是这种情况,您需要通过在 git status
中查看它们来提交这些 CRLF/LF 更改,或尝试使用 git config core.autocrlf false
临时忽略它们。
文件系统不兼容
当您使用不支持权限属性的文件系统时。
例如,在 Linux/Mac (ext3
/hfs+
) 上有一个存储库,在基于 FAT32/NTFS 的文件系统上有另一个存储库。
正如您所注意到的,有两种不同类型的文件系统,因此不支持 Unix 权限的文件系统基本上无法在不支持该类型权限的系统上重置文件权限,因此无论您如何尝试 --hard
,git 都会始终检测到一些“更改”。
在之前的回答中提到了拉取/获取/合并,我想分享一个有趣且高效的技巧:
git pull --rebase
这是我在 Git 生涯中最有用的命令,它节省了很多时间。
在将新提交推送到服务器之前,请尝试此命令,它会自动将最新的服务器更改(使用fetch + merge)同步,并将您的提交置于 Git 日志的顶部。 不需要担心手动拉动/合并。
在 What does "git pull --rebase" do? 中找到详细信息。
git pull -r
。 - kenorbgit add -A
,2)git commit -m
,3)最后是git pull rebase
。谢谢。 - Pathros我曾遇到同样的问题,但没人给我这个解决方案,但它对我有效。
我是这样解决的:
.git
目录。git reset --hard HEAD
git pull
git push
现在它可以工作了。
如果您不想始终粘贴分支名称或者想在脚本中自动执行此操作,这是一种通用解决方案
git fetch
git reset --keep origin/$(git rev-parse --abbrev-ref HEAD)
如果您也想重置本地更改:
git fetch
git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)
您还可以使用以下命令添加bash别名:
alias gplf='git fetch && echo "HEAD was at $(git rev-parse --short HEAD)" && git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)'
alias gplf='git fetch && echo "HEAD was at $(git rev-parse --short HEAD)" && git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)'
。 - Paul Odeongit fetch
,然后再运行 git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)
。我选择它是因为它简单易懂,并且答案最近更新过。 - Nike我遇到了类似的问题。我必须这样做:
git reset --hard HEAD
git clean -f
git pull
git clean
命令。 - nategood我总结了其他答案。您可以执行git pull
而不出现错误:
git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull
警告:此脚本非常强大,因此您可能会失去所做的更改。
git reset --hard HEAD
可能是多余的;我的本地手册(2.6.3版)显示,第二行中的 git reset --hard origin/master
在所有形式上都“默认为 HEAD”。 - arichards#/bin/sh
# Fetch the newest code
git fetch
# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
echo "Deleting untracked file $file..."
rm -vf "$file"
done
# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
echo "Checking out modified file $file..."
git checkout $file
done
# Finally merge all the changes (you could use merge here as well)
git pull
这里似乎大部分答案都集中在master
分支,但是有时我会在两个不同的地方工作于同一个特性分支,并且我希望在其中一个分支上进行的变基被反映到另一个分支中,而不需要太多复杂的操作。
结合RNA的回答和torek对类似问题的回答,我想到了以下方法,它运行得非常出色:
git fetch
git reset --hard @{u}
如果你从一个分支运行它,它只会将你的本地分支重置为上游版本。
这也可以很好地放入到 git 别名 (git forcepull
) 中:
git config alias.forcepull "!git fetch ; git reset --hard @{u}"
或者,在你的.gitconfig
文件中:
[alias]
forcepull = "!git fetch ; git reset --hard @{u}"
享受!
我不确定为什么还没有人谈论FETCH_HEAD
git fetch origin master && git reset --hard FETCH_HEAD
如果您想将其放在别名中,命令将是:git config --global alias.fpull '!git fetch origin master && git reset --hard FETCH_HEAD'
&&
替换了 &
。 - Ahmad Ismail
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