一、比较提交 - 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的字样。

转载于:https://www.cnblogs.com/yangxiao99/p/4715362.html

(大数据工程师学习路径)第三步 Git Community Book----基本用法(下)相关推荐

  1. (大数据工程师学习路径)第三步 Git Community Book----高级技能

    一.创建新的空分支 1.创建新的空分支 在偶尔的情况下,你可能会想要保留那些与你的代码没有共同祖先的分支.例如在这些分支上保留生成的文档或者其他一些东西.如果你需要创建一个不使用当前代码库作为父提交的 ...

  2. (大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL函数和操作符

    一.操作符 1.1 操作符优先级 以下列表显示了操作符优先级的由低到高的顺序.排列在同一行的操作符具有相同的优先级. 操作符 优先级 := 1 ||, OR, XOR 2 &&, AN ...

  3. (大数据工程师学习路径)第四步 SQL基础课程----SQL介绍及mysql的安装

    一.数据库和SQL介绍 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它的产生距今已有六十多年.随着信息技术和市场的发展,数据库变得无处不在:它在电子商务.银行系统等众多领域都 ...

  4. (大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL视图

    一.CREATE VIEW语法 CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(c ...

  5. (大数据工程师学习路径)第二步 Vim编辑器----Vim文档编辑

    一.vim重复命令 1.重复执行上次命令 在普通模式下.(小数点)表示重复上一次的命令操作 拷贝测试文件到本地目录 $ cp /etc/protocols . 打开文件进行编辑 $ vim proto ...

  6. 大数据工程师学习计划

    申明:本文旨在为普通程序员(Java程序员最佳)提供一个入门级别的大数据技术学习路径,不适用于大数据工程师的进阶学习,也不适用于零编程基础的同学. 前言 一.背景介绍 本人目前是一名大数据工程师,项目 ...

  7. 大数据工程师学习路线

    转载来源:https://blog.csdn.net/GitChat/article/details/78341484 申明: 本文旨在为普通程序员(Java程序员最佳)提供一个入门级别的大数据技术学 ...

  8. 网易大数据工程师学习之路分享

    之所以忽然提笔,是因为这段时间正好在业余时间系统地学习Spark,整个学习思路让我想起了大学期间学习<模拟电子电路>这门课的一些方法,个人觉得可以作为一个学习模板来和大家一起交流分享(本文 ...

  9. 作为阿里云年薪500k大数据工程师必须掌握以下三种技能

    阿里云 大数据在近几年的发展速度确实超出人们的预料,自2014年3月"大数据"首次出现在<政府工作报告>中以来,国务院常务会议一年内6次提及大数据运用,而且不管是在数博 ...

  10. 大数据工程师学习路线,大数据培训后好就业吗?能拿多少钱?

    大数据开发工程师在一线城市和大数据发展城市的薪资是比较高的,因为我接触到的学生毕业后一般在北京.广东.上海.南京地区就业的居多,所以可能我的概括也有局限性仅供你参考.对于一些大数据行业就业信息的数据报 ...

最新文章

  1. 关于.net core http error 502.5 - process failure
  2. Apache JMeter 记一次使用HTTP工具POST提交JSON数据进行送积分高并发压测(二)
  3. 前端学习(1305):项目依赖
  4. 挖掘城市ip_企鹅号助力城市品牌IP化进程
  5. Python爬虫项目---批量下载深圳证券信息
  6. 反射机制在JDBC连接中的使用
  7. python怎么将txt转为excel_使用matlab或python将txt文件转为excel表格
  8. 什么?云数据库也能C位出道?
  9. VMware中安装linux系统(可视化界面centOS 7)
  10. win10显示rpc服务器不可用,win10系统RpC服务器不可用的详细办法
  11. 函数名或方法名前加下划线 python
  12. 用好工具,在团队协作中运筹帷幄
  13. html好看特效代码,教你制作漂亮的HTML代码特效贴
  14. 百度飞桨第一课--让人拍案叫绝的创意都是如何诞生的?
  15. selenium web录制(selenium_ide-2.9.1-fx.xpi和老版本火狐浏览器在最下方)
  16. C语言程序设计教程蒋清明,C语言程序设计教程(第2版)
  17. 微信小程序css设置本地背景图片
  18. memset 和 bzero的效率测试。
  19. 四十六、Fluent壁面函数的选取依据
  20. SMARTY安装与使用

热门文章

  1. MySql 安装 Win python3
  2. 聊聊我在美团做算法的感受
  3. 2021 年了,TensorFlow 和 PyTorch 两个深度学习框架地位又有什么变化吗?
  4. 深度学习TF—7.卷积神经网络CNN
  5. docker打包部署flask镜像
  6. 从零实现深度学习框架——过拟合与欠拟合
  7. 《linux核心应用命令速查》连载十:ps:查看权限
  8. 博文视点大讲堂第15期:猎头揭秘
  9. Secondary Namenode工作机制详解
  10. 递推关系中的数列通项