忽略本地更改时会拉动Git?


489

有没有一种方法可以git pull忽略本地文件的任何更改,而无需删除目录并执行操作git clone


17
“忽略”是指“覆盖”吗?
卡斯卡贝尔

@Cascabel这意味着要还原所有本地更改,取消提交所有本地提交,删除所有本地新文件和目录,取消删除所有本地删除的文件和目录等。总之,只需像运行一样即可运行命令rm -rf local_repo && git clone remote_url
维克多

Answers:


820

如果您是想让拉取覆盖本地更改,请像工作树是干净的那样进行合并,那么请清理工作树:

git reset --hard
git pull

如果存在未跟踪的本地文件,则可以git clean用来删除它们。使用git clean -f删除未跟踪文件,-df删除未跟踪的文件和目录,并-xdf删除未跟踪或忽略的文件或目录。

另一方面,如果您想以某种方式保留本地修改,则可以在存储之前使用存储隐藏它们,然后再重新应用它们:

git stash
git pull
git stash pop

我认为从字面上忽略更改没有任何意义,尽管-pull的一半是合并,并且它需要将提交的内容版本与其获取的版本合并。


4
如果以后git reset你的文件仍然来自远程读取不同 stackoverflow.com/questions/1257592/...
上校恐慌

3
Git是有史以来最奇怪的事情。Git重置-很难完成。然后git status:您的分支领先2次提交。
Shailen

21
@shailenTJ“本地更改”在这里表示未提交的更改,而不是本地提交。git reset --hard影响前者,而不影响后者。如果您想完全重置为远程状态,git reset --hard origin/<branch>但是-在这种情况下,通常情况下,这两个提交比您提前完成是您所做的工作,而不是您想放弃的事情。
卡斯卡贝尔2013年

2
因此,这与销毁本地存储库并重新下载一样,对吗?为了方便起见,我只希望能够强制进行拉取和覆盖更改。当我不小心在本地弄乱了某些东西而只想从存储库重新开始时,有99%的时间收到此错误消息。
sudo 2013年

如果您可能无法进行本地更改而不是头部该怎么办?例如,回购是在区分大小写的文件系统上进行的,并且是在不区分大小写的文件系统上克隆的,有2个文件具有相同的名称,但大小写不同?
xster 2014年

305

对我来说,以下工作:

(1)首先获取所有更改:

$ git fetch --all

(2)然后重置主机:

$ git reset --hard origin/master

(3)拉/更新:

$ git pull

22
当对最佳答案有很多麻烦时,对我来说非常有用。谢谢!
0x0

6
即使您已完成您的本地更改,但您仍想还原,此方法仍然有效
agsachin

16
这应该是最高的答案:)
Purus

5
@Marco Servetto:您首先要获取所有git更改,但尚未应用它们。然后,将主服务器重置为上一状态(已更新)。如果您跳过第一步,则将更改还原到旧的主数据库(本地)。根据我的经验,我描述它的方式永远不会造成问题。其他所有尝试都在最后完成。
Artur Barseghyan

1
这对我有用,我想忽略我所有的本地更改,包括恢复已删除的文件
Neri

28

您只想要一个给出与完全相同的结果的命令rm -rf local_repo && git clone remote_url,对吗?我也想要这个功能。我想知道为什么git不提供这样的命令(例如git reclonegit sync),而svn也没有提供这样的命令(例如svn recheckoutsvn sync)。

尝试以下命令:

git reset --hard origin/master
git clean -fxd
git pull

这就是真正的工作原理,即使您已经具有要删除的本地提交也是如此。
尤里·格涅谢夫

5
各位警告!也git clean -fxd从中删除文件.gitignore
拉梅什·纳维

@RameshNavi当然。这正是所要的。希望有一种更快的方法来重新克隆它,即删除整个本地存储库,然后克隆它。
维克多

27

下面的命令永远不会起作用。如果您只是做:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

等等...

真正重新开始,下载分支并覆盖所有本地更改,只需执行以下操作:


$ git checkout thebranch
$ git reset --hard origin/thebranch

这样就可以了。

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
是。这就是我最终需要“不给本地人一个F”的方法所需要的。谢谢。:)
Adambean '16



8

如果您使用的是Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

for循环将删除在本地存储库中更改的所有跟踪文件,因此git pull可以正常工作。
最好的事情是,只有被跟踪的文件将被仓库中的文件覆盖,所有其他文件将保持不变。


我认为您的意思是“跟踪文件”,这正是我所需要的,谢谢。
阿里

Powershell有什么等效功能吗?
Earlee

8

最简单的方法是:

git pull --rebase --autostash

以前不知道--autostash,谢谢!
shiro

7

这对我有用

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

接受答案后,出现冲突错误


这与Artur Barseghyan在2015年的回答非常相似...但是我仍然想知道第三条命令的目的是什么:第二条命令后工作文件已更改,第三条命令说:“已更新“
麦克·啮齿动物

这是在我的环境中起作用的唯一组合,也许您看到的是另一件事,对我来说,我需要三个命令
Pablo Pazos

有趣。可能是版本的东西。我在git 2.7.4上。但是我也刚刚看到Artur Barseghyan的新评论:“否则,您可能会发现自己在意外过时的大师上工作。”
麦克啮齿动物

也许,但是我唯一能说的是“这在没有其他解决方案的情况下对我
有用


2

这将获取当前分支并尝试快速转发到master:

git fetch && git merge --ff-only origin/master

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.