我们在此使用 GitHub 作为远程仓测试,可先行注册账号并了解一下其简单操作。分布式控制系统强大之远程管理。此篇章含「九、git clone、git push、git pull 和 git fetch 详解」。
一、关联远程库
实际操作:
- 创建 SSH Key
//注:操作系统 Centos7,下同
[player@study ~]$ ssh-keygen -t rsa -C "player@xx.com"
在家目录下,用自己的邮箱生成 SSH Key,过程中一路回车,使用默认值即可。
家目录下生成 .shh
目录,其中有,id_rsa
私钥文件,id_rsa.pub
公钥文件。把 id_rsa.pub
公钥文件内容复制到 GitHub -> Account settings -> SSH Keys,完成 SSH 协议关联。
- 把本地仓库添加至远程仓库
先在远程仓 GitHub 创建一个 test
空仓库,然后在本地仓库关联:
[player@study test]$ git remote add origin git@github.com:player/test.git
关联过程中注意要用自己的远程仓地址。
把本地仓库内容推送到远程仓:
[player@study test]$ git push -u origin master
此命令实际上是把分支 master
推送到远程,因为是第一次推送,加上 -u
参数,可以把本地及远程 master 分支关联起来,可简化后续操作。
- 克隆远程仓
把远程仓克隆到本地:
[player@study ~]$ git clone git@github.com:player/snake.git
不需要新建空文件夹,可直接使用此命令,会把远程仓及所在目录克隆过来,但只有 master 分支且关联。
对于本地和远程的关联,多是先建个远程仓再用 git clone 直接到本地,方便自己也方便其他小伙伴。同时 Git 支持多种传输协议,这里采用了常用的 SSH 协议。
二、查看远程仓信息
命令:git remote
使用方法:
- 可加参数 -v
git remote -v
实际操作:
[player@study test]$ git remote
origin
[player@study test]$ git remote -v
origin git@github.com:player/test.git (fetch)
origin git@github.com:player/test.git (push)
origin
是 Git 默认的远程主机名。还可以看到远程仓可以 fetch 抓取和 push 推送的地址。
三、推送本地分支
命令:git push
使用方法:
- 本地分支有更新,推送一下,新分支也可推送至远程
git push origin <name>
实际操作:
把本地的 develop 分支推到远程
[player@study test]$ git push origin develop
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'develop' on GitHub by visiting:
remote: https://github.com/player/test/pull/new/develop
remote:
To git@github.com:player/test.git
* [new branch] develop -> develop
四、拉取远程分支
命令:git pull
使用方法:
- 拉取和当前分支关联的远程分支
git pull
实际操作:
[player@study test]$ git branch
develop
* master
[player@study test]$ git pull
Already up-to-date.
因为我们对远程仓没有操作,所以拉取的时候很顺利。实际情况,很可能会因为其他人的推送更新,导致拉取发生冲突,手动解决就好了。通常 git push 之前都要先 git pull 下以解决冲突。
五、查看远程分支
命令:git branch -r
使用方法:
- 分支命令加参数 -r
git branch -r
实际操作:
[player@study test]$ git branch -r
origin/develop
origin/master
六、抓取远程分支
命令:git checkout -b <name> origin/<name>
使用方法:
- 把未在本地的远程分支抓到本地
git checkout -b <name> origin/<name>
实际操作:
[player@study test]$ git checkout master //切换至 master
Switched to branch 'master'
[player@study test]$ git branch -d develop //先把本地 develop 删除
Deleted branch develop (was 9bd9118).
[player@study test]$ git checkout -b develop origin/develop //再抓取远程 develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
返回信息告诉你已经帮你相互关联了 develop。实际上这个命令并未真正和远程库互动,从他的执行速度就可以看出来,本质还是 git checkout 这个命令在本地起作用。
七、建立本地分支与远程分支的关联
命令:git branch --set-upstream-to=origin/<name> <name>
使用方法:
- 分支相互关联,可以简化 git pull
git branch --set-upstream-to=origin/<name> <name>
实际操作:
[player@study test]$ git pull //develop 若是还未相互关联,可以看看返回信息
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> develop
[player@study test]$ git branch --set-upstream-to=origin/develop develop //关联 develop 分支
Branch develop set up to track remote branch develop from origin.
八、删除远程分支
命令:git push origin :<name>
使用方法:
- 注意 origin 后的 空格,相当于推一个空分支以此删除远程分支
git push origin :<name>
- 或使用 --delete 参数
git push origin --delete <name>
实际操作:
[player@study test]$ git push origin :develop
To git@github.com:player/test.git
- [deleted] develop
九、git clone、git push、git pull 和 git fetch 详解
为什么说是详谈呢?上方命令对于实用性应该够用,但作为分布式的强大,还是再详细了解一下这几个和远程仓命令相关的常用操作吧!
1. git clone
使用方法:
-
git clone <远程库地址>
把远程仓克隆到本地。不需要先建本地仓,会把远程仓及所在目录克隆过来,而且只有 master 分支且关联 -
git clone <远程库地址> <自定本地目录名>
第二个参数可以指定克隆到本地的仓库名 -
git clone -o <自定远程主机名> <远程库地址>
参数 -o 后可为远程主机命名,不使用默认名 origin
2. git fetch
这好像是个新命令,其实 git pull 命令可以认为已经包含了 git fetch 命令,但他对于本地工作区无影响。
使用方法:
-
git fetch <远程主机名>
将指定远程主机的所有更新拉取到本地 -
git fetch <远程主机名> <分支名>
拉取指定分支的更新到本地
远程更新拉取到本地后,怎么查看和利用呢?可以利用本地命令
- git branch -r
//查看远程仓分支 - git log <远程主机名>/<分支名>
//查看相应远程仓的提交日志 - git merge <远程主机>/<分支名>
//合并远程分支到当前分支 - git checkout -b <新建分支名> <远程主机>/<分支名>
//在远程分支基础上建立新分支,即「六、抓取远程分支」
为什么会这样呢?其实在克隆远程仓的过程中,这些远程仓、本地仓等需要的参数,都设置完毕了,但都是静态的,即使远程发生变化也捕捉不到,所以需要手动更新。即真正能和远程主机互动的命令很少,而 clone、fetch、pull、push 等是为数不多的几个。
3. git pull
拉取远程主机分支,和本地分支合并,其相当于 git fetch 和 git merge <远程主机>/<分支名>
两条命令的简化。
使用方法:
-
git pull <远程主机名> <远程分支名>:<本地分支名>
此为 git pull 较为完整的使用方法,拉取远程主机指定分支,和本地指定分支合并,不需要分支相互关联 -
git pull <远程主机名> <远程分支名>
拉取远程主机指定分支,和本地当前分支合并,不需要分支相互关联 -
git pull <远程主机名>
省略远程分支名,就需要分支关联了,拉取指定远程主机的关联分支,和本地当前分支合并 -
git pull
无参数,需要分支关联,而且本地分支只关联了一个远程分支,拉取并和本地当前分支合并
4. git push
git push 有两种方式,采用默认的 simple
新模式比较好;另一种方式为 matching,下方有简单的介绍。先设置一下全局变量,要不然总是出提示。
[player@study ~]$ git config --global push.default simple
-
git push <远程主机名> <本地分支名>:<远程分支名>
git push 的完整用法和 git pull 类似,注意分支名的位置,推送本地分支到远程分支,若没有相应远程分支则创建,不需关联 -
git push <远程主机名> <本地分支名>
推送本地分支,若远程没有同名分支则创建,不需关联 -
git push <远程主机名> :<远程分支名>
省略本地分支名,可删除指定的远程分支,相当于推送一个空的本地分支到远程分支,不需关联 -
git push <远程主机名>
推送当前本地分支,需要关联 -
git push
推送本地分支,需要关联,且唯一
(git push 无参数时,simple 模式,仅推送当前本地分支至匹配的远程分支)
(git push 无参数时,matching 模式,会推送所有本地分支至匹配的远程分支) -
git push -u <远程主机名> <本地分支名>
若是有多个远程关联,加 -u 参数,可以指定一个默认的关联远程主机名,然后就可以直接用无参数的 git push
5. git remote
使用方法:
-
git remote
无参数,列出关联的所有远程主机 -
git remote -v
参数 -v,可查看远程主机的远程仓地址 -
git remote -vv
参数 -vv,可查看本地分支和远程分支的关联信息 -
git remote show <远程主机名>
查看指定远程主机的详细信息 -
git remote add <远程主机名> <远程仓地址>
在本地仓关联远程仓,即「一、关联远程库」->「2. 把本地仓库添加至远程仓库」 -
git remote rm <远程主机名>
删除指定的远程主机 -
git remote rename <原主机名> <新主机名>
为远程主机改个名
推荐阅读: