我正在做一个开源lib的git pull,我不在乎我的本地副本是什么我只想用原始版本更新它。
即。它可以吹走我当地的变化。
答案 0 :(得分:75)
这应该可以解决问题:
git reset --hard HEAD
git pull
答案 1 :(得分:30)
git fetch
git checkout origin/name_of_branch # correct state but in 'head without a name'
git checkout -B name_of_branch # overwrite current tree onto name_of_branch
这会将远程跟踪分支检查到没有名称的头部,然后您可以查看并检查您是否满意。无论何时你想要(甚至在更改或提交之后),第二个git checkout都会用'name_of_branch'标记当前树,即使它必须删除旧的name_of_branch来执行此操作。
git命令的语法似乎不直观。事实上,这是Git数据模型不直观。这是一个不错的设计,但因为它可以与文件,分支机构一起使用,其提交方式比其他版本控制系统更灵活,更强大。一旦你了解这些东西在Git中是如何工作的,命令行就会很有意义,你将能够准确地猜出如何做复杂的事情。
git fetch
此提取自上次以来origin
服务器上发生的所有更新。 Git将从服务器获取的内容与更新,合并等任何分支分开。所有名为origin/XXX
的分支都是您的服务器上最新版本的。它们不是远程分支,而是远程跟踪分支,跟踪远程分支的本地分支。执行git fetch
时,您需要更新它们,而不会触及任何自己的分支。当您执行git merge
,git rebase
等操作时,您可以使用提取的版本,而无需从服务器获取更新的副本。这意味着您可以控制何时发出网络请求(如果您并不总是连接到服务器),并且可以“获取”服务器的快照,然后随意合并。 如果有疑问,请先git fetch
。 git checkout origin/name_of_branch
git checkout
做了两件事。它将您的文件更新到该分支,并将HEAD
设置为该分支。文件的东西是你所期望的。 HEAD
事件意味着当您提交时,它们将添加到HEAD
指向的分支的末尾。 IOW,checkout
同时执行输出 - 编写正确版本的文件,并准备输入 - 准备好存储您将要执行的提交正确的地方。如果您签出名为foo
的分支,您的树将更改为foo
,和中保存的状态,您执行的下一次提交将添加到foo
。在origin\xyz
的情况下,您无法将更改写入origin
分支 - 这些更改跟踪origin
服务器上的内容并且无法直接提交。因此,结帐更新文件,并将HEAD
设置为空 - 一个未命名的分支。这会阻止您意外地将新签出的内容提交回您正在使用的上一个分支,事实上,在您拥有目标分支之前,git会严重阻止您,直到您拥有目标分支。git checkout -B name_of_branch
像往常一样,当git使用一个命令执行两个不同的操作时,它们都可以单独配置。因此,checkout
所做的第二部分,将HEAD
设置为您要提交的分支,可以是新分支,而不是您正在检出的分支,如果您使用{ {1}}选项。因此-B
会将您的所有文件设置为git checkout -B new_stuff old_stuff
中的状态,但您已准备好将提交内容写入新分支old_stuff
。这是一项常见任务,可以分两步保存您检出分支然后分叉。现在,几乎所有git命令的参数都可以省略,而git将做最明显的事情。在这种情况下,即根据您所在的创建一个新的分支,而不是您想要结帐的分支。所以git接受你所在的未命名分支,并创建一个名为new_stuff
的新分支,你可以开始提交。
请注意,一个案例字母“B”表示“强制”。如果你使用“-b”git会拒绝覆盖已经存在的分支。使用“-B”它将继续执行而不会发出警告或确认。答案 2 :(得分:10)
首选,下意识,解决方案是:git reset --hard origin/master
它是专家和初学者的全能解决方案,可以迅速完成工作。 虽然在没有任何警告的情况下吹走所有未提交的更改。
更安全命令更难以输入:git checkout -B master origin/master
git config --global alias.become '!git checkout -B "$(git symbolic-ref --short HEAD)"'
从此以后,可以输入:git become origin/master