【问题标题】:How to force update when doing git pull?执行 git pull 时如何强制更新?
【发布时间】:2011-05-31 20:36:27
【问题描述】:

我正在做一个开源库的 git pull,我不在乎我的本地副本是什么,我只想用原始版本更新它。

即它可以吹走我的本地更改。

【问题讨论】:

    标签: git


    【解决方案1】:

    这应该可以解决问题:

    git reset --hard HEAD
    git pull
    

    【讨论】:

    • 如果您创建了任何要丢弃的本地提交,请改用:git reset --hard origin/master
    • 如果您没有自定义本地更改,您可能想要做git pull --rebase
    • 对我获取 CONFLICTS 和自动合并失败消息不起作用。我不在乎我只想完全覆盖所有内容...
    • @schwiz 您可以删除分支,或重命名它,然后重新创建它以从源跟踪:stackoverflow.com/questions/2665045/…
    • 此答案假定您从未对您的分支进行任何提交,这与问题所说的相差甚远(“我不在乎我的本地副本是什么”)。
    【解决方案2】:
    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 mergegit 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”,它会在没有警告或确认的情况下继续执行。

    【讨论】:

    • @cept0 如果你只看了几百字的粗体粗体解释,你也可以学会爱上 git 命令语法!
    【解决方案3】:

    首选,膝跳,解决方案是: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 中的日期/时间。
    • 已更新以明确分支名称。关于日期/时间的事情听起来像是一个不好的期望,因为 git 不记录文件或文件夹的时间戳。
    • 我希望在时间戳上有所不同。 Git 会告诉您文件上次更改的时间是多少分钟、几小时、几天、几个月或几年。这只有在每个文件上都有时间戳才能实现。
    • @WinEunuuchs2Unix 在 GitHub 等可视化中的信息基于提交的时间戳。这不是文件的时间戳。 Git isn't concerned about file-system timestamps 并且在签出文件时既不记录也不尝试恢复所述时间戳。
    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2018-05-20
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多