在我的主树枝上,我为另一个分支做了一个"git获取“。
我怎么才能撤销呢?
我的问题是严格地关于git fetch,以及需要什么操作才能撤消它,如果可能的话,验证本地回购分支与远程回购分支匹配。我正在寻找的答案将揭示一些确切的git抓取下载到回购。我的第一个假设是,它只是下载和更新回购的.git目录中的数据。我真正想知道的是,"git fetch“完全覆盖它为分支下载的数据(然后与远程分支完全匹配),还是使用远程更改/增量数据更新到本地回购中?
要获得更多的澄清:我将称另一个分支为"devbranch“。问题是:我没有先将git切换到dev支,然后再取dev支,而是将dev支转到主分支中。
如果我只是在主人上做"git fetch“,那么它是覆盖了我在主人上做的devbranch,还是只是增加了我的主分支上的混乱?或者我应该做些像(重设--硬头)之类的事情。
谢谢你的帮助。
===
在几个评论之后编辑:
-1--最重要的是,我想弄清楚"git获取“的作用。我最初的问题解释了是什么让我意识到我不是很理解它。如果你能解释什么"git获取“更新在回购,请做,谢谢。更重要的是,后续的fetch是否只是覆盖了前面的fetch?
--2--假设我们都同意"git“实际上从远程(不是本地文件,而是在.git目录中)向本地回购中添加或更新某些内容--并且--没有指定正确的分支或被切换到正确的分支(例如,在我最初的问题中)--它可以(?)如果应用"git合并“,则会导致某些内容损坏。那么,有人是如何撤销一个取回。
第二个"git取“在正确的分支上并指定正确的分支会起这个作用吗?例如* git签出* git获取源
下面的git手册页中的文本讨论了如何在命令中指定分支。还请注意,fetch命令有一个“-dry”,这意味着某些内容正在更新。在我看来,了解正在更新的内容以及如何撤消在错误分支上进行的提取非常重要。我错过了什么,谢谢你的帮助。
http://git-scm.com/docs/git-fetch
如果没有指定remote,默认情况下将使用源remote,除非为当前分支配置了上游分支。
发布于 2015-08-10 21:28:10
假设我们都同意"git“实际上是从远程(不是本地文件,而是在.git目录中)向本地回购添加或更新--并且--没有指定正确的分支或被切换到正确的分支(例如,在我最初的问题中)--它可以(?)如果应用"git合并“,则会导致某些内容损坏。那么,有人是如何撤销一个取回。
这就混淆了抓取和合并。即使您指定了错误的分支,运行git fetch
也没有危险。我建议您不要费心获取特定的分支,只需git fetch
所有内容。它更简单、更安全,除非您的存储库拥有大量庞大的分支,否则它是高效的。
但是,合并错误的分支是一个问题。它不会在存储库没有损坏的意义上“破坏”任何东西,但是您最终会得到错误的代码,而且可能会有很多冲突。幸运的是错误的合并可以撤消。。
抓取和合并作为两个单独的步骤,指定要获取和合并的分支是不必要的,并且会导致您所犯的错误。只使用git pull
(即fetch + merge)并让Git找出要获取和合并的内容比较简单。Git有一个跟踪分支的概念,这是运行git pull
时要与哪个远程分支合并的概念。例如,master
通常跟踪origin/master
。当您运行git pull
时,Git将获取并与当前分支的跟踪分支合并。这避免了错误地与错误的分支合并。
git fetch
做这些事情。
origin/blah
)以匹配。git fetch
不会更改任何本地分支。这就是为什么运行git fetch
通常是无害的,几乎不需要撤销它。
例如,假设你有这个..。
LOCAL
A - B - C - D - E [origin/master] - H - I [master]
\
F - G [my-branch]
ORIGIN
3 - 4 [origin/other-branch]
/
A - B - C - D - E - 1 - 2 [master]
在运行git fetch
之后,您将拥有这个。
LOCAL
3 - 4 [origin/other-branch]
/
1 - 2 [origin/master]
/
A - B - C - D - E - H - I [master]
\
F - G [my-branch]
ORIGIN
3 - 4 [other-branch]
/
A - B - C - D - E - 1 - 2 [master]
您的本地分支机构保持不变。Git只添加新的提交和移动(或添加)远程分支。您的本地分支机构都不受影响。master
和mybranch
待在原地。没有合并或快速转发或重基已完成。这一切都是作为git-pull
的一部分发生的。pull
实际上只是一个fetch
和一个merge
。
git-fetch
就像这样..。
master
在提交2. origin/master
移动到提交2。
other-branch
的新分支。origin/other-branch
。
这就是所谓的“愚蠢的协议”。大多数Git安装使用了一种更高效的技术,称为“智能协议”,它通过完成大部分工作,解决服务器端需要获取哪些提交并批量交付查询,从而减少了查询的数量。只有在使用没有特殊Git支持的服务器(如普通HTTP服务器)时,Git才会使用哑协议。这个愚蠢的协议对于理解到底发生了什么仍然很有用。
没有一个命令可以撤消git-fetch
,但是可以使用origin/master
手动移动引用将origin/master
移回以前的位置。
git update-ref refs/remotes/origin/master refs/remotes/origin/master@{1}
Git使用branch@{#}
语法维护分支位置的历史记录(分支只是提交时的标签)。origin/master@{1}
是origin/master
的前一个位置。
发布于 2015-08-10 22:13:15
Git fetch只影响本地保存的“远程”分支。
这一概念导致了许多混乱。
重要的是要了解有4个主要的“地方”存储您的代码:
.git/
中的分支(您的“索引”)。.git/
(本地存储库)作为远程区域中的分支。.git
目录,文件只是放在通常工作目录所在的顶级目录中。因此,当您进行获取时,您正在更新3)
另一方面,当你拉动时,这些分支是:
从远程检索到本地存储库(3),将其放置(或更新)在本地分支(2)中处理,以便在本地创建或更新文件系统中的实际文件。
你可能会发现https://stackoverflow.com/a/9204499/631619很有帮助
您所担心的更适合于git pull
,如果您位于不同的分支,您可能会意外地从错误的分支合并到代码中。我已经做过了。
https://stackoverflow.com/questions/31882731
复制相似问题