fork
fork,英语翻译过来就是叉子,动词形式则是分叉,如下图,从左到右,一条直线变成多条直线
转到git仓库中,fork则可以代表分叉、克隆 出一个(仓库的)新拷贝
包含了原来的仓库(即upstream repository,上游仓库)所有内容,如分支、Tag、提交
如果想将你的修改合并到原项目中时,可以通过的 Pull Request 把你的提交贡献回 原仓库。
那么GitHub中怎么样fork别人的代码到自己仓库并进行贡献
场景:
比如说现在有一个很牛逼的项目,我们进入项目地址,想将这个项目复制到自己的github仓库,然后你还想将仓库中的代码拉取到本地进行修改,修改完你还要将本地的修改后的代码推送到自己的github仓库,更甚至你还想将自己复制过来并修改后的代码再还给原作者,请求人家让你合并。
进入厉害的项目的地址,即他人的仓库中的项目,然后右边有个fork按钮。点击这个按钮,稍等片刻后,就会在自己的账号下克隆了一个一模一样的项目,包括文件、提交历史、issues等。
fork完别人的代码后,自己的账号下也有了这个项目,然后将其clone到自己的电脑,通过git clone 命令
接下来就可以对这个项目进行修改了,但是不建议在master分支上直接修改,最好是在master分支基础上切出一个dev分支,然后在dev分支上修改,修改完成后,再将dev分支merge到master分支。
首先切出dev分支
这个时候我们可以进行一些修改进行测试,比如添加一个b.b的文件
将b.b进行add并提交修改,然后再切换回来master分支,最后将dev分支与master分支合并
在自己的电脑上修改好代码后,再使用git push命令将改动同步到自己的Github仓库中
通过这个操作就可以在代码中看到自己的提交了。
到此,你就完成了克隆别人的代码,并且对代码进行了修改操作,你还可以向原作者提交你的代码。
点击自己的仓库中的pull request下的New pull request,之后github会自动对比原仓库分支与自己仓库分支代码,看看是否有冲突。如果它显示Able to merge的话,就可以点击Create pull request按钮,进行提交。
点击后会跳到一个可以和原作者说明改动了什么,以及改的原因的页面。然后点击绿色的create pull request即可。这个时候原作者就会收到pull request了。
clone
clone,译为克隆,它的作用是将文件从远程代码仓下载到本地,从而形成一个本地代码仓
执行clone命令后,会在当前目录下创建一个名为xxx的目录,并在这个目录下初始化一个 .git 文件夹,然后从中读取最新版本的文件的拷贝
默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来
区别
两种方式最重要的区别是,如果我们修改了clone到本地的代码,想push一下,显然第一种方式不可行,因为项目的远程信息是别人的(通过git remote -v 可以查看),而第二种方式,由于创建者相当于是我们自己,是能够push的(当然先要add 和commit)。但是我们push之后,原项目的主人是看不到我们修改的代码的,如果想让原作者接受并merge你的修改,这时可以发起pull request,这样原作者就能收到pull request请求,并可以审阅你的代码是否合理,如果他比较满意,就可以merge你的修改,这样原项目就得到了完善,而你也就成为了光荣的“贡献者”之一。
一般情况我们是不需要fork的。很多人错误的在使用fork,把它当成一种“收藏”功能,这其实并没有什么必要。一来,可以直接用“watching”来关注该项目,当有新的issue,commit,pull request时,你会收到相应的邮件提醒(前提是设置了邮箱)。二来fork的项目只是保留了fork当时的状态,如果项目作者在你fork之后更新了项目,你是看不到的。这就带来一个问题:如何实现fork后的项目与原项目的同步?
参考GitHub上的链接:
添加链接描述
branch
branch,译为分支,其作用简单而言就是开启另一个分支, 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线
Git 处理分支的方式十分轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷
在我们开发中,默认只有一条master分支,如下图所示:
通过git branch 可以创建一个分支,但并不会自动切换到新分支中去
通过git checkout可以切换到另一个testing分支