(大数据工程师学习路径)第三步 Git Community Book----基本用法(下)
一、比较提交 - Git Diff
1.比较提交 - Git Diff
你可以用 git diff 来比较项目中任意两个版本的差异。
$ git diff master..test
上面这条命令只显示两个分支间的差异,如果你想找出‘master’,‘test’的共有父分支和'test'分支之间的差异,你用3个'.'来取代前面的两个'.' 。
$ git diff master...test
git diff 是一个难以置信的有用的工具,可以找出你项目上任意两点间 的改动,或是用来查看别人提交进来的新分支。
2.哪些内容会被提交(commit)
你通常用git diff来找你当前工作目录和上次提交与本地索引间的差异。
$ git diff
上面的命令会显示在当前的工作目录里的,没有 staged(添加到索引中),且在下次提交时不会被提交的修改。 如果你要看在下次提交时要提交的内容(staged,添加到索引中),你可以运行:
$ git diff HEAD
上面这条命令会显示你工作目录与上次提交时之间的所有差别,这条命令所显示的内容都会在执行"git commit -a"命令时被提交。
3.更多的比较选项
如果你要查看当前的工作目录与另外一个分支的差别,你可以用下面的命令执行:
$ git diff test
这会显示你当前工作目录与另外一个叫'test'分支的差别。你也以加上路径限定符,来只比较某一个文件或目录。
$ git diff HEAD -- ./lib
上面这条命令会显示你当前工作目录下的lib目录与上次提交之间的差别(或者更准确的 说是在当前分支)。 如果不是查看每个文件的详细差别,而是统计一下有哪些文件被改动,有多少行被改 动,就可以使用‘--stat' 参数。
$ git diff --stat
有时这样全局性的查看哪些文件被修改,能让你更轻一点。
三、分布式的工作流程
1.分布式的工作流程
现在我们的项目在/home/shiyanlou/gitproject建了一个新的git 仓库(repository);另一个用户的工作目录也在同一台机器,也要提交代码。 执行了这样的命令克隆新的工作目录
$ git clone /home/shiyanlou/gitproject myrepo
这就建了一个新的叫"myrepo"的目录,这个目录里包含了一份gitproject仓库的克隆(clone). 这份克隆和原始的项目一模一样,并且拥有原始项目的历史记录。 在myrepo做了一些修改并且提交(commit)它们:
$ cd myrepo
$ echo "newcontent" > newfile
$ git add newfile
$ git commit -m "add"
myrepo修改完成后,需要在仓库/home/shiyanlou/gitproject中把myrepo的修改给拉 (pull)下来。执行下面几条命令:
$ cd /home/shiyanlou/gitproject
$ git pull /home/shiyanlou/myrepo master
这就把myrepo的主(master)分支合并到了gitproject的当前分支里了。如果gitproject在myrepo修改文件内容的同时也做了修改的话,他可能需要手工去修复冲突. (注意:"master"参数在上面的命令中并不一定是必须的,因为这是一个 默认参数) git pull命令执行两个操作: 它从远程分支(remote branch)抓取修改 的内容,然后把它合并进当前的分支。 如果你要经常操作远程分支(remote branch),你可以定义它们的缩写:
$ git remote add myrepo /home/shiyanlou/myrepo
这样,gitproject里可以用"git fetch"" 来执行"git pull"前半部分的工作, 但是这条命令并不会把抓下来的修改合并到当前分支里。
$ git fetch myrepo
我们用git remote命令建立了myrepo的远程仓库的缩写,用这个(缩写) 名字我从myrepo那得到所有远程分支的历史记录。在这里远程分支的名 字就叫myrepo/master.
$ git log -p master..myrepo/master
上面的命令把myrepo从gitproject的主分支(master)中签出后所做的修改全部显示出来。 当检查完修改后,gitproject就可以把修改合并到它的主分支中。
$ git merge myrepo/master
这种合并(merge)也可以用pull来完成,就像下面的命令一样:
$ git pull . remotes/myrepo/master
注意:git pull 会把远程分支合并进当前的分支里,而不管你在命令行里指定什么。 其后,myrepo可以更新它的本地仓库--把gitproject做的修改拉过来(pull):
$ git pull
如果myrepo从gitproject的仓库克隆(clone),那么他就不需要指定gitproject仓库的地 址;因为Git把gitproject仓库的地址存储到myrepo的仓库配库文件,这个地址就是在git pull时使用:
$ git config --get remote.origin.url
Git同时也保存了一份最初(pristine)的gitproject主分支(master),在origin/master下面。
$ git branch -r
如果myrepo打算在另外一台主机上工作,他可以通过ssh协议来执行"clone" 和"pull"操作:
$ git clone alice.org:/home/shiyanlou/gitproject myrepo
2.公共Git仓库
另外一个提交修改的办法,就是告诉项目的维护者(maintainer)用 git pull 命令从你的仓库里把修改拉下来。这和从主仓库"里更新代码类似,但是是从 另外一个方向来更新的。 如果你和维护者(maintainer)都在同一台机器上有帐号,那么你们可以互相从对 方的仓库目录里直接拉(pull)所作的修改;git命令里的仓库地址也可以是本地 的某个目录名:
$ git clone /path/to/repository
$ git pull /path/to/other/repository
也可以是一个ssh地址:
$ git clone ssh://yourhost/~you/repository
3.将修改推到一个公共仓库
通过http或是git协议,其它维护者可以抓取(fetch)你最近的修改,但是他们 没有写权限。这样,这需要将本地私有仓库的最近修改上传公共仓库中。 译者注: 通过http的WebDav协议是可以有写权限的,也有人配置了git over http. 最简单的办法就是用 git push命令 和ssh协议; 用你本地的"master" 分支去更新远程的"master"分支,执行下面的命令:
$ git push ssh://yourserver.com/~you/proj.git master:master
或者
$ git push ssh://yourserver.com/~you/proj.git master
和git-fetch命令一样git-push如果命令的执行结果不是"快速向前"(fast forward) 就会报错; 下面的章节会讲如何处理这种情况。 推(push)命令的目地仓库一般是个裸仓库(bare respository)。 你也可以推到一 个签出工作目录树(checked-out working tree)的仓库,但是工作目录中内 容不会被推命令所更新。如果你把自己的分支推到一个已签出的分支里,这 会导致不可预知的后果。 在用git-fetch命令时,你也可以修改配置参数,让你少打字。 下面这些是例子:
$ cat >>.git/config <<EOF
你可以用下面的命令来代替前面复杂的命令:
$ git push public-repo master
4.当推送代码失败时要怎么办
如果推送(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-reset --hard删除了一个已经发布了的一个提交,或是 用 git-commit --amend 去替换一个已经发布的提交,或是 用 git-rebase 去rebase一个已经发布的提交.  你可以强制git-push在上传修改时先更新,只要在分支名前面加一个加号。
$ git push ssh://yourserver.com/~you/proj.git +master
四、Git标签
1.轻量级标签
我们可以用 git tag不带任何参数创建一个标签(tag)指定某个提交(commit):
$ git tag stable-1 1b2e1d63ff
这样,我们可以用stable-1 作为提交(commit) "1b2e1d63ff" 的代称(refer)。 前面这样创建的是一个“轻量级标签",这种分支通常是从来不移动的。 如果你想为一个标签(tag)添加注释,或是为它添加一个签名(sign it cryptographically), 那么我们就需要创建一个 "标签对象"。
标签对象
如果有 "-a", "-s" 或是 "-u " 中间的一个命令参数被指定,那么就会创建一个标签对象,并且需要一个标签消息(tag message). 如果没有"-m " 或是 "-F " 这些参数,那么就会启动一个编辑器来让用户输入标签消息(tag message).。 当这样的一条命令执行后,一个新的对象被添加到Git对象库中,并且标签引用就指向了一个标签对象,而不是指向一个提交(commit). 这样做的好处就是:你可以为一个标签到处签名(sign), 方便你以后来查验这是不是一个正确的提交(commit). 下面是一个创建标签对象的例子:
$ git tag -a stable-1 1b2e1d63ff
标签对象可以指向任何对象,但是在通常情况下是一个提交(commit). (在Linux内核代码中,第一个标签对象是指向一个树对象(tree),而不是指向一个提交(commit))。
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
五、小结
本节讲了比较提交使用git diff、分布式的工作流程和标签使用git tag命令。
六、练习
请往你自己的仓库上传一个文件,里面包含shiyanlou的字样。
(大数据工程师学习路径)第三步 Git Community Book----基本用法(下)的更多相关文章
- (大数据工程师学习路径)第一步 Linux 基础入门----正则表达式基础
		
介绍 虽然我们这一节的标题是正则表达式,但实际这一节只是介绍grep,sed,awk这三个命令,而正则表达式作为这三个命令的一种使用方式(命令输出中可以包含正则表达式).正则表达式本身的内容很多,要把 ...
 - (大数据工程师学习路径)第一步 Linux 基础入门----环境变量与文件查找
		
环境变量与文件查找 本节介绍环境变量的作用与用法,及几种搜索文件的方法.学会这些技巧高效地使用 Linux. 一.环境变量 1.变量 要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变 ...
 - (大数据工程师学习路径)第一步 Linux 基础入门----目录结构及文件基本操作
		
Linux 目录结构及文件基本操作 介绍 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录 ...
 - (大数据工程师学习路径)第一步 Linux 基础入门----Linux 下软件安装
		
介绍 介绍 Ubuntu 下软件安装的几种方式,及 apt,dpkg 工具的使用. 一.Linux 上的软件安装 通常 Linux 上的软件安装主要有三种方式: 在线安装 从磁盘安装deb软件包 从二 ...
 - (大数据工程师学习路径)第一步 Linux 基础入门----命令执行顺序控制与管道
		
介绍 顺序执行.选择执行.管道.cut 命令.grep 命令.wc 命令.sort 命令等,高效率使用 Linux 的技巧. 一.命令执行顺序的控制 1.顺序执行多条命令 通常情况下,我们每次只能在终 ...
 - (大数据工程师学习路径)第一步 Linux 基础入门----文件系统操作与磁盘管理
		
介绍 本节的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习后续其他内容的过程中有极大帮助. 因为本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前 ...
 - (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理
		
用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...
 - (大数据工程师学习路径)第一步 Linux 基础入门----基本概念及操作
		
本节联练习主要有: 1.环境介绍 2.常用 Shell 命令及快捷键 3.Linux 使用小技巧 一.Linux 桌面环境介绍 相对于现在的 Windows 系统,UNIX/Linux 本身是没有图形 ...
 - (大数据工程师学习路径)第一步 Linux 基础入门----数据流重定向
		
介绍 开始对重定向这个概念感到些许陌生,但通过前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是重定向,将原本输出到标准输出的数 ...
 - (大数据工程师学习路径)第一步 Linux 基础入门----简单的文本处理
		
介绍 这一节我们将介绍这几个命令tr(注意不是tar),col,join,paste.实际这一节是上一节关于能实现管道操作的命令的延续,所以我们依然将结合管道来熟悉这些命令的使用. 一.常用的文本处理 ...
 
随机推荐
- 重新想象 Windows 8 Store Apps (5) - 控件之集合控件: ComboBox, ListBox, FlipView, ItemsControl, ItemsPresenter
			
原文:重新想象 Windows 8 Store Apps (5) - 控件之集合控件: ComboBox, ListBox, FlipView, ItemsControl, ItemsPresente ...
 - oracle查询和编写数据字典
			
在项目交付时假设须要编写数据字典,能够採用以下的方法.首先执行以下的sql语句 SELECT A.TABLE_NAME AS 表名, A.COLUMN_NAME AS 字段名, DECODE(A.CH ...
 - 重写onBackPressed方法
			
android手机back按键响应方法重构: long exitTime = System.currentTimeMillis() - 2000; public void onBackPressed( ...
 - c语言  int (*p)[5]  类型分析
			
#include<stdio.h> int main() { int i; int b[5]={1,3,5,7,9}; int (*a)[5] = &b ...
 - 智能家居DIY
			
近期智能家居比較火,将房子简单改造下,也算体验智能家居. 本文解说的是用无线的方式,长处是:不用改造现有线路,直接安装模块就可以实现想要的功能,花的钱也较少,共六百左右 =============== ...
 - 白板编程浅谈——Why, What, How(转)
			
原文链接:http://lucida.me/blog/whiteboard-coding-demystified/ 这篇文章节选自我正在撰写的一本关于应届生面试求职的书籍,欢迎在评论或微博(@peng ...
 - 玩转Web之easyui(一)-----easy ui datagird 分页
			
easy ui 中数据表格的分页其实是很简单的,分页是在数据表格可以正常显示数据的基础上进行的,在这里给出servlet的代码,其中selectAll()方法是从数据库中提取所有数据, 分页的一种思路 ...
 - HDU   2017   一系列统计数据
			
一系列统计数据 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
 - Java设计模式菜鸟系列(两)建模与观察者模式的实现
			
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577 观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一 ...
 - [原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)
			
原文:[原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) .NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) 前言:接着上篇来. 系列文章链接: [ ...