继续学习Git!冲鸭!🦆🦆🦆
概述
本节将学习下面知识点:
- 分布式的工作流程
- git tag
分布式的工作流程
git pull
git pull 命令等同于执行两个操作: 先使用 git fetch
从远程分支抓取最新的分支修改信息,然后使用 git merge
把修改合并进当前的分支。
$ git pull /tmp/myrepo master
这就把 myrepo
的主分支合并到了当前分支。
如果 myrepo
和 gitproject
在不同的主机上,可以通过 ssh 协议来执行 clone
和pull
操作:
$ git clone localhost:/home/shiyanlou/gitproject test (test是分支名)
公共Git仓库
开发过程中,通常大家都会使用一个公共的仓库,并 clone 到自己的开发环境中,完成一个阶段的代码后可以告诉目标仓库的维护者来 pull
自己的代码。
如果你和维护者都在同一台机器上有帐号,那么你们可以互相从对方的仓库目录里直接拉所作的修改,git 命令里的仓库地址也可以是本地的某个目录名:
$ git clone 仓库A的路径
$ git pull 仓库B的路径
也可以是一个ssh地址:
$ git clone ssh://服务器/账号/仓库名称
将修改推向一个公共仓库
通过 http 或是 git 协议,其它维护者可以通过远程访问的方式抓取(fetch)你最近的修改,但是他们没有写权限。如何将本地私有仓库的最近修改主动上传到公共仓库中呢?
最简单的办法就是用 git push
命令,推送本地的修改到远程 Git 仓库,执行下面的命令:
$ git push ssh://服务器仓库地址 master:master
或者
$ git push ssh://服务器仓库地址 master
git push
命令的目地仓库可以是 ssh
或 http/https
协议访问。
推送代码失败
如果推送(push)结果不是快速向前 fast forward
,可能会报像下面一样的错误:
error: remote 'refs/heads/master' is not an ancestor of
local 'refs/heads/master'.
Maybe you are not up-to-date and need to pull first?
error: failed to push to 'ssh://yourserver.com/~you/proj.git'
这种情况通常是因为没有使用 git pull
获取远端仓库的最新更新,在本地修改的同时,远端仓库已经变化了(其他协作者提交了代码),此时应该先使用 git pull
合并最新的修改后再执行 git push
:
$ git pull
$ git push ssh://服务器仓库地址 master
Git标签🏷️
我们可以用 git tag 不带任何参数创建一个标签(tag)指定某个提交(commit):
# 进入到gitproject目录
$ cd /home/shiyanlou/gitproject
# 查看git提交记录
$ git log
# 选择其中一个记录标志位stable-1的标签,注意需要将后面的8c315325替换成仓库下的真实提交内,commit的名称很长,通常我们只需要写前面8位即可
$ git tag stable-1 8c315325
# 查看当前所有tag
$ git tag
stable-1
这样,我们可以用stable-1 作为提交 8c315325
的代称。
前面这样创建的是一个“轻量级标签”。
如果你想为一个tag添加注释,或是为它添加一个签名, 那么我们就需要创建一个 “标签对象”。
标签对象
git tag
中使用 -a
, -s
或是 -u
三个参数中任意一个,都会创建一个标签对象,并且需要一个标签消息(tag message)来为 tag 添加注释。 如果没有 -m
或是 -F
这些参数,命令执行时会启动一个编辑器来让用户输入标签消息。
当这样的一条命令执行后,一个新的对象被添加到 Git 对象库中,并且标签引用就指向了一个标签对象,而不是指向一个提交,这就是与轻量级标签的区别。
下面是一个创建标签对象的例子:
$ git tag -a stable-2 8c315325 -m "stable 2"
$ git tag
stable-1
stable-2
接下来…
后面的教程比较难且用到不多,最近先不研究啦~
参考
[1] 实验楼Git实战教程