一、git的起源

因为linux的开发者不想花钱,给 ​cvs​​、 ​svn​​等等类似的版本管理平台自己搞了一个 ​git​​, 其实中间还有个小插曲,就是 ​BitKeeper​曾免费授权给他们用,但是他们没有遵守协议,然后才被收回免费使用权。

毕竟咱都是写代码的人,我怕你?

所以两周后git出生了,并在 2008 ​github​上线。

二、git优势

版本管理一般分分布式和集中式

相对分布式开发还有集中式开发,代表就是 ​svn​。

一说到分布式开发,很多人都想说,我 ​git​​不需要联网就能开发,你 ​svn​可以吗?!就问你怕不怕。

但是事实是吗??

谁说svn不能离线开?

我只要不提交,我都能删库跑路,别说开发。

还有谁说git不需要联网?不需要联网怎么协同是不是难道用的是秋波?

既然git 和svn都能本地不联网开发,也都是需要联网才能协同工作,那么他们具体的区别在哪里呢?

  • git
  • 可以在本地随意创建或者切换分支,
  • commit代码到自己的本地仓库。
  • ....
  • svn
  • 可以在本地编辑代码(这么对比是不是很尴尬)

所以说,svn想要想git那种操作,是需要联网的,不管是局域网还是非局域网 都是要网 ,要网,要网~!

三、git使用

1、git安装

linux 上安装

安装之前先输入 ​git​检测是否已经安装了:

  1. $ git
  2. The program 'git' is currently not installed. You can install it by typing:
  3. sudo apt-get install git

如果出现以上这句话,直接在命令行执行 ​sudo apt-getinstall git

mac 上安装

(1)、通过网址下载安装 http://git-scm.com/download/mac。

(2)、通过homebrew的方式安装(前提是先安装好homebrew)

  1. brew install git

注意:linux和unix系统都可以通过 安装 ​oh-my-zsh​​的插件 这个插件会自动安装 ​git​。

windows上安装

通过下载安装包吧 。https://git-for-windows.github.io

其他方式没弄过也不想弄。毕竟我是不喜欢windows的。

接下来如果不特别指出是windows,那就是linux和unix系统。

2、配置

(1)设置用户名称和邮箱

通过命令行

  1. git config --global user.name "spademan" //设置用户名
  2. git config --global user.email "646028751@qq.com" //设置邮箱

--global​ 加上参数会印象整个电脑的所有项目,所以慎用,假如有多个git账号的话。

如果需要设置某个特定项目的话 去掉 ​--global​参数 并且需要进入某个项目里面。

通过修改文件

全局的 ​gitconfig​​ 存在 ​"~/.gitconfig"(用户目录下的.gitconfig​​中某个项目的 ​gitconfig​​ 存在 ​.git/config​ 中

通过文本编辑器打开他们就能看到:

  1. [user]
  2. name = nickname
  3. email = nickname@gmail.com

相关信息,修改并且保存即可。

(2)其他配置

设置别名

比如:

  1. git config --global alias.last 'cat-file commit HEAD'

之后可以直接使用:

  1. git last

设置主题

所有的 ​color.*​​选项请参见 ​git config​的文档。

  1. $ git config color.branch auto
  2. $ git config color.diff auto
  3. $ git config color.interactive auto
  4. $ git config color.status auto

或者你可以通过 ​color.ui​选项把颜色全部打开:

  1. $ git config color.ui true

配置提交模板

  1. git config commit.template '/etc/git-commit-template'

模板内容举例:

  1. // git-commit-template
  2. 时间:
  3. 新增:
  4. 修改:
  5. 删除:
  6. 分支:
  7. 执行人:
  8. ....

弊端是不太好用,因为需要用到vim。

其他配置[看详情][1]

3、创建本地仓库

(1)、clone远程

  1. git clone git://github.com/your/repositories.git '本地目录'
  2. // 本地目录是可选的,没有本地目录就是当前目录

(2)、本地创建

先在本地创建一个目录比如 ​myproject​:

  1. cd myproject
  2. git init

(3)、其他参数

  • --local 表示clone的是本地的仓库
  • --shared 建立一个软链
  • --bare 复制一个裸版本(也就是没有包含工作区的内容)
  • --depth 复制到最后的第几个版本,如果项目过大可以设置这个避免复制时间过长

如果使用了depth之后 想要重新 pull以前的相关信息可以执行 ​git pull--unshallow​。

4、版本管理

(1)工作区、暂(缓)存区、版本库、远程的概念

  • 工作区​​:就是指我们本地工作目录,对我们本地仓库进行所有的增删改成操作只要还没有对该文件执行 ​​git add/stage​​,那么所有的改动都还算是在工作区。
  • 缓存区​​:一个中间层,存在于工作区和版本库之间,工作区 ​​git add/stage​​之后内容就更新到了缓存区。执行了 ​​git commit​​之后,所有更新的内容都提交到了本地的版本库中。
  • 版本库​:包含所有分支、历史版等等全部的信息。
  • 远程仓库​​:本地仓库执行 ​​push​​之后能将本地仓库的信息更新到远程。
  • 信息更新流: 工作区->缓存区->版本库->远程版本库 (可以逆向更新)。

 【Git】68-重新学习 git_版本库

小疑问:存在跨去传递信息的吗? 比如工作区的内容能直接更新到版本库吗?

(2)、基本操作命令

git status

查看当前工作区的信息,比如当前所在 ​分支​​, 当前工作区中有多少 ​更改、删除的文件​​ 以及 ​尚未追踪的文件``和远程分支相比落后多少个版本​等等之类的信息。

【Git】68-重新学习 git_git_02

git add

将增、删、改文件的相关信息添加到缓存区。默认情况下之后添加 ​非忽略​​文件,如果需要添加忽略文件 需要设置 ​--force​参数。

可以添加某单个文件也可以执行 ​git add.​添加全部文件。

git pull

git pull​​是 ​git fetch​​ + ​git merge FETCH_HEAD​ 的缩写。所以,默认情况下,git pull就是先fetch,然后执行merge 操作,如果加–rebase 参数,就是使用git rebase 代替git merge。

git commit

将 ​暂存区​​或者 ​工作区​的信息更新到版本库。

不是说 ​工作区​​要先提交到 ​暂存区​​才能再从 ​暂存区​​更新到 ​版本库​​的吗?为什么这里的描述能直接把 ​工作区​​的内容更新到版本库。那是因为 commit 有语法糖的写法 比如 ​commit-a​​ 表示执行了 ​git add​​之后再执行 ​git commit​。

并且注意, ​git commit-a​​只能将当前目录下的跟踪文件添加到缓存区, ​git add.​能将当前目录下所有文件提交到缓存区。

常用参数:

  • -a​​ 表示将当前目录下所有 ​​跟踪文件​​提交到暂存区
  • --amend​​ 表示修改最近一次提交的 ​​message​
  • --date​ 设置提交时间

(3)、撤销操作git reset

撤销操作:

【Git】68-重新学习 git_git_03

【Git】68-重新学习 git_版本库_04

--soft​:暂存区和工作区不会被更新。

重置 ​HEAD​​到另外一个 ​commit​​,但也到此为止。 ​工作区​​和 ​缓存区​都是保持本来的样子。

--mixed​:暂存区会更新至指定的commit,工作区不会收到影响。

这是默认的选项。默认选项,将 ​缓存区​​的数据更新成指定的commit那样, ​工作区​没有影响。

--hard​:暂存区和工作区同时更新到指定的commit。

强制更新选项, ​缓存区​​和 ​工作区​都更新成指定的commit那样。

这是一个比较危险的动作,具有破坏性,数据因此可能会丢失!如果真是发生了数据丢失又希望找回来,那么只有使用: ​git reflog​​ 命令了。makes everything match the commit you have reset to。你的所有本地修改将丢失。如果我们希望彻底丢掉本地修改但是又不希望更改branch所指向的commit,则执行 ​git reset--hard​​ = ​git reset--hard HEAD​。

  1. //示例代码
  2. git reset HEAD~2
  3. // 配合参数使用
  4. git reset --hard HEAD
  5. // 也可以是commit id
  6. git reset --hard commitId

git checkout

git checkout head^​ 切换分支:

这个命令实际上是将 ​HEAD​​指向另外一个分支,并且将 ​工作区​​更新到那个分支,如果工作区的更新可能会丢失,git会强制你将这些更新 ​提交​​或者是 ​stash​(一般都是不同分支更改了相同的文件就会引起这个提示)。

如果想强制切换使用 ​--force​ 参数(是一个危险的操作)。

git checkout-b​ 切换并新建分支:

如果该分支已经存在可以使用 ​-B​强制重置该分支为最新分支。

git checkout xxx​ 切换某个文件:

可以将 ​某个分支​​或者某个指定的 ​commit​​的 ​某个文件​checkout到本地来。

切换到某个commit:

在查看工程的某个旧版本的时候,这个命令是很有用的。但是,没有分支指向当前的HEAD,所以分支会处于detached状态。此时加入新的commit会是非常危险的,因为如果切换到其他的分支后,将没有办法回到这次的commit。出于这个原因,在提交commit到detached HEAD之前,应该新建一个分支。

git

传入git reset和git checkout的参数决定了它们的作用域。参数中不包含文件路径的话,这两个命令就作用于整个commit。我们将会讨论这样的操作。注意git revert不支持文件级别的操作。

参考

【Git】68-重新学习 git_git_05