14

我对 git 很陌生,但我在进行简单fetch操作时遇到了麻烦。

我正在尝试从他的存储库中获取同事的进度。起初我这样做了git fetch HEAD,这促使 git 下载了大约 350MB 的数据,所以我确信它已经做了一些事情。但是,origin/master最终仍然指向相同的旧提交(实际上它在名称下,dev但我会称之为master- 他没有master)。

之后我尝试git fetch origin master了但它似乎没有做任何事情,它只是更新了FETCH_HEAD. 我标记了FETCH_HEAD提交,所以我不会丢失它,但我仍然希望有一个更新的远程分支。

出了什么问题?我无权访问远程存储库。我还能在家修吗?

4

4 回答 4

18

我对您使用的命令有点困惑。 HEAD通常是 git 用来跟踪当前在工作目录中的提交的标签。该git fetch命令需要远程远程提交配置来了解您想要获取的内容。使用git fetch HEAD将指示HEAD您的存储库中的远程。该命令没有错误地工作很奇怪。

例如: git fetch HEAD在我当前正在工作的存储库中导致以下错误

fatal: 'HEAD' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

该命令git remote将列出所有遥控器,同时git remote --verbose将包括遥控器的地址。您可以使用它来查看您是否定义了远程HEAD以及您的朋友存储库的远程地址是什么?

但是,我的问题放在一边,以帮助消除您的困惑。该git fetch ...命令只更新远程引用——而不是你的本地引用。

为了清楚起见,请查看存储库中的 .git 文件夹(默认情况下它是隐藏的,因此您可能需要取消隐藏它)。您会发现类似于以下的文件夹结构

working directory
|=>.git
|  |=>objects           <= contains data for each commit
|  |=>refs
|     |=>heads
|        |-master       <= file containing current commit of local master branch
|     |=>remotes
|        |=>origin
|           |-master    <= file containing current commit of remote origin's master branch
|-FETCH_HEAD            <= file updated by `git fetch`, contains info of what was fetched

假设您签出 master 分支,git checkout master--git 将更改您的工作目录以匹配 'objects' 文件夹中的提交数据,该数据与 '.git/refs/heads/master' 文件中的提交值匹配。

如果您这样git fetch origin master做,“.git/refs/remotes/origin/master”文件将更新为远程源上主分支的提交——并且该提交所需的所有提交数据都被下载并放置在“对象”中文件夹。

这里重要的一点是git fetch不会更新您的工作目录反映已签出的本地分支,并且git fetch永远不会更新本地分支。

需要使用git merge ...git rebase ...master使用origin/master. 根据选项和配置(是默认设置) ,git pull ...同时执行git fetch ...and either git merge ...or 。git rebase ...git merge ...

在所有这些解释之后,您希望能够查看从您的朋友存储库中获取的内容(如果有的话)。该git branch -avv命令将列出所有本地和远程分支,以及提交号,对于本地分支,它正在跟踪哪个远程分支。

要查看分支如何相互关联,我发现使用工具绘制存储库树图很有帮助。有几个可供选择,但我发现git log命令足够了;比如git log --all --graph --oneline --decorate。公平的警告,对于大型存储库来说,这可能会很长并且令人费解。--simplify-by-decoration通过添加参数可以获得更短的输出。

总结一下:是否可以在家修复它取决于存储库中的信息。上述命令;git remote --verbosegit branch -avv并且git log ...应该让您了解存储库的当前状态。从那里您可以确定是否需要做更多的事情来使用git mergeor获取本地分支中的数据git rebase

与往常一样,如果您遇到麻烦,请回复您所学到的内容。

于 2013-02-23T20:46:23.870 回答
15

从 git 1.8.4(2013 年 8 月)开始,git fetch将更新远程跟踪分支!不只是FETCH_HEAD

请参阅Jeff King ( )提交 f269048peff

当我们运行一个不带参数的常规“ git fetch”时,我们会根据配置的 refspec 更新跟踪 refs。
但是,当我们运行“ git fetch origin master”(或“ git pull origin master”)时,我们根本不会查看配置的 refspec,而只是更新FETCH_HEAD.

我们错过了更新“ refs/remotes/origin/master”(或用户配置的任何内容)的机会。一些用户觉得这很令人困惑,因为他们想与远程主机的旧状态进行进一步比较,例如:

$ git pull origin master
$ git log HEAD...origin/master

但这假设您已将存储库设置为获取分支:

git config remote.origin.fetch

如果为空:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
于 2014-01-07T08:51:07.217 回答
5

git fetch实际上并没有触及您的工作目录。它仅从远程获取最新更改。要实际更新您当前的状态,请使用git mergeor git rebase。此外,您可以使用git pullwhich 的作用类似于git fetch+的快捷方式git merge

合并和变基之间的主要区别在于,在某些情况下合并将创建一个新的提交,具有累积状态(非快进合并)。恕我直言,这很糟糕,这让我想起了我使用 SVN 的时代。Rebase 只是在指定提交的顶部重放您的更改,因此您的历史记录始终是线性的。请务必使用与您的同事相同的流程。

我建议你阅读一些关于 git 和git flow的东西:一本必读的书一篇好文章

于 2013-02-22T20:26:44.893 回答
1

你想做的是:

  • 为您的同事添加遥控器
  • 从他的存储库中获取更改
  • 创建一个引用他的远程分支的本地分支

大概,您已经完成了第 1 步。但为了完整起见,它是:

git remote add coworker git://path/to/coworkers/repo.git

其中 URL 可以是 git 支持的任何 URL 格式。

现在您已经添加了遥控器,您想要获取他的更改:

git fetch coworker

这为您的每个分支提供了远程分支。假设他的分支叫做“仓鼠”。现在,为了完成工作,您创建自己的远程分支的本地副本

git checkout -b hamster coworker/hamster

这会创建并切换到一个名为 hamster 的分支。

从那时起,您可以在仓鼠上工作并将其推给他

git push coworker hamster

第一次,然后就git push在那之后。

任何时候你想下拉并合并他的更改,你可以这样做:

git pull

于 2013-02-24T13:52:03.123 回答