如何在忽略本地更改的情况下进行git pull?

时间:2017-07-03 14:24:19

标签: git pull git-stash

当我试图从origin / master中取出一些更改时,我收到此错误:

error: Your local changes to the following files would be overwritten by merge

因为我做了本地更改。我不想提交这些更改,所以我想我应该在我的分支上使用git stash,然后git pull origin master

我的问题是:

  1. 拉动是否会忽略更改并正确合并
  2. 拉动+合并之后我还可以使用我的本地更改而无需任何额外步骤吗?
  3. 谢谢!

    PS:是的,我用谷歌搜索,我只是想确保我理解正确。

5 个答案:

答案 0 :(得分:6)

以下是所有应用后你的回购演变的方式:

  1. 在您拉动之前,请进行本地修改:

    --*--*--*--*--*--*--A--B (<- some changes you did not commit yet)
          \             ^
           \            master: your latest local commit on master
            \
             *--*--C origin/master: the latest commit on the remote repo
    
  2. git stash之后
  3.                       B <- stash: git stored local changes in its stash
                         /         
    --*--*--*--*--*--*--A <- master: the files on your disk have been restored
          \                          to their state in "master"
           \            
            \
             *--*--C origin/master: the latest commit on the remote repo
    
  4. git pull之后
  5.                       B <- stash
                         /         
    --*--*--*--*--*--*--A--D <- master: merged remote branch in local branch
          \               /
           \             /   
            \           /
             *--*--C---/
                   ^ origin/master
    
  6. git应用拉动时通常执行的操作:合并本地分支中的远程更改。

      git stash apply之后
    1.                       B <- stash
                           /         
      --*--*--*--*--*--*--A--D--B' <- modifications stored in B (not committed yet)
            \               /
             \             /   
              \           /
               *--*--C----
                     ^ origin/master
      
    2. git重新应用存储在新主要提交

      之上的存储中的修改

      警告是:

      • 第3步。(git pull)可能会触发一些冲突,您需要在实际到达图表中的状态D之前解决这些冲突
      • 步骤4.(git stash apply)也可能会触发一些冲突,如果您的本地更改(开头)实际上干扰了origin/master的某些修改。
        在图中达到B'之前,您需要先解决这些问题。

答案 1 :(得分:2)

如果您从服务器提取新代码,将覆盖您的本地代码。

如果您的更改很重要,则必须提交它们,然后从服务器提取。他们将能够比较这些变化并合并它们。

执行:git commit -m "Any message"然后git pull然后只有在需要的时候git才会要求您解决合并冲突。

我强烈建议您使用任何基于GUI的git管理器。它会简化你的工作。

如果您的更改太小而且不值得提交,则可以将本地更改放在临时位置,然后将其恢复。做到了。:

  1. 存储您的更改git stash。我会将您所有的本地更改放在Temp位置。

  2. 从服务器git pull拉出。您的所有更改都将被覆盖。

  3. 从藏匿git stash pop恢复您的本地更改。它将带来当地的变化。

答案 2 :(得分:1)

使用这些命令:

git stash  # stash you changes
git pull : # pull
git stash pop # re-get the stashed changes, not needed if you don't want to keep your changes

答案 3 :(得分:0)

你想要使用stash机制。

首先git stash [save [name of the stash]]会将您的工作保存在伪提交中,并附加到您当前的HEAD。这将为您提供一个干净的HEAD,您可以在其上检索您的原始提交(即git pull

要应用您所做的更改并隐藏起来,您可以使用git stash applygit stash pop。两者都会将存储合并到您当前的HEAD中,要求您在必要时解决冲突。第一个命令保留存储(你可以git stash drop之后),第二个命令自动应用和删除。

注意:如果您发现自己经常这样做,可以将rebase.autostash git配置设置为true。每次拉动冲突时,它都会执行下一个命令而不是拒绝拉动:

git stash save
git pull
git stash apply

答案 4 :(得分:0)

从逻辑上讲,这应该是对所有三个(在我写这篇文章时)推荐序列的答案的评论:

git stash
git pull
git stash pop   # or "git stash apply" -- "pop" means "apply, then drop"

所有这些都是很好的答案。但我需要有空间来格式化并写下很多东西。 : - )

  

我不想提交这些更改

不要害怕犯罪!您也可以提交,然后取消提交。事实上,使用git stash进行提交:它们只是提交不在任何分支上的提交。对于下面的第二件事,这可以有所帮助。但关键是要记住你的本地分支机构你的,就像你一样。

使用git fetch - 这是git pull首先做的事情,在做第二件事之前 - 对你的分支没有影响,只在所谓的远程跟踪分支。这些远程跟踪分支是Git在origin处记住它在其他Git上看到的内容的方式。也就是说,例如,您的origin/master会记住他们现在拥有的内容。当他们在Git中进行更改时,您的origin/master会逐渐落后,但在任何时候,您都可以运行git fetch并获得他们现在拥有的内容&#34;并且您的origin/master再次更新。 这对您自己的master无效。

在获取之后,你需要使用第二件事 - 第二个Git命令 - 来整合&#34;他们的&#34;在一个或多个分支机构工作。第二件事可以是git mergegit rebase。如果您运行git pull,则隐式选择这两个命令中的一个。我总是争辩说最好选择一个显式,以便你知道你在这里做了什么,但如果你愿意,你可以让git pull选择一个。它默认选择git merge。这意味着您可以获得git merge的所有并发症,并且git rebase没有任何并发​​症。

你可能根本不想要并发症。这有点难,因为Git是Git,你会遇到并发症。有时合并会失败。有时rebase会失败。这是我认为你应该明确选择一个的原因之一:当git pull失败时,你需要知道 git pull运行失败的第二件事!

我怀疑您是在避免提交,因为拥有自己的提交会使git mergegit rebase更有可能失败。这是真的!这也是git stash可以提供帮助的原因。但重新启动,git stash只是在你的分支上做出提交 - 这意味着如果你在这里避免失败,那么在git pull运行的前两步,你只是在移动当您使用git stash popgit stash apply取消隐藏时的失败点!

最重要的是,无论你做什么,你最终都会遇到一个问题:你会做出一些改变,与其他人做出的改变发生冲突。

您必须合并这些更改。这种组合是一个动作 - 一个动词,因为它是Git称之为合并。这个合并动作,这个合并的动作发生在git merge git rebase,它也发生在git stash apply(这是git stash pop)的前半部分。

通过git stash执行此操作没有任何问题,但您最终必须学会如何执行此操作。知道如何操作后,您也可以使用git mergegit rebase来执行此操作。要在Git中进行合并,您将需要使用提交,无论这些提交是git stash提交的提交还是自己运行git commit。所以不要害怕犯罪!你可以根据自己的喜好随意关闭它,并且在使用之前使用git stash可以使这更容易 - 但请记住git stash正在提交,git pull正在运行合并!