Git学习笔记(三)远程库(GitHub)协同开发,fork和忽略特殊文件
远程库
远程库,通俗的讲就是不再本地的git仓库!他的工作方式和我们本地的一样,但是要使用他就需要先建立连接!
远程库有两种,一个是自己搭建的git服务器;另一种就是使用GitHub,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。友情提示:在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
远程仓库的好处:
1、我们可以随时随地的与仓库建立连接,以实时存放我们开发的内容;
2、与他人实现协同开发,而不是再需要来回的发送修改过的代码由他人整合在一起,git自动的帮我们完成了更新,这是最重要的也是无可比拟的!
3、只要你不把提交到本地仓库中的代码提交到远程库,那么别人一辈子也休想看到你的代码!
一、创建远程仓库(GitHub)
1、GitHub网站地址:https://github.com/,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
2、由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要如下设置:
第1步:创建SSH Key。在用户主目录下(例如:C:\Users\Administrator\),看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
ssh-keygen.exe //创建SSH key 【公钥和私钥,连接省却了用户名密码的输入】git窗口下,直接执行ssh-keygen.exe,默认往下执行,然后把公钥复制到github上
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,最后点击“Add Key”按钮完成。
说明:为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。
假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
二、添加远程库:
1、登录GitHub网站,并按网站要求创建一个新的仓库;
2、根据GitHub网站提示,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
3、本地仓库与GitHub上相应的仓库建立关联,代码如下:(git@github.com:zh605929205/LearnGit.git为我新建的仓库路径)
$ git remote add origin git@github.com:zh605929205/LearnGit.git
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
4、把本地库的内容推送到远程库上,用git push命令,实际是把当前分支master推送到远程。
$ git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令(不用带-u参数)。当然也可以不写!就需要你手动输入yes
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告,这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
5、通过GitHub上的仓库来克隆出新的本地仓库(可以在任意一个文件夹下,建议最好在一个固定的盘下方便于管理),要克隆一个仓库,首先必须知道仓库的地址,然后使用 git clone命令克隆从远程库克隆到本地(说白了就是下载版本库)。代码如下:
$ git clone git@github.com:zh605929205/LearnGit.git //应用场景:切换办公地点:家和公司,第一次都能从远程库上克隆然后进行开发!
注意点:执行clone命令,实质上内部已经完成了初始化git库和本地与远程库连接的过程(内部config文件,已写好命名,同时远程库名字默认为origin)!
也许还注意到,GitHub给出的地址不止一个,还可以用 https://github.com/zh605929205/LearnGit.git 这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
三、本地与远程库协同开发
1、查看远程库:
$ git remote $ git remote -v //加上-v参数可以查看详细信息 ----> 显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
2、当本地更新完毕,提交到本地的版本库,要推送分支到远程库分支。推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
语法:$ git push origin 分支名 $ git push origin master // $ git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
3、若是有多个分支,创建远程origin的dev分支到本地,需要创建本地分支并关联远程分支:
语法:$ git checkout -b 分支名 origin/分支名 //origin/dev为远程分支路径 $ git checkout -b dev origin/dev
$ git branch --set-upstream 分支名 origin/分支名 //若本地已有分支,可通过该命令来关联远程分支
4、从远程库中拉下分支新版本,用以更新本地库:
$ git pull origin 分支名
5、远程库推送解决冲突:
多人协同开发,向远程推送提交时产生冲突【实质就是提交快慢的问题】,则需先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送,如下:
$ git pull //从远程获取分支 $ git commit -m "marge files" //本地更新合并 $ git push origin dev //推送提交到远程分支
注意:如果你在公司开发某段代码而忘记推送到远程库,别人又开发了别的功能并推送到远程库(此时远程库的版本已经与你本地库版本不一致),遇到这种情况,一定要记住先把远程库中对应的分支拉下来,然后再本地提交到版本库后,再重新推送到远程库!而且每次遇到解决冲突或是版本不一致的情况,一定要先看看是谁上一次做的操作,推送前一定要与其沟通!以免推送出错!
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用 git push origin branch-name 推送就能成功!
如果git pull 提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name 关联远程分支。
6、远程库的操作都是先克隆或是把程序拉到本地,然后在本地对代码进行修改,然后更新到本地版本库,再推送到远程库!这里边儿肯定是会涉及到分支的问题,在上一文中已经详细的说明了分支的操作!具体按照流程来即可!
Git本地库与远程库连接的补充说明
关于本地仓库与远程库建立第一次建立连接的问题! 1、本地库提交到远程库!(本地库有数据而远程库没有数据) 第一步,先在远程库创建一个仓库(默认是master分支),用于上传你本地仓库内的所有文件! 第二步,在你本地仓库执行以下命令,以和远程库建立连接(先获取你远程库的ssh or https的远程库路径) git remote add origin 【远程库的ssh or https协议路径】//此处远程库名可以自定义任意取名! 第三步,把本地库的代码提交到远程库! 此处场景:你在本地有两个分支,业务线master分支和开发dev分支 1)先提交master分支 git branch //查看是否在master不是切换到master分支 git checkout master git push origin master //推送 2)再提交dev分支 git checkout dev git branch //查看当前分支 git push origin dev //推送 第四步,推送成功之后,在远程库查看两条分支是否都在,都在的话证明提交成功! 2、远程库所有分支下载到本地(远程库有数据而本地库没有) 第一步,登录你的远程库,找到要下载的库名,点击进去找到 Clone or download 绿色的按钮,点击获取当前远程库的ssh or https协议的地址,获取这个地址; 第二步,在你的本地及你的电脑上找一地儿,创建一个自认为名字很帅的文件夹,点进去右击点 git bash here 等待一个git的窗口模式出现; 第三步:克隆你的远程库到本地,在窗口执行以下命令: git clone【ssh or https 的地址】 //注:克隆下来的第一个分支,铁定是master分支! 等待完成,本地工作区会出现和远程库相同的master的所有文件 git branch //查看本地分支,会发现只有 master分支 git branch -a //可以查看远程库有几个分支,及当前指针所在分支! 第三步,下载其他分支例如开发分支,执行以下命令: git checkout -b dev origin/dev //创建并切换到dev分支同时与远程分支关联,获取远程分支内的所有数据 第四步,等待完成,查看dev分支内工作区与远程库dev分支内容是否一致! 当本地库与远程库建立连接,分支都已同步之后,剩下的推送版本或是下载版本就都是很简单了! 1、在本地修改文件,提交到本地版本库,再从本地版本库上传到远程库就是用命令 git push origin dev //(注意你推送的分支) 2、从远程库分支获取文件更新你的本地版本 git pull origin dev //(注意你拉取的分支)
协同开发
1个远程库,多个人员使用,同时对某个业务线进行开发!
既然要实现协同开发,那么一个人铁定是不行的。就需要创建组织,然后再对这个组件进行管理添加成员,点进去这个库,在people栏下点击邀请开发人员!发送邀请的同时可以对这个开发人员进行权限分配,以限制其都能有什么权限!
注意:非组织成员是不允许对这个仓库进行操作的!
协同开发的时候,共同使用一个项目,当需要对这个远程库提交的时候,一定是先进行拉取操作,然后再提交!否则就会因为版本库内代码不一致的问题导致报错或是紊乱!
两人未沟通的情况下同时提交代码到远程库,肯定是得取决于谁提交的快谁会提交到远程库!提交慢的人会被拒绝,就是因为慢的原因!所以如果遇到这种被拒绝的情况,不用惊慌,你先把远程库的代码拉取下来,然后你再提交一次就OK了!【注意:解决冲突的时候,一定要先与上一个提交的人先沟通!】
奉上一张相关错误截图,借用的老师的图片,当遇到这个问题时,一定是版本冲突的问题!把远程库的代码拉下来,重新提交就OK!
四、参与开源项目 fork
1、首先你自己必需要有GitHub账号并已登录成功。
2、找到指定的开源项目GitHub地址,例如:
3、点击图上的Fork按钮,会在自己账号下克隆一个相同的仓库,例如:
4、使用git clone命令克隆到本地仓库,如:
$ git clone git@github.com:wheeky/learngit.git
5、在本地进行相应的操作,比如新增了一个文件(CTextBox.cs):
$ git add CTextBox.cs $ git commit -m 'add CTextBox.cs'
6、使用git push命令推送更新到远程仓库:
$ git push origin master
此时远程仓库就可以看到相应的更新(红色框内显示最后提交的信息),如图:
7、创建pull request请求,向开源项目的作者发送更新请求,如下列图示:
点击“New pull request”按钮,并在随后的页面里填写相应的标题、备注说明等信息提交即可,剩下的就是等原作者的处理。若提交成功可在作者的开源项目的Pull requests中可以看到自己请求记录,如下:
五、忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去(按照规则填写),Git就会自动忽略这些类型的文件。不需要从头写.gitignore文件,GitHub已经为我们准备了所有语言的各种配置文件,只需要找到python的文件,组合一下就可以使用了。所有配置文件可以直接在线浏览https://github.com/github/gitignore
注意:.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!