08_Git远程仓库

 教程目录

01_版本控制概述

02_Git概述

03_Git下载和安装

04_Git底层原理解析

05_Git命令详解 - CRUD

06_Git命令详解 - 分支

07_Git命令详解 - 后悔药

08_Git远程仓库

一、远程仓库概念

什么是远程仓库

        为了能在任意 Git项目上团队协作,你需要知道如何管理自己的远程仓库。

        远程仓库是指托管在因特网或其他网络中的你的项目的版本库。你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。

        多人协同作战的时候,通常找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

github网站和git的关系

        github网站底层使用git技术,为每个组织和个人提供Git仓库托管服务,省去搭建git服务器的步骤,方便全世界的开发者去共同维护一项开源项目或者私人项目。

        由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要一点设置进行鉴权来保证传输的安全性。

第1步:创建SSH Key。在用户主目录下(不是工程目录),看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "[email protected]"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:添加SSH KEY。登陆GitHub,打开“Account settings->SSH and GPG Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。

为什么需要SSH KEY?

        因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都关联添加到GitHub,就可以在每台电脑上往GitHub推送了。

SSH

ssh-keygen –t rsa –C 你的邮箱:生成公私钥 

.ssh 文件位置:C:\Users\Administrator\.ssh 

ssh -T [email protected] :测试公私钥是否已经配对

二、忽略某些文件

        一般我们总会有些文件无需纳入 Git的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个名为 .gitignore的文件(在git新版本中,直接使用info文件夹/exclude),列出要忽略的文件模式。

*.[oa]

*~

        第一行告诉 Git忽略所有以 .o或 .a结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。第二行告诉 Git忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。此外,你可能还需要忽略 log,tmp或者 pid目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore文件的习惯,以免将来误提交这类无用的文件。

.gitignore的格式规范

        所有空行或者以注释符号#开头的行都会被 Git忽略。

        可以使用标准的 glob模式匹配。

*代表匹配任意个字符

?代表匹配任意一个字符

**代表匹配多级目录

匹配模式前跟反斜杠(/ )这个斜杠代表项目根目录

匹配模式最后跟反斜杠(/)说明要忽略的是目录。

要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

示例

#此为注释    –将被Git忽略
#忽略所有    .a结尾的文件
*.a

#但    lib.a除外
!lib.a

#仅仅忽略项目根目录下的    TODO文件,不包括    subdir/TODO
/TODO

#忽略    build/目录下的所有文件
build/*

#会忽略    doc/notes.txt但不包括    doc/server/arch.txt
doc/*.txt

#忽略    doc/目录下所有扩展名为    txt的文件
doc/**/*.txt(**通配符从  Git版本    1.8.2以上已经可以使用)

        GitHub有一个十分详细的针对数十种项目及语言的.gitignore文件列表,你可以在 https://github.com/github/gitignore找到它!!!

三、远程协作基本流程

        GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心。大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。 所以,尽管这不是 Git 开源项目的直接部分,但 如果想要专业地使用 Git,你将不可避免地与 GitHub 打交道。

        地址:https://github.com/ 注册成功之后邮箱内有份邮件一定要点!!!

        注:126、163、企业邮箱都可以,尽量不要使用QQ邮箱;

        1、注册一个163邮箱;

        2、注册gitHub帐号;(如果注册验证失败,请使用谷歌浏览器)

项目经理创建远程仓库

         通过点击面板右侧的“New repository”按钮,或者顶部工具条你用户名旁边 的 + 按钮。点击后会出现“new repository” 表单:

08_Git远程仓库_第1张图片

        这里除了一个你必须要填的项目名,其他字段都是可选的。 现在只需要点击 “Create Repository” 按钮,Duang!!! – 你就在 GitHub 上拥有了一个 以 / 命名的新仓库了。

        因为目前暂无代码,GitHub 会显示有关创建新版本库或者关联到一个已有 的 Git 版本库的一些说明;

08_Git远程仓库_第2张图片

         现在你的项目就托管在 GitHub 上了,你可以把 URL 给任何你想分享的人 。 GitHub 上 的 项 目 可 通 过 HTTP 或 SSH 访 问 , 格 式 是 :

         HTTPS : https://github.com// 

        SSH : [email protected]:/ 

         Git 可以 通过以上两种 URL 进行抓取和推送,但是用户的访问权限又因连接时使用的证书不同而异。

        通常对于公开项目可以优先分享基于 HTTP 的 URL,因为用户克隆项目不需要有一个 GitHub 帐号。 如果你分享 SSH URL,用户必须有一个帐号并且上传 SSH 密钥才能访问你的项目。 HTTP URL 与你贴到浏览器里查看项目用的地址是一样的。

项目经理创建本地库

         在工作区新建一个项目,然后里面放置项目的初始代码;

08_Git远程仓库_第3张图片

项目经理为远程仓库配置别名&用户信息

# 显示远程仓库使用的 Git 别名与其对应的 URL 
$ git remote -v

# 添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写
git remote add  

# 查看某一个远程仓库的更多信息
git remote show [remote-name]

# 重命名
git remote rename pb paul

# 如果因为一些原因想要移除一个远程仓库 - 你已经从服务器上搬走了或不再想使用某一个特定的镜像了,又或者某一个贡献者不再贡献了
git remote rm [remote-name]

08_Git远程仓库_第4张图片

项目经理推送本地项目到远程仓库

         初始化一个本地仓库,然后:

git push [remote-name] [branch-name]

        将本地项目的 master 分支推送到 origin (别名)服务器;

08_Git远程仓库_第5张图片

        点击Login,即可推送;  

08_Git远程仓库_第6张图片

08_Git远程仓库_第7张图片

成员克隆远程仓库到本地

# 克隆远程仓库(克隆时不需要 git init)
git clone url 

# 默认克隆时为远程仓库起的别名为 origin

         远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是当你运行 git init 时默认的起始分支名字,原因仅仅 是它的广泛使用,“origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运 行 git clone url -o booyah,那么你默认的远程仓库别名为 booyah;

08_Git远程仓库_第8张图片

项目经理邀请成员加入团队

        如果没有加入团队,那么只有读的权限,没有推送权限:

        注:因为一个电脑模拟两个用户,记得删除凭据哟!

08_Git远程仓库_第9张图片

08_Git远程仓库_第10张图片

         如果你想与他人合作,并想给他们提交的权限,你需要把他们添加为 “Collaborators”。 如果 Ben,Jeff,Louise 都在 GitHub 上注册了,

        你想给他们推送的权限,你可以将他们添加到你的项目。 这样做会给 他们 “推送” 权限,就是说他们对项目有读写的权限点击边栏左侧的 “Settings” 链接

08_Git远程仓库_第11张图片

08_Git远程仓库_第12张图片

08_Git远程仓库_第13张图片

         被邀请者在登录状态下,浏览器打开该链接:

          如果你想授权给多个人,你可以多次 重复这个步骤。 如果你想收回权限,点击他们同一行右侧的删除按钮;

成员推送提交到远程仓库

         只要在同一个团队下面,就可以推送提交了;

git push [remote-name] [branch-name]

08_Git远程仓库_第14张图片

         只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送;

项目经理(其他成员)更新成员提交的内容

git fetch [remote-name]

         这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看;

        必须注意git fetch命令会将数据拉取到你的本地仓库 -它并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工作。

08_Git远程仓库_第15张图片

git pull [remote-name] [branch]

08_Git远程仓库_第16张图片

四、深入理解远程库

远程跟踪分支

         远程跟踪分支是远程分支状态的引用。它们是你不能移动的本地分支。当你做任何网络通信操作时,它们会自动移动。

        它们以 (remote)/(branch) 形式命名,例如,如果你想要看你最后一次与远程仓库 origin 通信时 master 分 支 的 状 态 , 你可以查看origin/master 分支 ;

        当克隆一个仓库时,它通常会自动地创建一个跟踪origin/master 的 master 分支;

        假设你的网络里有一个在 git.ourcompany.com 的 Git 服务器。 如果你从这里克隆,Git 的 clone 命令会为你自动将其命名为 origin,拉取它的所有数据,创建一个指向它的 master 分支的指针,并且在本地将其命名为 origin/master。 Git 也会给你一个 与 origin/master 分支在指向同一个地方的本地 master 分支, 这样你就有工作的基础 。

08_Git远程仓库_第17张图片

        如果你在本地的 master 分支做了一些工作,然而在同一时间,其他人推送提交到 git.ourcompany.com 并更新了它的 master 分支,那么你们的提交历史将向不同的方向前进。 只要你不与 origin 服务器连接,你的 origin/master 指针就不会移动;

08_Git远程仓库_第18张图片

         如果要同步你的工作,运行 git fetch origin 命令。 这个命令查找 “origin” 是哪一个服务器(在本例中,它是 git.ourcompany.com), 从中抓取本地没有的数据,并且更新本地数据库,移动 origin/master 指 针指向新的、更新后的位置。 

推送其他分支

        当你想要公开分享一个分支时,需要将其推送到有写入权限的远程仓库上。 

        本地的分支并不会自动与远程仓库同步 - 你必须显式地推送想要分享的分支。 这样,你就可以把不愿意分享的内容放到私人分支上,而 将需要和别人协作的内容推送到公开分支;

        如果希望和别人一起在名为 serverfix 的分支上工作,你可以像推送第一个分支那样推送它。

git push origin serverfix

        这里有些工作被简化了。 Git 自动将 serverfix 分支名字展开 为 refs/heads/serverfix:refs/heads/serverfix 你也可以运行 git push origin serverfix:serverfix, 它会做同样的事 - 相当于它说,“推送本地的 serverfix 分支,将其作 为远程仓库的 serverfix 分支” ;

git push origin serverfix:awesomebranch

        如果并不想让远程仓库上的分支叫做 serverfix,可以运行以上命令将本地 的 serverfix 分 支 推 送 到 远 程 仓 库 上 的 awesomebranch 分支。 

git fetch origin

        下一次其他协作者从服务器上抓取数据时,他们会在本地生成一个远程跟踪分支 origin/serverfix , 指向服务器 的 serverfix 分支的引用。

        要特别注意的一点是当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本(拷贝)。 换一句话说,这种情况下,不会有一个新的 serverfix 分支 - 只有一 个不可以修改的 origin/serverfix 指针。

git merge origin/serverfix (其他协作者)

        可以运行 git merge origin/serverfix 将这些工作合并到当前所在的分支。

        如果想要在自己的 serverfix 分支上工作,可以将其建立在远程跟踪分支之上: 

git checkout -b serverfix origin/serverfix (其他协作者)

跟踪分支

        从一个远程跟踪分支(origin/master)检出一个本地分支会自动创建一个叫做 “跟踪分支” (有时候也叫做 “上游分支” :master)。 只有主分支 并且 克隆时才会自动建跟踪分支。

        跟踪分支是与远程分支有直接关系的本地分支。 如果在一个跟踪分支上输入 git pull,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。

        如果你愿意的话可以设置其他的跟踪分支,或者不跟踪 master 分支。

git checkout -b [branch] [remotename]/[branch]

git checkout -b serverfix origin/serverfix

        这是一个十分常用的操作所以 Git 提供了 --track 快捷方式

git checkout --track origin/serverfix

        如果想要将本地分支与远程分支设置为不同名字

git checkout -b sf origin/serverfix

        设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的跟踪分支,你可以在任意时间使用 -u 选项运行 git branch 来显式地设置。

git branch -u origin/serverfix (--set-upstream-to)

git branch -vv

        查看设置的所有跟踪分支

git branch -vv

	iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets
	master 1ae2a45 [origin/master] deploying index fix
	* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
 	testing 5ea463a trying something new

        iss53 分支正在跟踪 origin/iss53 并且 “ahead” 是 2, 意味着本地有两个提交还没有推送到服务器上。 

        master 分支正在跟踪 origin/master 分支并且是最新的。 

        serverfix 分 支 正 在 跟 踪 teamone 服 务 器 上的 server-fix-good 分支并且领先 3 落后 1,意味着服务器 上有一次提交还没有合并入同时本地有三次提交还没有推送。

        testing 分支并没有跟踪任何远程分支。

        需要重点注意的一点是这些数字的值来自于你从每个服务器上最后一次抓取的数据。 这个命令并没有连接服务器,它只会告诉你 关于本地缓存的服务器数据。如果想要统计最新的领先与落后数字, 需要在运行此命令前抓取所有的远程仓库。 可以像这样做:$ git fetch --all; git branch –vv。

删除远程分支

# 删除远程分支
git push origin --delete serverfix
 
# 列出仍在远程跟踪但是远程已被删除的无用分支
git remote prune origin --dry-run 

# 清除上面命令列出来的远程跟踪
git remote prune origin 

pull request 流程

        如果你想要参与某个项目,但是并没有推送权限,这时可以对这个项目进行“派生”(Fork)。 派生的意思是指,GitHub 将在你的空间中创建一个完全属于你的项目副本,且你对其具有推送权限。通过这种方式, 项目的管理者不再需要忙着把用户添加到贡献者列表并给予他们推送权限。 人们可以派生这个项目,将修改推送到派生出的项目副本中,并通过创建合并请求(Pull Request)来让他们的改动进入源版本库。

基本流程:
        1. 从 master 分支中创建一个新分支 (自己 fork 的项目)
        2. 提交一些修改来改进项目 (自己 fork 的项目)
        3. 将这个分支推送到 GitHub 上 (自己 fork 的项目)
        4. 创建一个合并请求
        5. 讨论,根据实际情况继续修改
        6. 项目的拥有者合并或关闭你的合并请求

注意点:

        每次在发起新的 Pull Request 时 要去拉取最新的源仓库的代码而不是自己 fork 的那个仓库。

git remote add  
git fetch 远程仓库名字
git merge 对应的远程跟踪分支

你可能感兴趣的:(Git从入门到精通,1024程序员节,git,github)