fetch和clone 别人GitHub或gitee git clone上的项目有什么区别?

博客分类:
http://help.github.com/fork-a-repo/
概要: 克隆别人的代码库到自己的项目中,可以作为子模块的形式使用,或二次开发
操作流程:
在开源项目中点击fork按钮,稍等一会儿,该项目便会拷贝一份到你的respositories中,
克隆一份代码到本地:git clone :username/Spoon-Knife.git
配置:(项目克隆完成后,默认远程的别名为origin,此为我们自己项目中的版本,并非原始作者的代码库)
创建原始代码库的别名,方便跟踪代码 git remote add upstream git://github.com/octocat/Spoon-Knife.git
git fetch upstream 跟踪原始代码
提交代码更新到自己的代码库 git push origin master
获取原始代码库的更新
git fetch upstream
git merge upstream/master
如果你希望将自己的代码贡献到原始代码库中,可参见http://help.github.com/send-pull-requests/ 来完成
浏览 31140
yl.fighter
浏览: 186134 次
来自: 北京
我的firefox下和chrome下试了都不行。。。
貌似那个js版本的不对啊
您好,我在第四步测试的时候输入ssh -T git@githu ...
谢谢了,这个问题困扰了我半天,原来添加一个doLayout就没 ...
问题已经解决了,谢谢。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'git clone和fork的区别_百度知道
git clone和fork的区别
我有更好的答案
1.区别git clone 是在自己电脑(这里我是ubuntu)直接敲命令,结果是将github仓库中的项目克隆到自己本地电脑中了fork是直接访问github网站,在项目页面中点击fork,然后自己github项目中就会多出一个复制的项目2.用法如果我们想要修改他人github项目的话,我们直接git clone代码到本地是不能pull的,所以我们使用fork,先把代码复制到自己的github仓库,然后git clone到本地修改,然后在提交pull(这里的pull是pull到自己github仓库了,我们自己的github仓库中的代码是fork源的一个分支),这时候我们想要把修改的代码提交给他人的话,就可以在自己github上pull,等其他人看到后就可以把代码做一个合并
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。git pull 和 git fetch 有什么区别? · Ruby China
话说,git pull 和 git fetch 有什么区别?好迷糊……
之前看了两遍codeschool的GIT REAL 和 GIT REAL2,有点晕。
又看了本《Git Pro》,感觉清晰了点。
一到用,又忘光光了……
pull = fetch + merge
git pull = git fetch + merge to local
额,那我现在在develop branch上,我git pull了,而origin 上的更新也是在develop上,到底出现了啥子结果?
是不是如果不是master上,就应该用fetch?
首先,你的每一个操作都是要指明【来源】和【目标】的,而对于 pull 来说,【目标】就是当前分支
其次,你得清楚 git 是有 tracking 的概念的,所谓 tracking 就是把【来源】和【目标】绑定在一起,节省一些操作是需要输入的参数。
那么,假设你的 master 和 develop 都是 tracking 了的,于是:
# 当你在 master 下
$ git pull
# 等于 fetch origin,然后 merge origin/master
# 当你在 develop 下
$ git pull
# 等于 fetch origin,然后 merge origin/develop
如果 tracking 了多个 remote,要指明 remote 的名字,比如: $ git pull origin
分支的名字不用打,因为你 tracking 了
Sorry,写这里的时候没有动脑子,错了。tracking 只能是一对一的,没有一个 local branch tracking 多个 remote branch 这么一说,但是多个 remote 是有的。
因此,若你有多个 remote ,git pull [remote name] 所做的事情是:
fetch [remote name] 的所有分支
寻找本地分支有没有 tracking 这些分支的,若有则 merge 这些分支,若没有则 merge 当前分支
另外,若只有一个 remote,假设叫 origin,那么 git pull 等价于 git pull origin;平时养成好习惯,没谱的时候都把 【来源】带上。
但是,如果我要合并 origin/master 去 develop 呢? # 当你在 master 下
$ git checkout develop # 切换到 develop,这就是 【目标】
$ git pull origin master
# 合并 origin/master,这就是 【来源】
OK,那我怎么知道 tracking 了没有?
如果你曾经这么推过:git push -u origin master,那么你执行这条命令时所在的分支就已经 tracking to origin/master 了,-u 的用处就在这里
如果你记不清了:cat .git/config,给你一张截图,注意红色方框标示的地方(上半部分是 tracking 的,下半部分是 untracking 的),由此可见,tracking 的本质就是指明 pull 的 merge 动作来源。别忘了:pull = fetch + merge。
顺便一提:git fetch 到底干了些啥?
注意到红色方框上面的一句了么?
fetch = +refs/heads/*:refs/remotes/origin/*
它指明了 fetch 动作的来源,在本例中就是 叫做 origin 的那个 remote server 下的所有分支
也就是说, git fetch 的操作就是取下上述目标的更新。但是——取下的东西到底在哪儿?
再补一个截图:
就在这里:.git/FETCH_HEAD。上图特意也做了一个对比,第一次 cat 的时候没有 fetch,第二次 cat 的时候 fetch 了,于是你可以看到其中的区别,之后就可以明白 git pull 的 merge 是如何被触发的了。
git pull = git fetch + merge
git fetch 拿到了远程所有分支的更新,我用 cat .git/FETCH_HEAD 可以看到其状态,若都是 not-for-merge 则不会有接下来的 merge 动作
merge 动作的默认目标是当前分支,若要切换目标,可以直接切换分支
merge 动作的来源则取决于你是否有 tracking,若有则读取配置自动完成,若无则请指明【来源】
关于不带参数执行 git pull git push的行为,可以参考之前写的
先谢谢……辛苦了,这么长的答案……
不过……呐……看了没天,其实……不太懂……
是不是用git pull,就会直接把origin/X分支的东东 merge 到我的本地X分支?都自动对应的。
origin/X的改动绝对不会放到我的本地Y分支下?
不过我朋友刚对我说“在冲突不多的情况下直接 pull 更省事,很多人合作的话省下来的事有点得不偿失,不过我们现在没这个问题。而且你也没有 merge 其他 branch 的需求,直接 pull 吧。
除非你有明确的目标,否则不用手动去 merge,否则出问题的可能更大”
有才有德,程序员的典范
谢谢,呐,字好密集,读不进了……下次下次……
在一起,在一起!哈哈哈哈哈哈
别人对你那么好,我就不参和了,不过话说回来,
无论对谁都是超有耐心,细心打一堆字。
再我喜欢 Tab 不喜欢空格,说不定就这一点就不能做朋友了~~~
我是说,你们好基友,在一起啊在一起……
好基友不会在乎空格滴……
区别就是,只用git fetch就可以了
。。。为嘛跟我的结论刚好相反?以上各位及我小伙伴给我的启示是:git pull对我来说最省事也最不容易出错的……
我只记住了pull = fetch + merge……其实建个repo自己测试一下就可以了 XD
刚学git的时候每次我都fetch + merge,后来就用git pull了(因为太懒)
如果搞不清楚的话,老老实实git pull [remote] [branch] 是最稳当的。出了问题git也会给log,很舒服。
你是只有一个分支吧
我用git flow ,有一个master, 一个develop和很多feature.
两至三个人……
大爱 git fetch
既然文字太多不喜欢看,就一步一步来吧
# git init --bare parent.git
# 创建一个bare repo用做clone用,相当于server端repo
Initialized empty Git repository in /home/gewang/test/test/parent.git/
# git clone parent.git child1 # clone出第一个工作repo
Cloning into 'child1'...
warning: You appear to have cloned an empty repository.
# cd child1/
# echo a & a && git add . && git commit -m "init drop" # 第一次commit
[master (root-commit) 985c04f] init drop
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 a
# git push origin master:master # 在server端repo中创建master分支
Counting objects: 3, done.
Writing objects: 100% (3/3), 206 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/gewang/test/test/parent.git
* [new branch]
master -& master
# git clone parent.git child2 # 创建第二个工作repo
Cloning into 'child2'...
# cd child2/
# git checkout -b test # 创建test分支
Switched to a new branch 'test'
# echo abc && abc && git add . && git commit -m "create test branch"
[test c3d70fd] create test branch
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 abc
# git push origin test:test # 将test分支推送至服务器,注意没有加-u参数
Counting objects: 4, done.
Delta compression using up to 24 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 268 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/gewang/test/test/parent.git
* [new branch]
test -& test
# git config -l # 查看配置,由于没有使用-u参数,所以没有test分支对应的remote, merge配置项
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=/home/gewang/test/test/parent.git
branch.master.remote=origin
branch.master.merge=refs/heads/master
# cd ../child1 # 回到第一个工作repo
# git branch
# git pull origin test # 在master分支上执行 git pull origin test, 可以看到server端test分支的内容被merge进了本地master分支
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/gewang/test/test/parent
-& FETCH_HEAD
Updating 985c04f..c3d70fd
Fast-forward
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 abc
# git fetch # 执行git fetch为server端test分支建立本地镜像分支
From /home/gewang/test/test/parent
* [new branch]
-& origin/test
# git branch -a
remotes/origin/master
remotes/origin/test
# git checkout test # 虽然本地没有手工创建test分支,但是可以直接checkout,同时git自动为你配置了它与server端test分支的关联。够贴心。
Branch test set up to track remote branch test from origin.
Switched to a new branch 'test'
# git config -l
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=/home/gewang/test/test/parent.git
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.test.remote=origin
branch.test.merge=refs/heads/test
# echo ddd && ddd && git add . & git commit -m "update branch test" # 在test分支上checkin代码并推送至服务器
[test 3a078d4] update branch test
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 ddd
echo ddd && ddd && git add .
# git push # 不带参数执行git push可以看到本地更新的2个分支都推送了新的change到服务器端。详细解释参考 http://loveky2012.blogspot.com/2012/08/default-behaviour-of-git-pull-and-git-push.html
Counting objects: 4, done.
Delta compression using up to 24 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 295 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /home/gewang/test/test/parent.git
985c04f..c3d70fd
master -& master
c3d70fd..3a078d4
test -& test
# cd ../child2 # 切换到第二个工作repo,执行git pull在将server端change拿到本地后会报错,因为配置里没有关于test分支的mrege信息。(这是由于之前push test分支时没有加-u参数导致的)
# git pull
From /home/gewang/test/test/parent
985c04f..c3d70fd
-& origin/master
c3d70fd..3a078d4
-& origin/test
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull &repository& &refspec&').
See git-pull(1) for details.
If you often merge with the same branch, you may want to
use something like the following in your configuration file:
[branch "test"]
remote = &nickname&
merge = &remote-ref&
[remote "&nickname&"]
url = &url&
fetch = &refspec&
See git-config(1) for details.
# git branch --set-upstream test origin/test # 手工配置关联
Branch test set up to track remote branch test from origin.
# git pull # 再次pull即可
Updating c3d70fd..3a078d4
Fast-forward
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 ddd
除非你有明确的目标,否则不用手动去 merge,否则出问题的可能更大
git pull对我来说最省事也最不容易出错的
关于是不是省事这点不评论,但就容不容易出错来说pull和merge没有谁比谁好这说法
话说,我刚开了个feature,“ git flow feature start gem_related”
又“git add .”了下,还没有commits 过,现在觉得这个feature名字起得太恶心了,想改名,有这个功能吗?用什么命令行啊?
try git branch -m oldname newname
搞定!Thanks!
再问个哦,我的assets/images文件夹下面,除了icons文件夹,其它的都gitignore,难道不应该是在.gitignore文件夹里写:
/app/assets/images
! /app/assets/images/icons
吗?为什么我git add .结果没有显示icons文件夹?
app/assets/images/*
! app/assets/images/icons
我现在是images下面有icons文件夹,而且里面有图片的。但我用了上面两句(其中第二个!后面没用空格),git status显示:
Untracked files:
app/assets/images/
没说是icons,这个不对吧?
git add 看看
奇怪,是我的IDE延时吗?之前问你的时候,我也已经git add . 过的啊,但没有。
这次用git add . ,貌似又好了。
Changes to be committed:
(use "git reset HEAD &file&..." to unstage)
.gitignore
app/assets/images/icons/avatar.jpeg
app/assets/images/icons/logo_text.png
app/assets/images/icons/shortcut.ico
看看这个吧,很直观
或者这个……
学这么多还不如用 grb ....
跟帖子沾个光,最近在ubuntu上配置git能连通,但是无法从github上clone和pull等很多操作,不知道为什么。
Permission denied (publickey).
fatal: Could not read from remote repository.
求大神们帮忙
我小菜鸟,但感觉你是没加Ssh或者进行用户验证之类...
这个是肯定加了,测试是连通了。目前情况是,我自己的两台电脑都用这一个github帐号,老电脑做任何操作都没有问题,新电脑配置后,就测试是连通的,现在什么操作都不行。
这个工具试图解决的问题是什么呢?
repo的简介是A tool to simplify working with remote branches, 但是rm操作还会删除本地的分支,会否有歧义?
同时还发现个小问题,如果在master上进行rm master操作,最后的branch -d会有问题吧
贴 ssh -Tvv
38楼 已删除
39楼 已删除
40楼 已删除
Hi treeran! You've successfully authenticated, but GitHub does not provide shell access.
没问题啊,试试clone。。
感谢,以解决,今天重新打开电脑就可以了
解决的问题不是这里写了么:
* rename `branch1` to `branch2`
[branch1] [branch2] [--explain]
* rename current branch to `branch`
$ grb mv branch [--explain]
* add a remote repo
$ grb remote_add `name` `repo path` [--explain]
* remove a remote repo
$ grb remote_rm `name` [--explain]
* delete branch `branch`,default current_branch
$ grb rm [branch] [--explain]
* pull branch `branch`,default current_branch
$ grb pull [branch] [--explain]
* push branch `branch`, default current_branch
$ grb push [branch] [--explain]
* create new branch `branch`
$ grb new [branch] [--explain]
* prune dead remote branches
$ grb prune
// repo的简介是A tool to simplify working with remote branches, 但是rm操作还会删除本地的分支,会否有歧义?
第一次用最好用 --explain 看看会做什么,熟悉以后就很方便了
// 同时还发现个小问题,如果在master上进行rm master操作,最后的branch -d会有问题吧
明知删除当前所在分支有问题,就用grb remote_rm master 么,或者换个本地分支 ;)
第一次用最好用 --explain 看看会做什么,熟悉以后就很方便了
README可以写的更详细些,否则不知道如何操作远程分支的用户看了--explain估计也不知道是什么意思
明知删除当前所在分支有问题,就用grb remote_rm master 么,或者换个本地分支 ;)
可以在代码里加个判断的 :)
能加个Q么?有些前端的小问题想请教一下你呢……
分享一下在网上看到的这张图,非常清晰明了的解答这个问题:
后方可回复, 如果你还没有账号请点击这里 。
共收到 43 条回复

我要回帖

更多关于 git fetch pull clone 的文章

 

随机推荐