【问题标题】:How to `git pull` while ignoring local changes?如何在忽略本地更改的同时`git pull`?
【发布时间】:2011-05-08 14:47:52
【问题描述】:

有没有办法执行git pull 忽略任何本地文件更改,而不会删除目录并且必须执行git clone

【问题讨论】:

  • “忽略”是指“覆盖”吗?
  • @Cascabel 表示还原所有本地更改,取消提交所有本地提交,删除所有本地新文件和目录,取消删除所有本地删除文件和目录等。总之,只需运行命令就像rm -rf local_repo && git clone remote_url.

标签: git git-pull


【解决方案1】:

如果你的意思是你想让 pull 覆盖本地更改,就好像工作树是干净的一样进行合并,那么,清理工作树:

git reset --hard
git pull

如果有未跟踪的本地文件,您可以使用git clean 删除它们。

  • git clean -f 删除未跟踪的文件
  • -df 删除未跟踪的文件和目录
  • -xdf 删除未跟踪或忽略的文件或目录

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

git stash
git pull
git stash pop

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

【讨论】:

  • 如果在git reset 之后您的文件仍然与远程不同,请阅读stackoverflow.com/questions/1257592/…
  • Git 是有史以来最奇怪的东西。 Git 重置——很难完成。然后 git status: 你的分支领先 2 次提交。
  • @shailenTJ “本地更改”在这里是指未提交的更改,而不是本地提交。 git reset --hard 影响前者,而不是后者。如果您想完全重置为遥控器的状态,git reset --hard origin/<branch> - 但通常在这种情况下,您领先于原始的那两个提交是您所做的工作,而不是您想要丢弃的东西。
  • 所以这与销毁本地存储库并重新下载是一回事,对吧?为了方便起见,我只想能够强制拉取和覆盖更改。当我不小心在本地搞砸了一些东西并且只想从 repo 重新开始时,我 99% 的时间都会收到此错误消息。
  • 如果您不可能没有本地更改与头部怎么办?例如。该 repo 是在区分大小写的文件系统上创建的,并且在不区分大小写的文件系统上进行了克隆,并且有 2 个具有相同名称不同大小写的文件?
【解决方案2】:

对我来说,以下工作:

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

$ git fetch --all

(2)然后重置master:

$ git reset --hard origin/master

(3) 拉取/更新:

$ git pull

【讨论】:

  • 当我对最佳答案有很多麻烦时,它对我很有帮助。谢谢!
  • 这甚至可以在您提交本地更改但您仍想恢复时工作
  • 这应该是最佳答案:)
  • @Marco Servetto:您首先获取所有 git 更改,但还没有应用它们。然后将主服务器重置为最后一个状态(更新)。如果您跳过第一步,您会将更改恢复到旧主(本地)。根据我的经验,我描述它的方式永远不会引起问题。所有其他尝试都在最后进行。
  • 这对我有用,我想忽略我所有的本地更改,包括恢复已删除的文件
【解决方案3】:

您只需要一个与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

【讨论】:

  • 这才是真正有效的方法,即使您已经有要删除的本地提交。
  • 警告各位!! git clean -fxd 也会从 .gitignore 中删除文件。
  • @RameshNavi 当然。这正是想要的。我们想要的是有一种更快的方法来重新克隆它,即删除整个本地 repo 然后克隆它。
【解决方案4】:

下面的命令不会一直工作。如果你这样做:

$ 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'

【讨论】:

  • 是的。这就是我所需要的终极“不要对本地的东西给出 F”的方法。谢谢。 :)
  • 完全删除所有本地更改,您需要命令git clean -fxd
  • 请小心git-clean - Remove untracked files from the working tree,因为这会影响“未跟踪的文件”,而不是 OP 所要求的。但是好的,很高兴在评论中出现,以防万一有人也想删除未跟踪的文件。
【解决方案5】:

最简单的方法是:

git pull --rebase --autostash

【讨论】:

    【解决方案6】:
    git fetch --all && git reset --hard origin/master
    

    【讨论】:

      【解决方案7】:

      这对我有用

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

      接受的答案出现冲突错误

      【讨论】:

      • 这与 Artur Barseghyan 的 2015 年答案非常相似......但我仍然想知道第三个命令的目的是什么:工作文件在第二个命令之后发生了变化,并且第三个命令说“已经是最新的”
      • 这是唯一适用于我的环境的组合,也许你看到的是不同的东西,对我来说,我需要三个命令
      • 有趣。可能是版本问题。我在 git 2.7.4 上。但我也刚刚看到来自 Artur Barseghyan 的新评论:“否则,您可能会发现自己正在研究不小心过时的大师。”
      • 也许吧,但我唯一能说的是“当没有其他解决方案时,这对我有用”,所以它可能对其他人有所帮助
      • 完全删除所有本地更改,您需要命令git clean -fxd
      【解决方案8】:

      查看git stash 将所有本地更改放入“存储文件”并恢复到上次提交。此时,您可以应用隐藏的更改,或丢弃它们。

      【讨论】:

        【解决方案9】:

        如果您使用的是 Linux:

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

        for 循环将删除所有在本地 repo 中更改的跟踪文件,因此git pull 将毫无问题地工作。
        最好的一点是,只有跟踪的文件会被 repo 中的文件覆盖,所有其他文件都不会被触及。

        【讨论】:

        • 我认为您的意思是“跟踪文件”,这正是我所需要的,谢谢。
        • Powershell 的任何等价物?
        【解决方案10】:

        我通常这样做:

        git checkout .
        git pull
        

        在项目的根文件夹中。

        【讨论】:

        • 它将删除本地更改
        • @UjjwalRoy 从对问题的评论来看,我相信这是意图。但是当我想保存本地更改时,我使用 git add -A git stash
        【解决方案11】:

        这将获取当前分支并尝试快进到 master:

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

        【讨论】:

          【解决方案12】:

          .gitignore

          “只要您最初没有将不需要的文件提交到任何分支,就可以将不需要的文件添加到 .gitignore。”

          你也可以运行:

          git update-index --assume-unchanged filename
          

          https://chamindac.blogspot.com/2017/07/ignoring-visual-studio-2017-created.html

          【讨论】:

            【解决方案13】:

            此外,可以保留本地提交的更改并将它们作为新提交推送。当我的本地提交出现混乱时,我会使用这些步骤。

            1. git reset --soft origin/main
            2. git 存储
            3. git pull --rebase
            4. git stash pop

            【讨论】:

              【解决方案14】:

              已经很晚了,但有人会发现这很有用。(为我工作)

              1. git restore 或 git restore .
              2. git 拉

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-10-10
                • 2012-05-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-12-31
                • 2016-12-11
                • 2014-11-20
                相关资源
                最近更新 更多