git从安装到使用

一、Git简介

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

Git 与 SVN 区别点:

    • 1、GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。

    • 2、GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。

    • 3、GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。

    • 4、GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。

    • 5、GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

二、下载Git及安装

这部分先用网上的下载方式,具体我是如何下载的我也忘了。

最新git源码下载地址:

https://github.com/git/git/releases

https://www.kernel.org/pub/software/scm/git/

Windows 平台上安装

在 Windows 平台上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行:

安装包下载地址:http://msysgit.github.io/

Windows 上安装 Git

完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。

在开始菜单里找到"Git"->"Git Bash",会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。

在Mac OS X上安装Git

在 Mac 平台上安装 Git 最容易的当属使用图形化的 Git 安装工具,下载地址为:

http://sourceforge.net/projects/git-osx-installer/

安装界面如下所示: 

18333fig0107-tn

三、Git 配置

用户信息

配置个人的用户名称和电子邮件地址:

$ git config --global user.name "runoob"
$ git config --global user.email test@runoob.com

文本编辑器

设置Git默认使用的文本编辑器, 一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可以重新设置::

$ git config --global core.editor emacs

差异分析工具

还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:

$ git config --global merge.tool vimdiff

配置别名

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit

git config --global alias.br branch
暂时就改这几个吧。

配置文件

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

   配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:

  查看配置文件   cat .git/config 

查看配置信息

要检查已有的配置信息,可以使用 git config --list 命令:

$ git config --list
http.postbuffer=2M
user.name=runoob
user.email=test@runoob.com

四、Git 创建仓库

mkdir learngit
$ cd learngit
git init 新建仓库名 回车

git add .  # 将当前目录添加到 git 仓库中, 使用 git add -A 则是添加所有改动的文档 
git commit  -m  "Initial commit" 
git remote add origin [github项目url地址]  # 设置仓库
修改远程仓库地址
1.修改命令
git remote origin set-url [url]
2.先删后加
git remote rm origin
git remote add origin [url]

修改远程仓库的名字
 git remote rename pb paul

然后把本地库的所有内容推送到远程库上: git push -u origin master  
  上面这个报错是由于没有pull过代码
要将远程仓库的代码push到本地,需要先将代码pull到远程仓库

  git pull的作用是,从远程库中获取某个分支的更新,再与本地指定的分支进行自动merge。完整格式是:

    $ git pull <远程库名> <远程分支名>:<本地分支名>  

  取回远程库中的develop分支,与本地的develop分支进行merge,要写成:

    git pull origin develop:develop 

  取回远程库中的develop分支,与本地的develop分支进行merge,要写成:

    git pull origin develop:develop  

  如果是要与本地当前分支merge,则冒号后面的<本地分支名>可以不写。

    git pull origin develop

  如果当前处于本地develop分支上,并且本地develop分支与远程的develop分支有追踪关系,那么远程的分支名可以省略:

    git pull origin

    

执行下面这段代码就ok了:git pull origin master --allow-unrelated-histories
然后再push:
git push -u origin master  

五、Git clone库

  git clone [github项目地址]
  

https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

  从远程仓库抓取数据  git fetch [remote-name]  此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。

  有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。一般我们运行git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。

六、Git操作

1.  git log 退出: 英文状态下按Q

  git log命令显示从最近到最远的提交日志, 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数

  我们常用 -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新: git log -p -2

  在做代码审查,或者要快速浏览其他协作者提交的更新都作了哪些改动时,就可以用这个选项。此外,还有许多摘要选项可以用,比如 --stat,仅显示简要的增改行数统计:git log --stat 

  但最有意思的是 format,可以定制要显示的记录格式,这样的输出便于后期编程提取分析,像这样:

    $ git log --pretty=format:"%h - %an, %ar : %s"

%H 提交对象(commit)的完整哈希字串

%h 提交对象的简短哈希字串

%T 树对象(tree)的完整哈希字串

%t 树对象的简短哈希字串

%P 父对象(parent)的完整哈希字串

%p 父对象的简短哈希字串

%an 作者(author)的名字

%ae 作者的电子邮件地址

%ad 作者修订日期(可以用 -date= 选项定制格式)

%ar 作者修订日期,按多久以前的方式显示

%cn 提交者(committer)的名字

%ce 提交者的电子邮件地址

%cd 提交日期

%cr 提交日期,按多久以前的方式显示

%s 提交说明

用 oneline 或 format 时结合 --graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况。在我们之前提到的 Grit 项目仓库中可以看到:

-p 按补丁格式显示每个更新之间的差异。

--stat 显示每次更新的文件修改统计信息。

--shortstat 只显示 --stat 中最后的行数修改添加移除统计。

--name-only 仅在提交信息后显示已修改的文件清单。

--name-status 显示新增、修改、删除的文件清单。

--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。

--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。

--graph 显示 ASCII 图形表示的分支合并历史。

--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

 

git log 还有许多非常实用的限制输出长度的选项,另外还有按照时间作限制的选项,比如 --since 和 --until。下面的命令列出所有最近两周内的提交:

      $ git log --since=2.weeks

    你可以给出各种时间格式,比如说具体的某一天(“2008-01-15”),或者是多久以前        

     (“2 years 1 day 3 minutes ago”)。

    还可以给出若干搜索条件,列出符合的提交。用 --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。

    (请注意,如果要得到同时满足这两个选项搜索条件的提交,就必须用--all-match 选项。)

    

-(n) 仅显示最近的 n 条提交

--since, --after 仅显示指定时间之后的提交。

--until, --before 仅显示指定时间之前的提交。

--author 仅显示指定作者相关的提交。

--committer 仅显示指定提交者相关的提交。

    eg:     git log --pretty="%h - %s" --author=gitster --since="2008-10-01" 

  

2. git last 不能用

3.基本快照: git add 命令可将该文件添加到缓存, 若添加到缓存之后又有改动。改动后我们在执行 git add 命令将其添加到缓存中

4.  若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用 git diff --cached 命令。

  Git 1.6.1 及更高版本还允许使用git diff --staged,效果是相同的,但更好记些。

    git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景。

    • 尚未缓存的改动:git diff
    • 查看已缓存的改动: git diff --cached
    • 查看已缓存的与未缓存的所有改动:git diff HEAD
    • 显示摘要而非整个 diff:git diff --stat

5. 跳过使用暂存区域: 只要在提交的时候,给 git commit 加上-a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

    git commit -am '修改 hello.php 文件'

6.移除文件:运行 git rm 记录此次移除文件的操作,如果删除之前修改过并且已经放到暂存区域的话,

  则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆.a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可:

$ git rm --cached readme.txt

后面可以列出文件或者目录的名字,也可以使用 glob 模式。比方说:

$ git rm log/*.log

注意到星号 * 之前的反斜杠 , 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜 杠。)。此命令删除所有log/ 目录下扩展名为 .log 的文件。类似的比如:

$ git rm *~

  会递归删除当前目录及其子目录中所有 ~ 结尾的文件。

7. git reset HEAD 命令用于取消已缓存的内容。现在两个文件修改后,都提交到了缓存区,我们现在要取消其中一个的缓存,操作如下:git reset HEAD -- hello.php 

  版本回退: git reset --hard HEAD^ 回到上一个版本,如果此时你还是想回到最新的版本:

     git reset --hard [版本号前几位]

  你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?git reflog用来记录你的每一次命令就可以找到版本号了。

8. git mv 命令用于移动或重命名一个文件、目录、软连接。

9.修改最后一次提交  

有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend 选项重新提交:

$ git commit --amend

如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交:

$ git commit -m 'initial commit'

$ git add forgotten_file

$ git commit --amend

上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。

   10.取消已经暂存的文件

    git reset HEAD readme.txt

    取消对文件的修改   git checkout -- readme.txt    

这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

   11.打标签

    列显已有的标签: git tag

    git tag -l 'v1.4.2.*'   列出v1.4.2开头的标签

    新建标签: Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。

轻量级标签就像是个不会变化的分支,实际上它就是个指向特 定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标 签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

含附注的标签: git tag -a v1.4 -m 'my version 1.4'     而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。

 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。

    签署标签: 如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即可:

      git tag -s v1.5 -m 'my signed 1.5 tag'

    轻量级标签: 轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字

       git tag v1.4-lw

    验证标签

      可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签,你需要有签署者的公钥,存放在 keyring 中,才能验证。

若是没有签署者的公钥,会报告类似下面这样的错误:

gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A

gpg: Can't check signature: public key not found

error: could not verify the tag 'v1.4.2.1'

    后期加注标签:: 提交历史中git log --pretty=oneline  可以在后期对早先的某次提交加注标签: git tag -a v1.2 9fceb02

    分享标签:git push origin [tagname] 

参考文档: http://blog.csdn.net/javafreely/article/details/18217273
      https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743862006503a1c5bf5a783434581661a3cc2084efa000
      http://www.runoob.com/git/git-branch.html

 
原文地址:https://www.cnblogs.com/cina33blogs/p/7606934.html