如何放弃本地更改并从GitHub存储库拉取最新版本

116

我在我的电脑上有一个目录,其中存储了来自GitHub的所有项目。我打开其中一个项目,并在本地进行了更改。该项目出现了问题,现在我想放弃我所做的所有更改并从存储库中拉取最新版本。我相对于GitHub是新手,使用Git Shell。

git pull命令是否足够? 我需要额外做些什么来放弃本地所做的更改吗? 有人可以帮忙吗?

8个回答

155

git reset是您想要的,但我将添加一些其他答案没有提到但您可能会发现有用的东西。

git reset --hard HEAD将您的更改重置回本地存储库跟踪的最后一次提交。如果您已经提交了但没有推送到GitHub,并且也想抛弃该提交,请参见@absiddiqueLive的答案。

git clean -df会丢弃您可能添加的任何新文件或目录,以防您想要将这些内容抛弃。如果您没有添加任何内容,则无需运行此命令。

git pull(或者如果您正在使用GitHub客户端的git shell)git sync将从GitHub获取新更改。

来自未来的编辑: 我在几周前更新了我的git shell并注意到默认情况下不再定义git sync命令。仅供参考,在bash中键入git sync等同于git pull && git push。我发现它仍然有帮助,因此将其加入了我的bashrc。


无论我怎么做都不行,我一直收到这个错误:在合并之前,请移动或删除它们。 - Stepan Yakovenko
@StepanYakovenko听起来你的代码库正在尝试合并,如果你输入git status应该会有提示。可以参考这个问题:https://dev59.com/VloV5IYBdhLWcg3wmPzp - Cody
1
如果要删除目录,你需要运行 git clean -fd - Josiah Yoder

46

运行以下命令

git log
从这里,您将获得您的最后一次推送提交的哈希键。
git reset --hard <your commit hash key>

最终,这彻底清理了我的源代码 :) 谢谢! - Gwyneth Llewelyn

18

如果您已经提交了更改,那么您需要撤销更改

如果您还没有提交,请使用git checkout .进行干净的检出操作。


9
小心使用 revert。通常最好只重置(reset)。revert会创建一个新的提交(commit),用于移除或添加回之前提交(commit)中的内容。然而,这些删除和“添加回”操作可能会在以后尝试与另一个分支合并时引起问题,因为它们被视为更改。例如,如果您在A分支中意外进行了更改,然后撤消(change)该更改,然后在B分支中进行了相同的更改,将B分支推送(push)后再推branch A,branch A可能会删除您在branch B中所做的更改。 - JDB
@JDB 啊,是的,谢谢 - 我自己在极少数情况下需要使用 reset,只是在写答案时将其与 revert 混淆了。 - General_Twyckenham

7

我搞砸了我的git本地主分支,本地主分支偏离了远程本地分支。

为了使git本地和主分支同步,按照以下步骤进行:

  • git fetch --all

  • git reset --hard origin/master

如果你在其他分支上,可以像下面这样使用分支名称

  • git reset --hard origin/<branch_name>

它是如何工作的?

  1. git fetch 从远程下载最新版本而不尝试合并或变基任何内容。

  2. git reset 将主分支重置为刚才提取的内容

  3. --hard选项将工作树中的所有文件更改为与origin/master中的文件相匹配

如果您想在与远程分支同步之前保留本地更改。

创建一个备份分支以备份

  • git checkout master (或本地分支名称)
  • git branch 新分支名称
  • 按照上述步骤将头重置为远程分支头。

在运行了答案中的命令后,git pull 仍会从远程获取文件。我该如何在远程上为所有分支运行此重置? - Dan Dascalescu

6
除了以上的答案,还有一种"焦土政策"的方法。
rm -R <folder>

在Windows shell中,命令是:
rd /s <folder>

那么您可以再次检查项目: ```然后您只需再次检出该项目:```
git clone -v <repository URL> 

这将绝对地移除所有本地更改,并从远程仓库拉取最新的内容。请注意,rm -R 命令会删除您的好数据,如果您传入了错误的路径,请小心使用。例如,绝对不要执行以下命令:

rm -R /

编辑:为纠正拼写并强调内容。


2
说实话,我感到很尴尬,因为我经常需要依赖这个。 - Reticulated Spline
1
这实际上比其他提到的方法更为宁静和有说服力。我知道对于一个拥有数百或数千个文件的代码库来说可能会有点痛苦,但希望这不是日常任务。 - Sam Sirry

3

在其他人说的基础上,我会做以下操作。如果您已经暂存了更改,也就是说您已经在某个时候执行了 "git add",那么我会执行:

git reset HEAD <file_name>

如果您还没有为更改声明文件,就像之前有人提到的那样,请执行以下操作:
git checkout . 

0

我通常用以下方式实现:

git fetch "${remote-origin}" &&
git reset --hard @{u}

fetch 从远程获取最新的内容(你可以直接执行 git fetch 或者 git fetch origin),而 reset 则将本地分支设置为与上游分支引用相同的提交。@{u} 是一个方便的快捷方式,表示 "upstream"。


-10

推送旧仓库。

git push -u origin master --force

我认为 --force 对于拉取也是有效的。


3
这正好与原帖作者想要做的相反。 - JDB
我认为 "--force" 对于拉取操作也会起作用,那不是可以吗? - Ronnie Royston
1
git pullgit fetchgit merge FETCH_HEAD 的简写。fetch 命令有一个 --force 选项,但它与覆盖当前分支上的修改并无关系。因此,虽然在技术上 git pull --force 是合法的,但它并不会做你认为它会做的事情。 - JDB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接