git使用1--起步和基础

一:git 起步

1. 分布式版本控制系统

2. git关注文件数据整体是否发生了变化

3. git大多数操作访问本地文件和资源

4. 在保存到git前,所有的数据都要checksum,并将此作为数据的标识。所以在修改了文件或目录后,git会察觉。会发现传输不完整的数据和磁盘损坏导致的数据丢失。

5. git文件的三种状态:已提交committed、已修改modified、已暂存staged

已提交表示文件安全地保存到本地数据库中;已修改表示文件已做修改,但还未提交;已暂存表示将已修改的文件放入下次提交的清单中。

6. git中文件流转的三个区域:git的工作目录、暂存区域以及本地仓库。

暂存区域是一个简单文件,一般放在工作目录中。git工作目录是每个项目都会有的,保存元数据和对象数据库。

在工作目录中修改某些文件、将修改的文件进行快照保存到暂存区域中,将暂存区域中的文件永久转储到工作目录中。

7. centos7下git的安装

1)使用git命令查看是否有git

2)安装:yum install git

3)配置:git config

  用来读取或配置相关的工作环境变量。这些环境变量决定了git在各个环节的工作方式和行为。这些变量存储在下列3个区域中:

    /etc/gitconfig文件:系统中对所有用户都普遍适用的配置。使用git config时的--system选项就读写这个文件。

    ~/.gitconfig文件:用户目录下的配置文件只适用于该用户。若使用git config时用--global选项,读写的就写这个文件。

    当前项目的git目录中的配置文件(也就是工作目录中的.git/config文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config里的配置会覆                          盖/etc/gitconfig中的同名变量。

  配置用户信息:会在提交时随更新内容一起被永久纳入历史记录。

    git config --global user.name "ggboy"

    git config --global user.email ggboy@gg.com

  如果用了--global选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认这里配置的用户信息。如果要在某个特定的项目中使用其它名字或者邮件,只要去掉--global           选项重新配置即可,新的设定保存在当前项目的.git/config 文件里。

  设置默认的文本编辑器:默认是vim或vi

    git config --global core.editor emacs

  设置差异分析工具:在解决合并冲突时使用哪种差异分析工具。比如使用vimdiff

    git config --global merge.tool vimdiff

  查看配置信息:

    git config --list

  直接查看某个环境变量的设定,加上特定的名字:

    git config user.name

 

二:git 基础

1. git 取得项目的仓库

可以在现存的目录下,通过导入所有文件来创建新的git仓库; 另一种是从已有的git仓库克隆出一个新的镜像仓库来。

1)在工作目录中初始化新仓库:

要对现有的某个项目开始用git 管理,只需到此项目所在的目录,执行:

  git init

初始化后,在当前目录下会出现一个名为.git的目录,所有git需要的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里面所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。

如果当前目录下有几个文件想要纳入版本控制,需要先用git add命令告诉git开始对这些文件进行跟踪,然后提交:

  git add *.c

  git add README

  git commit -m 'initial project version'

现在得到了一个实际维护着若干文件的git仓库。

2)从现有仓库克隆

把开源项目的git仓库复制出来,需要使用 git clone 命令。git收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。实际上,即使服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时的状态。

克隆仓库的命令格式为 git clone [url] 。如

  git clone git://github.com/schacon/grit.git

这会在当前目录下创建一个名为grit的目录,其中包含一个.git的目录,用于保存下载下来的所有版本记录,然后从中取出最新版本的文件拷贝。如果进入这个新建的grit目录,你会看到项目中的所有文件已经在里边了,准备好后续的开发和使用。

如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:

  git clone git://github.com/schacon/grit.git mygrit

唯一的差别就是,现在新建的目录成了mygrit,其它和上边一样。

git支持许多数据传输协议。如git://协议,还可以用http(s)://或者user@server:/path.git 表示SSH传输协议。

2. git 记录每次更新到仓库

现在我们有了一个真实项目的git仓库,并从这个仓库中去除了所有文件的工作拷贝。接下来,对这些文件作些修改,在完成了一个阶段的目标之后,提交本次更新到仓库。

工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪。跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新的,已修改或者已放入暂存区。而所有其它文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。

初始克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。在编辑过某些文件之后,git将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件,如此重复。

3. git 查看提交历史

查看历史,可以使用 git log 命令查看。

默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。历史记录中每次提交的信息,在commit后面都有一个SHA-1校验和,然后有作者名字和电子邮件地址、提交时间,最后缩进一个段落显示提交说明。

git log 有许多选项可以帮助你搜寻感兴趣的提交,接下来介绍最常用的。这些选项可以一起使用。

  -p 选项:展开显示每次提交的内容差异;

  -# 选项:#表示一个数字,显示最近#次的更新;

有时单词层面的对比,比行层面的对比,更加容易观察。git 提供了 --word-diff 选项。我们可以将其添加到 git log -p 命令的后面,从而获取单词层面上的对比。

git log 还提供了许多摘要选项可以用,比如 --stat ,仅显示简要的增改行数统计

  git log --stat

还有个常用的 --pretty 选项,可以指定使用完全不同于默认格式的方式展示提交历史。比如用oneline将每个提交放在一行显示,这在提交数很大时非常有用。另外还有 short, full 和 fuller 可以用,展示的信息或多或少有些不同。

  git log --pretty=oneline

--pretty=format:可以定制要显示的记录格式,这样的输出便于后期编程提取分析,像这样:

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

具体占位符查看:https://www.w3cschool.cn/isrekq/rigk5ozt.html

(作者和提交者之间的区别,作者指的是实际做出修改的人,提交者指的是最后将此工作成果提交到仓库的人。)

用 oneline 或 format 时结合 --graph 选项,可以看到开头多处一些ASCII字符串表示的简单图形,形象地展示了每个提交所在的分化衍合情况。

git在输出所有提交时会自动调用分页程序(less),要看到更早的更新只需翻到下页即可。

另外还有按照时间作限制的选项,比如 --since 和 --until 。下面的命令列出所有最近两周内的提交:

  git log --since=2.weeks

还可以给出搜索条件,列出符合的提交。用 --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。(注意,如果要得到同时满足这两个选项搜索条件的提交,就必须用 --all-match 选项。否则,满足任意一个条件的提交都会被匹配出来)

另一个真正实用的 git log 选项是路径(path),如果关心某些文件或者目录的历史提交,可以在 git log 选项的最后指定它们的路径。因为是放在最后位置上的选项,所以用两个短划线隔开之前的选项和后面限定的路径名。

git的图形化工具:gitk

4. git 撤销操作

修改最后一次提交:

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

  git commit --amend

此命令将使用当前的暂存区域快照提交。如果刚才提交完没有任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。

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

  git commit "cjj"

  git add README

  git commit --amend

取消已经暂存的文件:

如果我们不小心将文件cjj加入到了暂存区,git add cjj

可以用 git reset HEAD cjj 将文件cjj取消暂存。

取消对文件的修改:

git checkout --<file>

这条命令忽略掉git目录中对指定文件所做的所有修改。(即放弃变动,回到旧版本)

5. 远程仓库的使用

要参与任何一个git项目的协作,必须要了解如何管理远程仓库。远程仓库是指托管在网络上的项目仓库,可能有好多个,有读写权限之分。

推送拉取数据,分享工作进展。添加远程库、移除废弃的远程库、管理各式远程库分支、定义是否跟踪这些分支,等等。

1)查看当前的远程库

要查看当前配置有哪些远程仓库,可以用 git remote 命令,它会列出每个远程库的简短名字。在克隆完某个项目后,至少可以看到一个名为 origin 的远程库, git默认使用这个名字来标识你所克隆的原始仓库。

也可以加上 -v 选项( --verbose 的简写),显示对应的克隆地址:

  git remote -v

2)添加远程仓库

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname] [url]

  git remote add pb git://github.com/paulboone/ticgit.git

现在可以用字符串pb指代对应的仓库地址了。比如说,要抓取所有xyy有的,但本地仓库没有的信息,可以运行 git fetch pb

  git fetch pb

3)从远程仓库抓取数据

可以用下面的命令从远程仓库抓取数据到本地:

  git fetch [remote-name]

此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。

如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。

默认情况下 git clone 命令本质上就是自动创建了本地的master分支用于跟踪仓库中的master分支(假设远程仓库确实有master分支)。所以一般运行 git pull ,目的都是要从远端仓库中抓取数据后,合并到工作目录中的当前分支。

4)推送数据到远程仓库

项目进行到一定阶段,要同别人分享目前的成果,可以将本地仓库中的数据推送到远程仓库。

实现这个任务的命令很简单:git push [remote-name] [branch-name]。如果要把本地的master分支推送到origin服务器上,可以运行下面的命令:

  git push origin master

只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。

5)查看远程仓库信息

我们可以通过命令 git remote show [remote-name] 查看某个远程仓库的详细信息,比如要看所克隆的origin仓库,可以运行:

  git remote show origin

6)远程仓库的删除和重命名

可以用 git remote rename 命令修改某个远程仓库在本地的简称,比如想把 pb 改成 cjj ,可以这么运行:

  git remote rename pb cjj

注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的 pb/master 分支现在成了 cjj/master .

碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库,可以运行 git remote rm 命令

  git remote rm cjj

6. git 打标签

git可以对某一时间点上的版本打上标签。人们在发布某个软件版本的时候,经常这么做。

1)列显已有的标签:

列出现有标签的命令非常简单,直接运行 git tag 即可

显示的标签按字母顺序排列,所以标签的先后并不表示重要程度的轻重。

我们可以用特定的搜索模式列出负荷条件的标签。在git自身项目仓库中,有着超过240个标签,如果只对1.4.2系列的版本感兴趣,可以运行下面的命令:

  git tag -l 'v1.4.2.*'

2)新建标签

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

含附注的标签:

创建一个含附注类型的标签非常简单,用 -a 指定标签名字即可

  git tag -a v1.4 -m 'my version 1.4'

-m 选项指定了对应的标签说明,git会将此说明一同保存在标签对象中。如果没有给出该选项,git会启动文本编辑软件供你输入标签说明。

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

  git show v1.4

签署标签:

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

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

现在再运行 git show 会看到对应的GPG签名也附在其中:

  git show v1.5

轻量级标签:

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

  git tag v1.4-lw

验证标签:

可以使用 git tag -v [tag-name] 的方式验证已经签署的标签。此命令会调用GPG来验证签名,所以你需要有签署者的公钥,存放在keyring中,才能验证:(verify)

  git tag -v v1.4.2.1

若是没有签署者的公钥,会报告错误。

后期加注标签:

可以在后期对早先的某次提交加注标签。

如果在之前提交文件时忘了在此项目打上标签,之后也可以做。只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)即可:

  git tag -a v1.2 9fceb02

分享标签:

默认情况下, git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:

  git push origin v1.5

如果要一次推送本地新增的标签上去,可以使用 --tags 选项:

  git push origin --tags

现在,其他人克隆共享仓库或拉取数据同步后,也会看到这些标签。

 7. git技巧和窍门

1)自动补全

如果使用的是Bash shell,可以试试看git提供的自动补全脚本。

 2)git 命令别名

git 不会推断你输入的几个字符将会是哪条命令,不过如果想偷懒,少敲几个命令的字符,可以用 git config 为命令设置别名;

  git config --global alias.co checkout

  git config --global alias.br branch

如果现在要输入git checkout只需键入 git co 即可;

 使用这种技术还可以创造出新的命令,比如取消暂存文件时的输入比较繁琐,可以自己设置一下:

  git config --global alias.unstage 'reset HEAD --'

 

原文地址:https://www.cnblogs.com/cjj-ggboy/p/12501180.html