# Git安装
## Linux
`sudo apt-get install git`命令安装Git
## Windows
[官网下载](https://git-for-windows.github.io/) 安装即可,不赘述。
注:安装时注意一步:选择第二项,将git添加到path中。
# 创建版本库
1. 创建项目文件夹,例如:demo
2. 进入demo目录下:`git init`命令将这个目录变成git可以管理的仓库(repository)。将仓库建好后,仓库目录下会多了一个.git隐藏文件夹。可以用`ls -ah`查看隐藏文件。
3. 向库里添加一个`readme.txt`文件:
4. `git add`告诉git,要把文件添加到仓库:
~~~
git add readme.txt
~~~
执行命令,其实,这一步的作用就是将文件添加到stage(暂存区)。
* `git add .`将所有文件添加到暂存区。
* `git add -u`将所有文件添加暂存区,同时,将删除的文件从仓库中删除。
5. `git commit`命令,将文件提交到仓库。
~~~
git commit -m "wrote a readme file"
~~~
注:`-m`是对本次提交的说明,不该偷懒省去。
6. `git status`查看当前版本库的状态。
7. `git diff`显示具体的尚未缓存的改动记录。
8. `git log`记录每次`commit`的信息。`git log --pretty=oneline`将每次`commit`的记录打印成一行,内容精简。
9. `git reset`修改命令:
* `git reset HEAD`废除这次修改记录,当前文件回到上一次提交的状态。
* `git reset --hard [commit id]
10. `git rm`慎用。这个命令会将所有版本库记录删除。
# 远程仓库
创建SSH Key。在类似`C:\Users\xiang_000\.ssh`这样的主目录下,查看是否有`id_rsa`和`id_rsa.pub`文件。如果有了,直接可以将公钥添加到github账户上。如果没有,打开Shell(windows下的Git Bash):
~~~
ssh-keygen -t rsa -C "youremail@example.com"
~~~
`id_rsa.pub`是公钥,可以放心的告诉任何人。
在github的Account settings里,Add SSH Key。
## 从远程库克隆
如果从零开发,推荐的方式是先在github上创建远程仓库。然后,从远程库克隆。
在github创建名为:`learngit`的新仓库。勾选添加`README.md`。
`git clone`克隆一个本地库:
~~~
git clone git@github.com:michael728/learngit.git
~~~
## 添加(关联)远程库
建完本地库,又想在github创建一个git仓库,让两个仓库进行远程同步。
在github创建新的repo,名字为:demo
根据github的提示,在本地的`demo`仓库下运行命令:
~~~
git remote add origin git@github.com:michae728/demo.git`
~~~
* 请千万注意,把上面的`michae728`替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
* 添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
将本地库的所有内容推送到远程库上:
~~~
git push -u origin master
~~~
把当前分支`master`推送到远程。由于之前远程库是空的,第一次推送`master`分支时,加上了`-u`参数。git不但把本地的`master`分支内容推送到远程新的`master`分支,还会把本地`master`分支和远程的`master`分支关联起来,以后推送或者拉取就可以简化命令。
从现在起,本地提交,可通过命令:
~~~
git push origin master
~~~
# 分享与更新项目
## `git push`:
* `git push origin dev`表示提交到远程的dev分支。
* 通常在本地的dev分支推送到远程的dev分支,注意两地分支命名要相同,保证不发生混乱
## `git pull`:
* `git pull origin dev`表示拉远程dev分支到本地,并和本地dev分支合并
`git fetch`(不常用):
* `git fetch origin dev`表示拉远程dev分支到本地,但是,不和本地dev分支合并
## `git remote`:
* `git remote add github git@github.com:michael728/test.git`将本地仓库推送到github上名为test的仓库里
# 分支管理
## 创建于合并分支
创建`dev`分支,然后切换到`dev`分支:
~~~
git checkout -b dev
~~~
相当于下面两条命令:
~~~
git branch devgit checkout dev
~~~
`git branch`命令用于查看当前分支。当前分支前面会有`*`:
* `git branch`查看本地分支
* `git branch -a`查看本地和远程所有分支
* `git branch -r`查看远程分支
* `git branch -d`删除本地分支
* `git push :origin dev`删除远程`dev`分支
* `git checkout master`命令用于`dev`分支完成工作后,切换回`master`分支。
`git merge`用于本地的指令。如果当前分支是master,本地另一个分支是`dev`,用下面命令将分支合并到master:
~~~
git merge dev
~~~
# 后悔药
## 版本回退
`git log`来查询历史记录。`git log --pretty=oneline`显示精简信息。
git中,`HEAD`表示当前版本,上一个版本就是`HEAD^`,上上个版本`HEAD^^`,上100个版本,写成`HEAD~100`。
回到上一个版本:
~~~
git reset --hard HEAD^
~~~
或者通过`git reset --hard [commit id]`回到指定版本号的版本。
git版本的回退速度很快,因为git内部有个指向当前版本的`HEAD`指针。git仅仅是通过修改`HEAD`指向就可以完成版本切换的工作。
`git reflog`用来查看命令历史。通过这个,就可以查到之前的版本号啦!
## 工作区和暂存区
工作区(Working Directory)
例如我们创建的`demo`文件夹,他就是一个工作区。
版本库(Repository)
工作区有一个隐藏目录`.git`,这个不算工作区,它是git的版本库。
git的版本库里存了很多东西,最重要的是称为`stage`的暂存区,还有git为我们自动创建的第一个分支`master`,以及指向`master`的一个指针叫`HEAD`。
![](http://ww2.sinaimg.cn/large/6d9475f6jw1eyr4eiqsbsj20dm07bt94.jpg)说明:
* `git add`实际上就是把文件修改添加到暂存区;
* `git commit`提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建爱你git版本库是,git自动为我们创建了唯一一个`master`分支,所以,现在`git commit `就是往`master`分支上提交更改。(因为以后还有可能往分支上提交啊!)
~~~
+ `git status`可以查看状态。如果有文件从来没有被添加过,那么它的状态是:`Untracked`。 + 提交成功后,如果没有对工作区做任何修改,那么工作区就是`working directory clean`
~~~
## 管理修改
1. `git diff HEAD -- README.md` 命令查看工作区和版本库里最新版本的区别。
## 撤销修改
分为两种情况的修改:
修改了工作区某个文件的内容,想直接丢弃修改:
~~~
git checkout -- filename
~~~
注:`--`前后都有空格。
当修改了工作区内容,同时,添加到了暂存区,分两步:
* 用命令`git reset HEAD filename`,回到场景1
* 用场景1的方法操作。
## 删除文件
当删除了工作区的文件,git知道删除了文件,因此,工作区和版本库就不一致。`git status`命令会立刻告诉那些文件被删除了。有两个选择:
1. 确实要从版本库里删除该文件,用命令`git rm fimename`,之后`git commit`提交。
2. 误删,因为版本库里还有,可以很轻松的把误删的文件恢复到最新版:`git checkout -- filename`
注:`git checkout`其实是用版本库里的东西替换工作区的版本。无论工作区是修改还是删除,都可以一键还原。
- PHP学习
- PHP应用
- PHP函数总结整理
- 39个对初学者非常有用的PHP技巧
- 深入浅出之Smarty模板引擎工作机制
- 数组操作
- file操作的常用方法
- PHP字符串输出之Heredoc说明
- require(_once)和include(_once)的理解
- PHP提高效率的几点
- php无限遍历目录
- 53个要点提高PHP编程效率
- THINKPHP
- THINKPHP 常见的问题
- 微信
- 微信公众号接口
- 微信小程序开发资料收集
- 微信小程序开发:MINA
- 通过微信小程序看前端
- 微信小程序开发初体验
- 微信小程序 Demo(豆瓣电影)
- API应用
- 支付宝
- 二维码转换
- 前端开发
- HTML5
- CSS
- 七种css方式让一个容器水平垂直居中
- JavaScript
- JavaScript奇技淫巧44招
- JavaScript笔记
- 后端开发
- Node
- SQL数据库
- 服务维护
- git使用
- Git入门私房菜
- MAC终端维护
- VIM命令大全
- 开发规范
- 智能手机屏幕的秘密
- 超实用六步透视网易设计规范(附完整PDF下载)
- UI设计常用字体规范
- APP界面切图命名和文件整理规范
- 网页UI视觉设计规范
- ios视觉设计规范说明
- 开发APP时需要注意的原则
- 移动端APP设计初步入门
- Axure
- 基础操作
- 基础1-10
- 基础11-20
- 基础21-30
- 基础31-40
- 基础41-50
- 基础51-60
- Sketch
- 软件使用
- sublime3_用户设置
- sublime下如何修改自动补全 后lang=zh-cn?
- 运营理念
- 新人指导心得体会
- 从一次活动设计,聊聊交互设计师的3个阶段
- 详情页优化那些不得不说的细节
- 店铺装修浅析
- 淘宝店铺装修之宝贝详情页的布局教程
- 宝贝详情页 客户需求调研及总结
- 宝贝描述样板房