EchoDemo's Blogs

Git入门(二)

1、比较分支

//查看test分支和master之间的差别
$ git diff master test

//查看当前的工作目录与另外一个分支的差别,查看与test分支的区别
$ git diff test

//你也以加上路径限定符,来只比较某一个文件或目录
$ git diff test file1

//--stat 参数可以统计一下有哪些文件被改动,有多少行被改动
$ git diff test --stat

2、分布式的工作流程

(1)分布式的工作流程

你目前的项目在gitproject目录下,这是我们的git仓库(repository),假设另一个用户也想与你协作开发。他的工作目录也在这台机器上。首先,我们假设另一个用户也用相同的用户登录,只是工作在不同的目录下开发代码,实际工作中不太可能发生,大部分情况都是多个用户,这个假设只是为了让实验简化。

//克隆git仓库,建了一个新的叫"myrepo"的目录,这个目录里包含了一份gitproject仓库的克隆
$ git clone gitproject myrepo

//查看
$ ls -l myrepo

在 myrepo 做了一些修改并且提交:

$ cd myrepo

//添加新的文件newfile
$ echo "newcontent" > newfile

//提交修改
$ git add newfile
$ git commit -m "add newfile"

myrepo修改完成后,可以在仓库gitproject中把myrepo的修改给拉(pull)下来,合并这份修改到gitproject的git仓库。git pull命令执行两个操作: 它从远程分支(remote branch)抓取修改git fetch的内容,然后把它合并git merge进当前的分支。如果gitproject在myrepo修改文件内容的同时也做了修改的话,可能需要手工去修复冲突。

$ cd gitproject

$ git pull myrepo master

$ ls   

gitproject里可以用git fetch 来执行git pull前半部分的工作,但是这条命令并不会把抓下来的修改合并到当前分支里:

$ git fetch myrepo

获取后,我们可以通过git log查看远程分支做的所有修改,由于我们已经合并了所有修改,所以不会有任何输出:

$ git log -p master..myrepo/master

当检查完修改后,gitproject可以把修改合并到它的主分支中:

$ git merge myrepo/master

如果我们在myrepo目录下执行git pull。myrepo会从克隆的位置拉取代码并更新本地仓库,就是把gitproject上的修改同步到本地:

//进入到gitproject
$ cd gitproject

//添加一行内容到newfile
$ echo "gitproject: new line" >> newfile

//提交修改
$ git commit -a -m 'add newline to newfile'

//进入myrepo目录
$ cd myrepo

//同步gitproject的所有修改
$ git pull

因为myrepo是从gitproject仓库克隆的,那么他就不需要指定gitproject仓库的地址。因为Git把gitproject仓库的地址存储到myrepo的配置文件中,这个地址就是在git pull时默认使用的远程仓库:

$ git config --get remote.origin.url

(2)公共git仓库

开发过程中,通常大家都会使用一个公共的仓库,并clone到自己的开发环境中,完成一个阶段的代码后可以告诉目标仓库的维护者来pull自己的代码。如果你和维护者都在同一台机器上有帐号,那么你们可以互相从对方的仓库目录里直接拉所作的修改,git命令里的仓库地址也可以是本地的某个目录名:

$ git clone /path/to/repository
$ git pull /path/to/other/repository

//也可以是一个ssh地址:
$ git clone ssh://yourhost/~you/repository

(3)将修改推到一个公共仓库

通过http或是git协议,其它维护者可以通过远程访问的方式抓取(fetch)你最近的修改,但是他们 没有写权限。如何将本地私有仓库的最近修改主动上传到公共仓库中呢?最简单的办法就是用git push命令,推送本地的修改到远程Git仓库,执行下面的命令:

$ git push ssh://yourserver.com/~you/proj.git master:master

或者:

$ git push ssh://yourserver.com/~you/proj.git master

如果推送(push)结果不是快速向前fast forward,可能会报像错。常是因为没有使用git pull获取远端仓库的最新更新,在本地修改的同时,远端仓库已经变化了(其他协作者提交了代码),此时应该先使用git pull合并最新的修改后再执行git push:

$ git pull
$ git push ssh://yourserver.com/~you/proj.git master

3、git标签

(1)轻量级标签

我们可以用 git tag不带任何参数创建一个标签(tag)指定某个提交(commit):

//进入到gitproject目录
$ cd gitproject

//查看git提交记录
$ git log

//选择其中一个记录标志位stable-1的标签,注意需要将后面的8c315325替换成仓库下的真实提交内,commit的名称很长,通常我们只需要写前面8位即可
$ git tag stable-1 8c315325

//查看当前所有tag
$ git tag

这样,我们可以用stable-1作为提交8c315325的代称。前面这样创建的是一个“轻量级标签”。如果你想为一个tag添加注释,或是为它添加一个签名, 那么我们就需要创建一个 “标签对象”。git tag中使用-a, -s 或是 -u三个参数中任意一个,都会创建一个标签对象,并且需要一个标签消息(tag message)来为tag添加注释。 如果没有-m 或是 -F这些参数,命令执行时会启动一个编辑器来让用户输入标签消息。当这样的一条命令执行后,一个新的对象被添加到Git对象库中,并且标签引用就指向了一个标签对象,而不是指向一个提交,这就是与轻量级标签的区别。

下面是一个创建标签对象的例子:

$ git tag -a stable-2 8c315325 -m "stable 2"

(2)签名的标签

签名标签可以让提交和标签更加完整可信。如果你配有GPG key,那么你就很容易创建签名的标签。首先你要在你的 .git/config 或 ~/.gitconfig 里配好key。

下面是示例:

[user]
    signingkey = <gpg-key-id>

你也可以用命令行来配置:

$ git config (--global) user.signingkey <gpg-key-id>

现在你可以在创建标签的时候使用-s 参数来创建“签名的标签”:

$ git tag -s stable-1 1b2e1d63ff

如果没有在配置文件中配GPG key,你可以用-u参数直接指定。

$ git tag -u <gpg-key-id> stable-1 1b2e1d63ff
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------