重新学习git

一、git的起源

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

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

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

二、git优势

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

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

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

但是事实是吗??

谁说svn不能离线开?

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

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

此秋波来自 192.110.110.110

既然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-get install 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.githu...

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

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

2、配置

(1)、设置用户名称和邮箱 举个?
通过命令行
git config --global user.name "spademan" //设置用户名 
git config --global user.email "[email protected]" //设置邮箱

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

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

通过修改文件
全局的 gitconfig 存在 "~/.gitconfig"(用户目录下的.gitconfig)
某个项目的 gitconfig 存在 .git/config

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

[user]
name = nickname
email = [email protected]

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

(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

其他配置看详情

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 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
撤销操作

  • --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/w...

https://www.kancloud.cn/think...

https://git-scm.com/docs/git-...e";}

你可能感兴趣的:(git)