Git 的官网上有很详细的使用教程(当然有翻译版本),具体地址是 https://git-scm.com/book/zh/v2。唯一不足就是,很多讲解并没有实机演示。但是,毫无疑问,官网资料是最全面的!如果有任何疑问,可以去官网看看!
Git 通常也会有个远程仓库。用来协调各个参与者的工作!这与上一代集中式版本控制系统的作用基本类似。一个远程仓库通常只是一个裸仓库(bare repository),即一个没有当前工作目录的仓库。 因为该仓库仅仅作为合作媒介,不需要从磁盘检查快照;存放的只有 Git 的资料。
简单的说,裸存仓库就是你工程目录内的 .git 子目录内容,不包含其他资料。
Git 本地仓库与远程仓库之间的交互需要遵循一定的协议。Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议。
根据 Git 官网的描述,Git 通过 HTTP 通信有两种模式。 在 Git 1.6.6 版本之前只有一个方式可用,十分简单并且通常是只读模式的;Git 1.6.6 版本引入了一种新的、更智能的协议,让 Git 可以像通过 SSH 那样智能的协商和传输数据。这两种模式分别被称为
哑(Dumb) HTTP 协议
和
智能(Smart) HTTP 协议
。
哑 HTTP 协议里 web 服务器仅把裸版本库当作普通文件来对待,提供文件服务。智能(Smart) HTTP 协议在服务端运行了两组进程,分别负责上传[客户端的进程连接到服务端进程]和下载数据[客户端的进程连接服务端],它们可以读取本地数据,理解客户端有什么和需要什么,并为它生成合适的包文件。
每次推送,Git 服务器会询问用户名与密码。 默认情况下它会在终端中提示服务器是否允许你进行推送。如果不想在每一次推送时都输入用户名与密码,你可以设置一个 “credential cache”。 最简单的方式就是将其保存在内存中几分钟,可以简单地运行
git config --global credential.helper cache
来设置它。在 Windows 系统中,在输入过用户名密码之后,会被系统给保存下来!我们可以如下图所示的位置进行修改:
由于我们有搭建服务器,因此这个不好验证。但是 Git 官网有比较详细的介绍这两种协议的具体工作流程:https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE
Git 通常也会有个远程仓库。使用
git init
方式创建的本地仓库只能本地使用,其没有与任何远程仓库关联!远程仓库的增、删、改、查都是通过
git remote
命令来实现。
在 Git 中,会为关联的远程仓库创建一个本地名称,默认不显示指定时为 origin
,这样我们在与远程仓库通信时,直接使用本地名称就可以了!例如,我们要将代码推送到以上关联的远程仓库,直接使用
git push origin
就可以了。
git remote
命令的格式如下:
git remote [-v | --verbose]
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
git remote rename <old> <new>
git remote remove <name>
git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
git remote set-branches [--add] <name> <branch>…
git remote get-url [--push] [--all] <name>
git remote set-url [--push] <name> <newurl> [<oldurl>]
git remote set-url --add [--push] <name> <newurl>
git remote set-url --delete [--push] <name> <url>
git remote [-v | --verbose] show [-n] <name>…
git remote prune [-n | --dry-run] <name>…
git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]
以下是一些常用的命令参数:
-v、--verbose
:用于列出关联的远程仓库,格式为:本地名称 + 远程仓库地址。该参数必须紧跟在 git remote 之后。如下图:
git remote add
:命令格式:
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
。关联一个远程仓库 <url>,本地名称为 <name>。
git remote rename
:命令格式:
git remote rename <old> <new>
。将名为 <old> 的远程仓库名重命名为 <new>。
git remote rm
:命令格式:
git remote remove <name>
。其中,参数
--rm
是
--remove
的简写。删除关联的名为 <name> 的远程仓库的关联信息。
与远程仓库相关的配置,均位于
工作目录下/.git/config
文件中,这是个文本文件,我们也可以直接打开改文件进行修改。
还有一点就是,一个本地仓库可以关联多个远程仓库!
如下图所示是关联了两个远程仓库之后的情况。
如上所示,建议在关联远程仓库的时候,指定一个本地名称,这样我们就可以很容易的知道关联情况。这个在我们往远程仓库提交代码是很有用处!
有一种情况,我们建立的远程仓库并不是空的(里面有文件),在使用以上命令关联本地仓库和远程仓库之后,我们还并不能将本地修改提交到远程仓库!第一点是因为,由于远程仓库本身有内容,我们的本地仓库与远程仓库并不是同步的!我们必须要将本地仓库与远程仓库同步之后,才可以正常提交代码。第二点是因为,多分支的问题,我们必须要关联分支!如下图所示:
从上图中我们不难看出两者的区别!远程仓库不空时,具体操作步骤如下:
git init
git remote add --origin Github_xxx 远程仓库地址
git pull Github_xxx master
git branch --set-upstream-to=Github_xxx/master master
git add .
git commit -m "注释"
git push
当然,如果远程仓库本身是空的(没有任何文件),这步骤如下:
git init
git remote add --origin Github_xxx 远程仓库地址
git add .
git commit -m "注释"
git push
如果本地仓库是直接使用
git clone
命令克隆自一个指定的远程仓库,则默认本地仓库就是和克隆的仓库关联的!我们可以使用
git remote
命令来修改关联信息。例如,如果在克隆时,使用的命令是
git clone 远程仓库地址
而不是
git clone --origin 本地名字
,那么,默认使用 origin 来表示我们关联的远程仓库,我们可以使用
git remote rename
来更改这个名字!
在我们想要保存远程仓库的文件夹中打开 Bash 命令框,执行
git clone https://github.com/ZCShou/N_W_Z_1.git
命令即可(注意将以上仓库地址换为自己的)。如下图:
该命令将远程存储库克隆到新创建的目录中,并为本地存储库中的每个分支创建远程分支关联,并创建和检出从远程存储库当前活动的分支派生出来的初始分支。
该命令的完整格式如下:
git clone [--template=<template_directory>]
[-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
[-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
[--dissociate] [--separate-git-dir <git dir>]
[--depth <depth>] [--[no-]single-branch] [--no-tags]
[--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
[--[no-]remote-submodules] [--jobs <n>] [--] <repository>
[<directory>]
该命令常用参数如下:
-o <name>、--origin <name>
:指定远程仓库的本地名称为 <name>,而不使用默认的 origin。
-b <name>、--branch <name>
:用于克隆名为 <name> 的远程分支,而不是以 HEAD 创建分支。在非空的仓库中执行该命令,表示将指定的分支同步到当前仓库!
<repository>
:要克隆的(可能是远程的)存储库。
<directory>
:指定保存克隆的仓库的本地目录名称。 如果没有明确给出目录,则使用远程库名字在当前目录。只有当目录为空时,才允许克隆到现有目录。
克隆之后,默认会使用
git fetch
将更新所有远程跟踪分支,并且没有参数的
git pull
将另外将远程主分支合并到当前主分支中(如果有的话)。其中也会有个 .git 的文件夹!
使用以上命令之后,本地仓库就会和以上指定的远程仓库管理关联。在 Git 中,会为关联的远程仓库创建一个本地名称,不显示指定时默认为 origin。我们可以在以上命令中使用参数
--origin 本地名称
来指定本地名称(
git clone --origin NWZ_xxx https://github.com/ZCShou/N_W_Z_1.git
)。
远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是当你运行 git init 时默认的起始分支名字,原因仅仅是它的广泛使用,“origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master。
一旦远程主机的版本库有了更新,需要先将这些更新取回本地,否则,在将本地提交到远程仓库时会报错。这时就要用到
git fetch
或者
git pull
命令。
该命令用来从一个或多个其他存储库中获取分支和/或标记(统称为“refs”),以及完成其历史记录所需的对象。 该操作会更新远程跟踪分支。行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
必须注意
git fetch
命令会将数据拉取到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。而运行
git pull
通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。简单来说,
git pull = git fetch + git merge
git pull 命令:
格式:$ git pull <远程主机名> <远程分支名>:<本地分支名>
举例:$ git pull Docs master:master
$ git push Docs master
$ git branch --set-upstream master Docs/next
$ git pull origin
$ git pull
git fetch 命令:
$ git fetch <远程主机名>
$ git fetch <远程主机名> <分支名>
$ git merge origin/master
$ git checkout -b newBrach Docs/master