zoukankan      html  css  js  c++  java
  • (大数据工程师学习路径)第三步 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的字样。

  • 相关阅读:
    day7 面向对象 静态方法 类方法 属性方法 类的特殊成员方法 元类 反射 异常处理
    day6 面向对象 封装 继承 多态 类与实例在内存中的关系 经典类和新式类
    day5 time datetime random os sys shutil json pickle shelve xml configparser hashlib subprocess logging re正则 python计算器
    kafka常用操作命令
    linux基础
    django学习1——初识web应用程序
    mysql数据库(三)——pymysql模块
    mysql数据库(二)——表的查询
    mysql数据库(一)
    Python常用模块——re模块
  • 原文地址:https://www.cnblogs.com/yangxiao99/p/4715362.html
Copyright © 2011-2022 走看看