【发布时间】:2011-05-31 20:36:27
【问题描述】:
我正在做一个开源库的 git pull,我不在乎我的本地副本是什么,我只想用原始版本更新它。
即它可以吹走我的本地更改。
【问题讨论】:
标签: git
我正在做一个开源库的 git pull,我不在乎我的本地副本是什么,我只想用原始版本更新它。
即它可以吹走我的本地更改。
【问题讨论】:
标签: git
这应该可以解决问题:
git reset --hard HEAD
git pull
【讨论】:
git reset --hard origin/master。
git pull --rebase
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 会同时执行 output - 编写文件的正确版本,并为 input 做准备 - 准备好将您要执行的提交存储在正确的位置地方。如果您签出一个名为 foo 的分支,您的树将更改为保存在 foo 中的状态,并且您所做的下一次提交将添加到 foo。在origin\xyz 的情况下,您不能将更改写入origin 分支——这些跟踪origin 服务器上的内容并且不能直接提交。因此结帐更新文件,并将HEAD 设置为空——一个未命名的分支。这可以防止您不小心将新签出的内容提交回您正在使用的上一个分支,事实上,在您拥有目标分支之前,git 会严重阻止您提交。git checkout -B name_of_branch
像往常一样,当 git 用一个命令做两件不同的事情时,它们都可以单独配置。所以checkout 所做的第二部分,将HEAD 设置为您要提交的分支,如果您使用-B 选项,则可以是一个新分支,而不是您要签出的分支。所以git checkout -B new_stuff old_stuff 会将你的所有文件设置为old_stuff 中的状态,但让你准备好将提交写入新分支new_stuff。这是一项常见任务,只需两步,您就可以检出一个分支然后分叉它。现在,几乎所有 git 命令的参数都可以省略,而 git 会做最明显的事情。在这种情况下,基于您所在的分支创建一个新分支,而不是您想要结帐的分支。所以 git 使用你所在的未命名分支,并创建一个名为 name_of_branch 的新分支,你可以开始提交。
请注意,大写字母“B”表示“强制”。如果你使用“-b”,git 会拒绝覆盖已经存在的分支。使用“-B”,它会在没有警告或确认的情况下继续执行。【讨论】:
首选,膝跳,解决方案是:git reset --hard origin/master†
† 或 origin/main 或任何您所在分支的名称。
对于专家和初学者来说,这是一个万能的解决方案,可以迅速完成工作。 尽管在没有警告的情况下吹走所有未提交的更改。
safer 命令输入起来有点麻烦:git checkout -B master origin/master
git config --global alias.become '!git checkout -B "$(git symbolic-ref --short HEAD)"'
从此以后,可以输入:git become origin/master
【讨论】:
origin/master 给出错误信息。 origin/main 有效。此外,文件夹和文件具有当前日期/时间,而不是 repo 中的日期/时间。