一、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 “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
其他配置看详情
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 pullgit 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”;}