一.工作区、暂存区、和版本库
- 工作区:能看到的目录
- 暂存区:交给git管理的文件
- 版本库:master等分支,用于控制版本
- 本地仓库:存放本地的文件
- 远程仓库:存放远程文件
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中
二.基本操作
Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,其流程如下
说明:
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:或本地仓库
- remote repository:远程仓库
1.配置Git
首先在本地创建ssh key;
$ ssh-keygen -t rsa -C "your_email@youremail.com"
后面的your_email@youremail.com
改为你在github上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/
下生成.ssh
文件夹,进去,打开id_rsa.pub
,复制里面的key
。
在github账号内添加SSH Key,内容就是上面复制的key
显示当前git信息
$ git config -l
2.上传
1.创建本地仓库
git init
2.把文件夹放入暂存区
git add .
3.提交到本地仓库
git commit -m "提示信息"
4.连接远程仓库
git remote add origin <server> //origin为远程仓库的名称 server为远程仓库链接
5.真正提交到远程仓库
git push -u repository master
3.下载
克隆到本地,直接下载到本地,或者使用下面命令
git clone 链接
4.分支
- 查看所有分支.
git branch -a
- 创建一个叫做"feature_x"的分支,并切换过去:
git checkout -b feature_x
- 切换回主分支:
git checkout master
- 删除本地分支
git branch -d feature_x
- 删除远程分支
git push origin -d feature_x
5.分支与合并
- 获取远程仓库
git pull //其实是fetch之后再合并,但是一般还要手动merge
git fetch repository
- 然后合并
git merge repository/分支
- 在合并改动之前,你可以使用如下命令预览差异
git diff <branch1> <branch2>
6.远程仓库操作
以github作为远程仓库操作流程,gitee也一样,如果同时要关联两个远程仓库,他们的名字不能一样
- 本地Git仓库和GitHub仓库通过SSH加密连接
$ ssh-keygen -t rsa -C "youremail@example.com"
后面的 your_email@youremail.com 改为你在 Github 上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。
成功的话会在 ~/ 下生成 .ssh 文件夹,进去,打开 id_rsa.pub,复制里面的 key。
回到 github 上,进入 Account => Settings(账户配置)。把key加入到SSH中
- 添加远程仓库
git remote add [repository] [url]
- 查看当前的远程仓库
git remote #执行时加上 -v 参数,你还可以看到每个别名的实际链接地址。
- 提取远程仓库
git fetch #从远程仓库下载新分支与数据
git merge #从远端仓库提取数据并尝试合并到当前分支
- 推送到远程仓库
git push [alias] [branch]
- 删除远程分支
git remote rm [别名]
- 修改远程仓库名
git remote rename old_name new_name # 修改仓库名
7.杂项
- 命令用于查看在你上次提交之后是否有对文件进行再次修改。
git status #-s 显示变更的文件名
- 比较文件的不同
git diff #比较缓冲区和工作区的差异
git diff --cached #比较已缓存的改变
git diff [branch1] [branch2] #比较两次提交之间的差异
- 回退版本
git reset HEAD^ # 回退所有内容到上一个版本
git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
- HEAD 表示当前版本
- HEAD^ 上一个版本
- HEAD~0 表示当前版本
- HEAD~1 上一个版本
- HEAD^2 上上一个版本
简而言之,执行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存
- 删除文件
git rm <file> #将文件从暂存区和工作区中删除 -f 强制删除
git rm --cached <file> #只删除缓存区的文件