原标题:重新学习 git
一、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检测是否已经安装了:
$ 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 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/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137396287703354d8c6c01c904c7d9ff056ae23da865a000
https://www.kancloud.cn/thinkphp/git-github-study/37928
https://git-scm.com/docs/git-clone
责任编辑: