Git 简单使用指南
1. 介绍与安装
1. 简介
- 集中式版本管理系统
版本库是集中存放在中央服务器的,而大家工作的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始工作,工作完成,再把自己的修订推送给中央服务器
- 分布式版本管理系统
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的
修改推送给对方,就可以互相看到对方的修改了。
集中式(SVN) | 分布式(Git) | |
---|---|---|
是否有中央服务器 | 有。开发人员需要从中央服务器获得最新版本的项目然后在本地开发,开发完推送给中央服务器。因此脱离服务器开发者是几乎无法工作的 | 没有中央服务器,开发人员本地都有Local Repository |
网络依赖 | 必须要联网才能工作,而且对网络的依赖性较强,如果推送的文件比较大而且网络状况欠佳,则提交文件的速度会受到很大的限制。 | 分布式在没有网络的情况下也可以执行commit、查看版本提交记录、以及分支操作,在有网络的情况下执行 push 到 Remote Repository。 |
文件存储格式 | 按照原始文件存储,体积较大 | 按照元数据方式存储,体积很小 |
版本号 | 全局唯一的连续版本号 | 依据数据计算sha-1的40位哈希值,全球唯一 |
分支操作的影响 | 创建新的分支则所有的人都会拥有和你一样的分支 | 分支操作不会影响其他开发人员 |
提交 | 提交的文件会直接记录到中央版本库 | 提交是本地操作,需要执行push操作才会更新到主版本库 |
应用场景 | 当研发成本比较低,协作开发人数不多,开发人员对于版本管理的水平参差不齐的时候,或者对于代码的安全性要求更高一点的情况下适用 | 对于很多人参与开发,代码量比较大,或者高频次协作,跨公司,跨地域合作的情况下更适用 |
2. 安装
Git官网https://git-scm.com/downloads下载安装
2. 配置
1. 用户信息配置
- 配置用户名
git config --global user.name "your name"
- 配置用户邮箱
git config --global user.email "email@example.com"
2. 行为配置
- Windows系统下可能出现的警告
warning:LF will be replaced by CRLF in readme.txt # 这事windows可能显示的警告信息
- 命令设置
git config --global core.autocrlf false
git config --global core.safecrlf true
含义:
AutoCRLF
#提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true
#提交时转换为LF,检出时不转换
git config --global core.autocrlf input
#提交检出均不转换
git config --global core.autocrlf false
SafeCRLF
#拒绝提交包含混合换行符的文件
git config --global core.safecrlf true
#允许提交包含混合换行符的文件
git config --global core.safecrlf false
#提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
3. 使用方法
1. 工作原理![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7e35b049fc95191e5975103d16e6bc70.png)
- workspace:工作区,项目文件所在的文件夹里,统称为工作区。
- Index:暂存区(Stage),用来保存要提交到本地版本库的所有文件;相当于一个缓存区。
- Repository:版本库、本地仓库,一个简单的数据库;包含所有用来维护和管理的项目的修订版本和历史的信息。
- Remote:远程仓库
2. 命令介绍
- 本地仓库克隆
git clone git@xxx:/xxxxxx.git # url的格式:用户名@服务器地址:仓库路径
git remote add origin git@xxxx:/xxxxxx.git # 将本地已经存在的git仓库与创建的远程仓库关联
- 更新代码
cd xxxx # 切换到本地仓库目录
touch test.txt # 在本地仓库添加一个文件
echo test code > test.txt # 添加内容
git add -A # 添加未提交的文件到暂存区。add 后面可以跟文件名,多个文件用空格分开
git commit -m 'msg' # 提交文件到版本库(本地仓库);不加参数 -m 会进入默认编辑器,进行msg的编写
git push origin master # 推送文件到远程服务器。
git pull origin master # git pull <远程主机名> <远程分支名>:<本地分支名> 相当于git fetch和git merge两条指令
git fetch origin master
git merge origin/master # 这两个指令等同于上面的 git pull 指令
- 查看仓库状态
git status # 查看仓库状态
- 检查历史
git log # 查看本地仓库
git log origin/master # 查看服务器仓库
git reflog # 查看命令历史
- 文件比较
git diff test.txt # 查看文件修改内容
git diff HEAD "HEAD^" # 比较两个版本的不同,后面可以跟文件名参数
- 版本回退
git reset --hard "HEAD^" # 回退到上一个版本,git是用HEAD来表示当前分支中的当前版本,一个^表示上个版本
^^表示上两个版本,以此类推;但是如果要推到较早的版本需要使用HEAD@{版本号}
-
-mixed
- 默认项。修改版本库,修改暂存区,保留工作区,会清空暂存区的修改
-
-soft
- 修改版本库,保留暂存区,保留工作区。只需要commit即可恢复版本回退前的状态
-
-hard
- 修改版本库、修改暂存区、修改工作区。回退最彻底的一种方式
-
soft–软重置
软重置会将 HEAD 移至指定的提交(或与 HEAD 相比的提交的索引),而不会移除该提交之后加入的修改!
假设我们不想保留添加了一个 style.css 文件的提交 9e78i,而且我们也不想保留添加了一个 index.js 文件的提交 035cc。但是,我们确实又想要保留新添加的 style.css 和 index.js 文件!这是软重置的一个完美用例。
- hard–硬重置
有时候我们并不想保留特定提交引入的修改。不同于软重置,我们应该再也无需访问它们。Git 应该直接将整体状态直接重置到特定提交之前的状态:这甚至包括你在工作目录中和暂存文件上的修改。
- 撤销修改–三种场景
- 场景1:当你改乱了工作区的某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout --file 或者手动修改
- 场景2:当你不但改乱了工作区的某个文件的内容,并且还添加到了暂存区(即已经** git add** 了)时,想丢弃修改,分两步,第一步用命令** git reset HEAD file** ,这样回到了场景1,第二部再按照场景1操作即可
- 场景3:已经提交了不合适的修改到版本库(本地仓库)时,想撤销本次提交,可以使用版本回退,不过前提是没有推送到远程仓库
- 取回
git fetch origin master
-
如果你有一个远程 Git 分支,比如在 GitHub 上的分支,当远程分支上包含当前分支没有的提交时,可以使用取回。比如当合并了另一个分支或你的同事推送了一个快速修复时。
通过在这个远程分支上执行 git fetch,我们就可在本地获取这些修改。这不会以任何方式影响你的本地 分支:fetch 只是单纯地下载新的数据而已。
-
拉取
git pull origin master
-
尽管 git fetch 可用于获取某个分支的远程信息,但我们也可以执行 git pull。git pull 实际上是两个命令合成了一个:git fetch 和 git merge。当我们从来源拉取修改时,我们首先是像 git fetch 那样取回所有数据,然后最新的修改会自动合并到本地分支中。
-
分支
- 列出本地分支
git branch
- 查看远程分支
git branch -r
- 查看全部分支
git branch -a
- 创建分支
git branch dev # dev为创建的分支的名字,此命令创建分支后仍会停留在当前分支
- 删除分支
git branch -d dev # 删除dev分支,如果分支中有未merge的提交,那么分支会删除失败
此时使用 git branch -D dev:强制删除dev分支
- 分支改名
git branch -m oldname newname
- Checkout
- 操作文件
git checkout filename # 放弃单个文件的修改
git checkout . # 放弃当前目录下的修改
- 操作分支
git checkout master # 将分支切换到master主分支
git checkout -b dev # 如果分支存在则只切换分支,若不存在则创建分支并切换到dev分支
- 合并分支
git merge dev # 将分支dev合并到当前分支
如果我们想把 dev 合并到 master,就会出现一个合并冲突:你想要标题是 Hello! 还是 Hey!?
当尝试合并这些分支时,Git 会向你展示冲突出现的位置。我们可以手动移除我们不想保留的修改,保存这些 修改,再次添加这个已修改的文件,然后提交这些修改。
- 常用分支
3. 基本使用流程
- 将Git的一个存储库克隆为工作副本。
- 可以添加或修改工作副本。
- 操作完毕执行add命令将工作副本添加到暂存区。
- 如果愿意可以继续添加或修改工作副本并再次将修改添加到暂存区。
- 执行commit命令提交更改到本地仓库中。
- 如果确认没有问题,可以执行push命令将本地仓库的最新内容推送到远程仓库中去。