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

8
当我试图从origin/master拉取一些更改时,我遇到了这个错误:
“error: Your local changes to the following files would be overwritten by merge”
因为我做了本地更改。我不想提交这些更改,所以我应该在我的分支上使用git stash,然后使用git pull origin master。
我的问题是:
1. 拉取操作是否会忽略更改并正确合并? 2. 在拉取和合并后,我是否仍然可以使用我的本地更改和已合并的更改而无需进行任何其他步骤?
谢谢!
PS:是的,我已经搜索过了,我只是想确保我理解得正确。
5个回答

10

以下是应用全部更改后您的存储库如何演变的过程:

  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之后:

                           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
    
  3. 在执行 git pull 命令之后:

  4.                        B <- stash
                          /         
     --*--*--*--*--*--*--A--D <- master: merged remote branch in local branch
           \               /
            \             /   
             \           /
              *--*--C---/
                    ^ origin/master
    

git应用了它通常执行的操作:将远程更改合并到您的本地分支中。

  1. git stash apply 之后:

                       B <- stash
                      /         
 --*--*--*--*--*--*--A--D--B' <- modifications stored in B (not committed yet)
       \               /
        \             /   
         \           /
          *--*--C----
                ^ origin/master

git会在新的主要提交之上重新应用存储在暂存区中的修改。


需要注意的是:

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

4
如果你从服务器拉取新的代码,它将覆盖你本地的代码。
如果你的更改很重要,你必须提交它们,然后从服务器拉取。然后你就能够比较这些更改并正确合并它们。
做如下操作:git commit -m "任何信息"然后git pull,只有在需要时,git才会要求你解决合并冲突。
我强烈建议你使用任何基于GUI的git管理器。它会极大地简化你的工作。
如果你的更改非常小,不值得提交,你可以把你的本地更改放在一个临时的地方,然后再拿回来。按以下步骤操作:
1. 存储你的更改git stash。它会把所有本地更改放在一个临时的地方。 2. 从服务器拉取git pull。所有你的更改都会被覆盖。 3. 从存储中拿回你的本地更改git stash pop。它会把本地更改带回来。

2
请使用以下命令:
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

1
请解释以下这些命令是什么意思。OP 可能不知道 stash pop 是什么。 - Arpit Solanki

2

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

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

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


我不想提交这些更改

不要害怕提交!您也可以提交,然后取消提交。实际上,使用 git stash 进行提交:它们只是没有在 任何 分支上的提交。这可以在下面的第二件事情上有所帮助。但关键在于记住,您的本地分支是您的,可以按照您的意愿处理。


使用 git fetch——这也是 git pull 在执行第二个操作之前会先执行的操作——对你的分支没有影响,只对所谓的远程跟踪分支有影响。这些远程跟踪分支是 Git 记住了在 origin 上看到的内容的方式。也就是说,例如你的 origin/master 记录了他们现在的内容。当他们在他们的 Git 中进行更改时,你的 origin/master 逐渐落后,但是你可以随时运行 git fetch 并获取“他们现在的内容”,你的 origin/master 再次更新。这对你自己的 master 没有影响。
在获取(fetch)之后,你需要使用第二个Git命令将"他们"的工作合并到一个或多个分支中。这个第二个命令可以是git mergegit rebase。如果你运行git pull,那么你已经隐式地选择了其中的一种命令。我总是认为最好要明确地选择一个命令,这样你就知道自己在做什么,但如果你愿意,也可以让git pull来选择。它默认会选择git merge。这意味着你将得到git merge的所有复杂性,而没有git rebase的任何复杂性。
你可能根本不想要任何复杂性。这有点困难,因为Git就是Git,你总是会遇到复杂性。有时合并会失败。有时变基会失败。这就是我认为你应该明确选择一个命令的原因之一:当git pull失败时,你需要知道git pull运行了哪个第二个命令导致失败!
我怀疑你回避提交是因为拥有自己的提交会使得 git merge 或者 git rebase 更容易失败。这是正确的!这也是为什么 git stash 会有所帮助。但是请记住,git stash 只是创建了不在你分支上的提交——这意味着如果你在前两步 git pull 运行时避免了失败,你只是把失败点移动到了当你使用 git stash pop 或者 git stash apply 恢复时!
无论你做什么,最终都会遇到一个问题:你所做的某些更改与其他人所做的更改冲突。你必须合并这些更改,Git 称之为“合并”。合并是一个动作——一个动词,它既适用于“git merge”,也适用于“git rebase”,还适用于“git stash apply”(这是“git stash pop”的前半部分)。

git stash 来做这件事没有问题,但最终你还是需要学会如何做。一旦你知道了如何做,你也可以使用 git merge 或者 git rebase 来做。在 Git 中进行合并时,你需要使用提交,无论这些提交是由 git stash 进行的,还是由你自己运行 git commit 进行的。所以不要害怕提交!当然你可以一直拖延不提交,使用 git stash 在拉取之前可能会让这更容易,但请记住 git stash 正在做提交,而 git pull 正在运行合并!


0

Stash机制是您想要使用的。

首先,git stash [save [stash名称]]将在伪提交中保存您的工作,并附加到当前HEAD。这将使您拥有一个干净的HEAD,您可以从中检索原始提交(即git pull

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


NB:如果你经常这样做,可以将rebase.autostash Git配置设置为true。每次拉取有冲突时,它将执行下一个命令而不是拒绝拉取:

git stash save
git pull
git stash apply

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接