git - Git在pull 时强制覆盖本地文件

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

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

如何让Git覆盖它们?

时间:

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

如果你有任何文件不是按git跟踪(e。g。 上传的用户内容,这些文件不会受到影响。


我认为这是正确的方法:


git fetch --all
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 reset --hard HEAD
git pull

应该做你想要做的。

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


有时候clean -f并没有帮助,如果你有未跟踪的目录,则还需要-d选项:


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

像刺猬我觉得答案很糟糕。 虽然他可能会更好,但我认为它并不是那么优雅。 我发现这样做的方法是使用"获取"和"合并"来定义一个策略。 这将使你的本地更改保持不变,只要它们不是你试图强制覆盖的文件之一。

首先提交你的更改


 git add *
 git commit -a -m"auto dev server commit"

然后获取所做的更改并改写如果出现冲突


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

不要做:


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

我建议执行以下操作:


git fetch origin
git reset --hard origin/master

如果你要重置为origin/master分支,则无需获取所有遥控器吗?

看起来最好的方法是先做:

 
git clean

 

删除所有未跟踪的文件,然后继续正常的git pull 。

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


git checkout <your-branch> -f

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

 
git clean -f

 

如果要删除未跟踪的文件之外的未跟踪目录:

 
git clean -fd

 

这些似乎是可怕的答案,在 @Lauri Avsajanishvili的建议下发生了可怕的错误。

更改为( git> v1.7.6 ):


git stash --include-untracked
git pull

稍后你可以清理储藏历史。

手动,one-by-one:


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

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

残酷地,all-at-once:


$ git stash clear

当然,如果你想回到你所隐藏的内容:


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

我已经按请求将评论重新提交为答复:

不是使用 git pull 进行合并,而是先尝试 git fetch --all,然后再尝试 git reset --hard origin/master

所有这些解决方案的问题在于它们都太复杂,或者更大的问题是它们从服务器中删除所有未跟踪的文件,我们不想要这些文件,因为总是需要配置文件它们位于服务器上而不是Git存储库中。

下面是我们使用的最干净的解决方案:


# 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中不存在的文件已经与存储库相同。

...