1. Git
为什么要用Git
假如有这样一个场景:比如我们要提交一份工作总结,我们将其命名为,工作总结.txt。第二天,我们被要求修改这份总结,但当我们要修改这份总结的时候,我们要保存昨天的版本,防止改得更糟。但是为了防止命名冲突,我们不得不把之前的工作重命名为,工作总结_01.txt,而本次命名为工作总结_02.txt。假设我们在以后要不停地修改......
这就会出现许多文件,它们是同一个内容的不同版本。然而,这样很不好做管理,且不优雅。为了解决类似的一个问题,Linus写了Git,最初用于管理Linux内核代码,现在是世界上最流行的版本管理工具了。
Git简介
Git是一种分布式版本控制系统。
- 分布式:分布式版本控制就是每个人可以创建一个独立的代码仓库用于管理,各种版本控制管理都可以在本地完成。将备份代码和记录完全独立在本地存储,当你想将代码恢复到某一个版本的时候,本地版本控制不需要依赖网络就可以完成此操作。
- 版本控制:对文件的变更管理。
好处:方便多文件多版本管理,协同开发,防止文件丢失。
Git安装和配置
首次使用之前,配置自己的用户名和邮箱:
git config --global user.name <username>
git config --global user.email <email>
Git中的相关概念
Git本地数据管理,大致可分为三个部分,工作区,暂存区和版本库。
-
工作区(Working directory)
我们直接编辑的地方
-
暂存区(Stage or Index)
数据暂时存放的地方,可以在工作区和版本库之间进行数据的友好交流
-
版本库(Commit History)
存放已提交的数据,“版本“
Git本地操作
- 帮助文档
git help <command>
1.初始化仓库,选择需要作为仓库的文件目录
git init
这样就新建好一个空仓库(会生成.git的一个目录)
- 查看工作区、暂存区状态
git status
- 添加到暂存区
git add <filename>
git rm --cached <filename> #从暂存区删除
- 提交到本地库
git commit -m "commit message"
- 查看提交历史
git log [options]
git reflog #显示可引用的历史版本记录
- 删除文件
git rm <filename> # git rm 只是在暂存区删除了,并没有提交
git commit
7.对版本进行后退
本质:对HEAD指针进行操作
git reset <commit>将Git仓库的HEAD回退到某个版本,清空暂存区,但不修改目录中的文件git reset --hard <commit>前进,后退版本- 使用^符号:只能往后退,
git reset --hard HEAD^后退一步(几个^就回退几步) - 使用~符号,
git reset --hard HEAD~<步数>后退版本
reset命令的三个参数对比:
- --soft: 仅在本地库移动HEAD指针
- --hard: 在本地库移动HEAD指针,重置暂存区、重置工作区
- --mixed: 在本地库移动HEAD指针,重置暂存区(默认参数)
- 对比文件差异
git diff <filename>比较当前目录文件和暂存区文件中的差异git diff <commit> <filename>和本地库某个版本进行比较git diff <commit> <commit> <filename>比较两个历史提交版本中某文件的差异
- 分支操作
git branch -v # 查看所有分支
git branch <banch> # 创建分支
git branch -d <branch> # 删除分支
git branch -m <oldname> <newname> # 重命名分支
git checkout <branch> # 切换分支
git checkout -b <branch> # 创建并切换分支
分支合并:站在被合并的分支上
git checkout <branch>
git merge <branch>
解决冲突:删掉git的标记提醒,然后手动修改文件到满意的情况,然后git add,再git commit
gitignore
有一些文件,或者一些更改,我们是不想进行提交的。比如构建的文件目录,二进制文件等,这时候在.gitignore文件中写入这些文件或者目录,git不会追踪这些文件。 常用的项目模板:github.com/github/giti…
gitattributes
用于设置文件属性,一般用于设置行尾转换、字符编码等等一系列属性。正常情况下,Git默认的设置都能够使我们达到要求,也能够自动识别文件,不需要单独使用gitattributes进行指定。