Git实战教程(下)

Git实战教程--基本用法(下)
1)比较提交--Git Diff
#先对项目内容做些修改
$cd gitproject
$echo "new line" >> README.md
$echo "new file" >> file1
$git status #可以看到一个文件修改了,另外一个文件添加了。如何查看修改的文件内容,就需要使用 git diff命令

#就修改内容添加到本地缓存区,通配符可以把当前目录下所有修改的新增的文件都自动添加
$git add *
$git commit -m 'update code' #提交代码

注:
git diff 查看修改内容
git diff --cached 查看缓存区内容修改

2)比较分支
可以用diff来比较项目中任意两个分支的差异
首先创建一个新的分支test,并在该分支上提交一些修改
#创建test分支并切换到该分支
$git branch test
$git checkout test
$ehco "branch test" >> file1 #添加新的一行到file1
$echo "new file2" >> file2 #创建新的文件file2

#提交所有修改
$git add *
$git commit -m 'update test branch'

#然后查看test分支何master之间的差别:
$git diff master test

3)更多的比较选项
要查看当前工作目录与另外一个分支的差别,可以用以下命令
$git checkout master
$git diff test

#加上路径限定符,只比较一个文件或目录
$git diff test file1 #显示当前工作目录下的file1与test分支之间的差别

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

3)分布式的工作流程
3.1. 分布式的工作流程
目前的项目在 /home/shiyanlou/gitproject目录下,这是我们的git仓库(repository)另一个用户也想参与开发,如何让他提交代码到你的git仓库?
该用户需要从git仓库进行克隆(这里假设为同shiyanlou用户,不同项目下开发)
$cd /tmp #进入到临时目录
$git clone /home/shiyanlou/gitproject myrepo
$ls -l myrepo

#这就建了一个新的叫“myrepo”的目录,这个目录里包含了一份git project仓库的克隆
#在myrepo做一些修改并提交
$cd myrepo
$echo "newcontent" > newfile
$git add newfile
$git commit -m 'add newfile'

#myrepo修改完成后,合并到gitproject的git仓库
可以在仓库 /home/shiyanlou/gitproject中把myrepo的修改pull下来
$cd /home/shiyanlou/gitproject
$git pull /tmp/myrepo master
$ls #查看当前目录文件

#这就是myrepo的主分支合并到了git project的当前分支里了
#如果git project在myrepo修改文件内容的同时也做了修改的话,可能需要手工修复
#如果要经常操作远程分支(remote branch),可以定义它们的缩写
$git remote add myrepo /tmp/myrepo

#git pull命令执行两个操作:它从远程分支(remote branch)抓取修改git fetch的内容,然后把它合并git merge进当前的分支。gitproject可以用git fetch来执行git pull前半部分的工作,但是这条命令并不会把抓下来的修改合并到当前分支。

#通过git log查看远程分支的所有修改
$git log -p master..myrepo/master
$git fetch myrepo #gitproject抓取myrepo
$git merge myrepo/master #把修改合并到它的主分支

#如果在myrepo目录下执行git pull,myrepo会从克隆的位置拉取代码并更新本地仓库,就是把gitproject上的
$cd /home/shiyanlou/gitproject
$echo "gitproject:new line" >> newfile
$git commit -a -m 'add newline to newfile'
$cd /tmp/myrepo
$git pull #同步gitproject的所有修改

#因为myrepo是从gitproject仓库克隆的,那么它就不需要知道gitproject仓库的地址。因为Git把gitproject仓库的地址存储到myrepo的配置文件中,这个地址就是git pull时默认使用的地址。
$git config --get remote.origin.url

#如果myrepo和gitproject在不同的主机上,可以通过ssh协议来执行clone和pull操作
$git clone localhost:/home/shiyanlou/gitproject test

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

3.3. 将修改推到一个公共仓库
通过http或是git协议,其他维护者可以通过远程访问的方式抓取(fetch)你最近的修改,但是他们没有写权限。如何将本地私有仓库的最近修改上传到公共仓库。
最简单的办法就是git push命令,推送本地的修改到远程Git仓库。
$git push ssh://yourserver.com/~you/proj.git master:master
或者
$git push ssh://yourserver.cpm/~you/proj.git master
#git push命令的目的仓库可以是ssh或http/https协议访问

3.4. 当推送代码失败时要怎么办
如果推送(push)结果不是快速向前fast forward,可能会报错。
这种情况通常是没有使用git pull获取远端仓库的最新更新,在本地修改的时候。远端仓库已经变化了,此时应该先使用git pull合并最新的修改再执行git push
$git pull
$git push ssh://yourserver.com/~you/proj.git master

4)Git标签
4.1. 轻量级标签
可以使用git Tag不带任何参数创建一个标签(Tag)指定某个提交(commit)
$cd /home/shiyanlou/gitproject
$git log #查看git提交记录
$git tag stable -1 8c315325 #选择其中一个记录标志位stable-1的标签,注意需要就后面的8c315325替换成仓库下的真 实提交内容,commit的名字很长,通常只需要写前面8位即可
$git tag #查看当前所有tag
#这样我们可以用stable -1作为提交8c315325的代码。

4.2. 标签对象
git tag中使用-a,-s或-u三个参数中的任意一个,都会创建一个标签对象,并且需要一个标签消息(tag message)来作为tag添加注释。
$git tag -a stable -2 8c315325 -m "stable 2"
$git tag

4.3. 签名的标签
签名标签可以让提交和标签更加完整可信。如果配有GPG key,那么就可以很容易创建签名的标签。
首先要在你的.git/config或~/.gitconfig里配好key
$git config (--global) user.signingkey <gpg-key-id>
#在创建标签时使用-s参数来创建“签名的标签”
$git tag -s stable -1 1b2eld3ff
#如果没有在配置文件中配GPG key,可以用-u参数直接指定
$git tag -u <gpg-key-id> stable-1 1b2e1d63ff

猜你喜欢

转载自blog.csdn.net/zhaocen_1230/article/details/80582130