我对git很新,我在操作上遇到了麻烦fetch.
我正试图从他的存储库中获取同事的进度.起初我做了git fetch HEAD,它促使git下载了大约350MB的数据,所以我确信它已经做了一些事情.然而,origin/master最终仍然指向相同的旧提交(实际上它在名称下,dev但我会称之为master- 他没有master).
在那之后我尝试了,git fetch origin master但它似乎没有做任何事情,它只是更新FETCH_HEAD.我标记了FETCH_HEAD提交,所以我不会丢失它,但我仍然希望有一个更新的远程分支.
出了什么问题?我无权访问远程存储库.我还可以在家里修理吗?
Dav*_*ulp 16
我对您使用的命令感到有点困惑. 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.
Run Code Online (Sandbox Code Playgroud)
该命令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
Run Code Online (Sandbox Code Playgroud)
假设您签出了主分支,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 ...与任一git merge ...或git rebase ...,根据选项和配置(git merge ...为默认值).
完成所有这些解释之后,您希望能够看到从朋友存储库中获取的内容(如果有的话).该git branch -avv命令将列出所有本地和远程分支,带有提交编号,如果是本地分支,则列出它正在跟踪的远程分支.
为了了解分支如何相互关联,我发现使用工具来绘制存储库树是有帮助的.有几个可供选择,但我发现git log命令充足; 如git log --all --graph --oneline --decorate.公平的警告,对于大型存储库来说,这可能会很长并且很复杂.通过添加--simplify-by-decoration参数可以获得更短的输出.
总结一下:如果您可以在家中修复它,取决于您的存储库中的信息.上面提到的命令; git remote --verbose,git branch -avv而git log ...应该是给你的资料库的当前状态的理解.从那里,您可以确定是否需要执行更多操作以使用git merge或在本地分支中获取数据git rebase.
和往常一样,如果遇到麻烦,请回复您所学的内容.
自git 1.8.4(2013年8月)起,git fetch将更新远程跟踪分支!不只是FETCH_HEAD.
当我们运行
git fetch没有参数的常规" "时,我们会根据配置的refspec更新跟踪引用.
但是,当我们运行"git fetch origin master"(或"git pull origin master")时,我们根本不查看配置的refspecs,只是更新FETCH_HEAD.我们错过了更新"
refs/remotes/origin/master"(或用户配置的任何内容)的机会.一些用户发现这令人困惑,因为他们希望进一步与远程主控的旧状态进行比较,例如:
$ git pull origin master
$ git log HEAD...origin/master
Run Code Online (Sandbox Code Playgroud)
但是假设您已将repo设置为获取分支:
git config remote.origin.fetch
Run Code Online (Sandbox Code Playgroud)
如果为空:
git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Run Code Online (Sandbox Code Playgroud)
git fetch实际上并没有触及你的工作目录。它只从远程获取最新的更改。要实际更新您当前的状态,请使用git merge或git rebase。另外,您可以使用git pull类似于git fetch+的快捷方式git merge。
merge 和 rebase 之间的主要区别在于,在某些情况下,合并将创建一个新的提交,并具有累积状态(非快进合并)。恕我直言,这很糟糕,让我想起了我使用 SVN 的时候。Rebase 只是在指定提交的顶部重播您的更改,因此您的历史记录始终是线性的。请务必使用与同事相同的流程。
我建议你阅读一些有关 git 总体情况和git flow 的内容:一本必读的书和一篇好文章。
| 归档时间: |
|
| 查看次数: |
27973 次 |
| 最近记录: |