一、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";}