首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"git获取“到底是做什么的。后续的fetch是否覆盖上一个fetch?

"git获取“到底是做什么的。后续的fetch是否覆盖上一个fetch?
EN

Stack Overflow用户
提问于 2015-08-07 16:39:51
回答 2查看 1.4K关注 0票数 1

在我的主树枝上,我为另一个分支做了一个"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,除非为当前分支配置了上游分支。

EN

回答 2

Stack Overflow用户

发布于 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做这些事情。

  1. 获取远程存储库中的所有引用(分支名称加上提交点),或请求的特定分支。
  2. 下载填写每个引用完整历史记录所需的所有对象(提交和文件/blobs)。在此过程中,它还会得到任何标签。
  3. 更新远程跟踪分支(如origin/blah)以匹配。

git fetch不会更改任何本地分支。这就是为什么运行git fetch通常是无害的,几乎不需要撤销它。

例如,假设你有这个..。

代码语言:javascript
运行
复制
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之后,您将拥有这个。

代码语言:javascript
运行
复制
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只添加新的提交和移动(或添加)远程分支。您的本地分支机构都不受影响。mastermybranch待在原地。没有合并或快速转发或重基已完成。这一切都是作为git-pull的一部分发生的。pull实际上只是一个fetch和一个merge

git-fetch就像这样..。

  • 原产地的master在提交2.
    • 我没有提交2,下载它。
    • 提交2的父母是提交1。我没有这个,下载它。
    • 承诺1的父母是承诺E我有,我们完成了。
    • origin/master移动到提交2。

  • 在提交4中有一个名为other-branch的新分支。
  • 我没有提交4,下载它。
  • 提交4的父母是提交3。我没有,下载它。
  • 提交3的父母是1。我知道了,我们完成了。
  • 在提交4处创建origin/other-branch

这就是所谓的“愚蠢的协议”。大多数Git安装使用了一种更高效的技术,称为“智能协议”,它通过完成大部分工作,解决服务器端需要获取哪些提交并批量交付查询,从而减少了查询的数量。只有在使用没有特殊Git支持的服务器(如普通HTTP服务器)时,Git才会使用哑协议。这个愚蠢的协议对于理解到底发生了什么仍然很有用。

没有一个命令可以撤消git-fetch,但是可以使用origin/master手动移动引用将origin/master移回以前的位置。

代码语言:javascript
运行
复制
git update-ref refs/remotes/origin/master refs/remotes/origin/master@{1}

Git使用branch@{#}语法维护分支位置的历史记录(分支只是提交时的标签)。origin/master@{1}origin/master的前一个位置。

票数 3
EN

Stack Overflow用户

发布于 2015-08-10 22:13:15

Git fetch只影响本地保存的“远程”分支。

这一概念导致了许多混乱。

重要的是要了解有4个主要的“地方”存储您的代码:

  1. 本地作为常规文件(您的“工作区”)。
  2. 本地作为.git/中的分支(您的“索引”)。
  3. 在本地使用.git/ (本地存储库)作为远程区域中的分支。
  4. 远程在服务器上(可能是“裸”的)--没有.git目录,文件只是放在通常工作目录所在的顶级目录中。

因此,当您进行获取时,您正在更新3)

另一方面,当你拉动时,这些分支是:

从远程检索到本地存储库(3),将其放置(或更新)在本地分支(2)中处理,以便在本地创建或更新文件系统中的实际文件。

你可能会发现https://stackoverflow.com/a/9204499/631619很有帮助

您所担心的更适合于git pull,如果您位于不同的分支,您可能会意外地从错误的分支合并到代码中。我已经做过了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31882731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档