重新学习 git

来自:spademan

一、git的起源

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

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

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

二、git优势

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

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

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

但是事实是吗??

谁说svn不能离线开?

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

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

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

  • git

    • 可以在本地随意创建或者切换分支,

    • commit代码到自己的本地仓库。

    • ....

  • svn

    • 可以在本地编辑代码(这么对比是不是很尴尬)

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

三、git使用

1、git安装

linux 上安装

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

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

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

mac 上安装

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

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

brew install git

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

windows上安装

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

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

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

2、配置

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

通过命令行

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

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

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

通过修改文件

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

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

[user]
name = nickname
email = nickname@gmail.com

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

(2)其他配置

设置别名

比如:

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

之后可以直接使用:

git last

设置主题

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

$ git config color.branch auto
$ git config color.diff auto
$ git config color.interactive auto
$ git config color.status auto

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

$ git config color.ui true

配置提交模板

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

模板内容举例:

// git-commit-template
时间:
新增:
修改:
删除:
分支:
执行人:
....

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

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

3、创建本地仓库

(1)、clone远程

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

(2)、本地创建

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

cd myproject
git init

(3)、其他参数

  • --local 表示clone的是本地的仓库

  • --shared 建立一个软链

  • --bare 复制一个裸版本(也就是没有包含工作区的内容)

  • --depth 复制到最后的第几个版本,如果项目过大可以设置这个避免复制时间过长

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

4、版本管理

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

  • 工作区:就是指我们本地工作目录,对我们本地仓库进行所有的增删改成操作只要还没有对该文件执行 git add/stage,那么所有的改动都还算是在工作区。

  • 缓存区:一个中间层,存在于工作区和版本库之间,工作区 git add/stage之后内容就更新到了缓存区。执行了 git commit之后,所有更新的内容都提交到了本地的版本库中。

  • 版本库:包含所有分支、历史版等等全部的信息。

  • 远程仓库:本地仓库执行 push之后能将本地仓库的信息更新到远程。

  • 信息更新流: 工作区->缓存区->版本库->远程版本库 (可以逆向更新)。

 

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

(2)、基本操作命令

git status

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

git add

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

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

git pull

git pullgit 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

撤销操作:

--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

//示例代码
git reset HEAD~2

// 配合参数使用
git reset --hard HEAD

// 也可以是commit id
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不支持文件级别的操作。

参考

  • https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137396287703354d8c6c01c904c7d9ff056ae23da865a000

  • https://www.kancloud.cn/thinkphp/git-github-study/37928

  • https://git-scm.com/docs/git-clone

推荐↓↓↓
开源最前线
上一篇:2018年11月份GitHub上最热门的开源项目 下一篇:想入门无服务器计算,从这7个开源平台开始