当我试图从origin / master中取出一些更改时,我收到此错误:
error: Your local changes to the following files would be overwritten by merge
因为我做了本地更改。我不想提交这些更改,所以我想我应该在我的分支上使用git stash
,然后git pull origin master
我的问题是:
谢谢!
PS:是的,我用谷歌搜索,我只是想确保我理解正确。答案 0 :(得分:6)
以下是所有应用后你的回购演变的方式:
在您拉动之前,请进行本地修改:
--*--*--*--*--*--*--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
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
git pull
之后:
B <- stash
/
--*--*--*--*--*--*--A--D <- master: merged remote branch in local branch
\ /
\ /
\ /
*--*--C---/
^ origin/master
git
应用拉动时通常执行的操作:合并本地分支中的远程更改。
git stash apply
之后:
B <- stash
/
--*--*--*--*--*--*--A--D--B' <- modifications stored in B (not committed yet)
\ /
\ /
\ /
*--*--C----
^ origin/master
git
重新应用存储在新主要提交
警告是:
git pull
)可能会触发一些冲突,您需要在实际到达图表中的状态D
之前解决这些冲突git stash apply
)也可能会触发一些冲突,如果您的本地更改(开头)实际上干扰了origin/master
的某些修改。B'
之前,您需要先解决这些问题。答案 1 :(得分:2)
如果您从服务器提取新代码,将覆盖您的本地代码。
如果您的更改很重要,则必须提交它们,然后从服务器提取。他们将能够比较这些变化并合并它们。
执行:git commit -m "Any message"
然后git pull
然后只有在需要的时候git才会要求您解决合并冲突。
我强烈建议您使用任何基于GUI的git管理器。它会简化你的工作。
如果您的更改太小而且不值得提交,则可以将本地更改放在临时位置,然后将其恢复。做到了。:
存储您的更改git stash
。我会将您所有的本地更改放在Temp位置。
从服务器git pull
拉出。您的所有更改都将被覆盖。
从藏匿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 apply
或git 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 merge
或git rebase
。如果您运行git pull
,则隐式选择这两个命令中的一个。我总是争辩说最好选择一个显式,以便你知道你在这里做了什么,但如果你愿意,你可以让git pull
选择一个。它默认选择git merge
。这意味着您可以获得git merge
的所有并发症,并且git rebase
没有任何并发症。
你可能根本不想要并发症。这有点难,因为Git是Git,你会遇到并发症。有时合并会失败。有时rebase会失败。这是我认为你应该明确选择一个的原因之一:当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
正在运行合并!