git入门
前言
掌握git命令是每个程序员必备的,至少在git还没退出大家视线的时间段,每个程序员都必须掌握它。因为之前我是用SVN的,所以很多git的命令都忘了,于是写了这篇博客。
git是什么
百度上是这么定义的
什么是版本控制呢?
想一想之前大学的毕业论文,是不是改了又改,其实这就是版本变更的真实写照。而版本控制就是对这些论文变更的管理控制。
什么是分布式
市面上的版本控制系统有很多,就像我在前言中说的svn就是一种版本控制系统。只不过SVN的版本控制是集中式的,而git的版本控制是分布式的
关于分布式版本控制系统,就是远程仓库同步所有版本信息到本地的每个用户。有下列三点:
- 用户在本地就可以查看所有的历史版本信息,但是偶尔要从远程更新一下,因为可能别的用户有文件修改提交到远程哦。
- 用户即使离线也可以提交,在push时才需要联网。
- 每个用户都保存了历史版本,只要有一个用户设备没问题,就可以恢复数据。
git的相关理论
git的四大工作区域
如图,展示的git的工作区
- Workspace:你电脑本地看到的文件和目录
- Index/Stage:暂存区,一般存放在.git目录下,就是.git/index,它又叫待提交更新区,用于临时存放你未提交的改动。比如你执行git add,这些改动就添加到这个区域了。
- Repository:本地仓库,你执行git clone 地址,就是把远程仓库克隆到本地仓库。他是一个存放在本地的,其中HEAD指向最新放入仓库的版本。当你执行git commit,文件改动就到本地仓库了
- Remote:远程仓库,就是类似GitHub,码云等网站提供的仓库,可以理解为远程数据交换的仓库。
git的工作流程
知道了git的四大工作区,来看看它是这么工作的把。不多bb,上图
git正向的工作流程:
- 从远程仓库(github,码云…)拉取文件代码
- 在工作目录。增删改查文件
- 把改动的文件放入暂存区
- 将暂存区的文件提交到本地文件
- 将本地仓库的文件推送到远程仓库
git文件的四种状态
根据一个文件是否已经加入版本控制,可以把文件分为:
- Tracked (已跟踪)
- Untracked(未跟踪)
而Tracked(已跟踪)又包括三种工作状态
- Unmodified
- Modified
- Staged
- Untracked:文件还没有加入到git库,还没有参与版本控制,即未跟踪状态。这时候的文件,通过git add 命令,可以变为Staged状态。
- Unmodified:文件已经加入git库,但是呢还没修改,就是说版本库中的文件快照内容与文件夹中还完全一致。Unmodofied的文件如果被修改,就会变成Modified。如果使用git remove移出版本库,则成为Untracked文件。
- Modified:文件被修改了,就进入modified状态啦。文件这个状态可以通过stage命令进入stage状态。
- Staged:暂存状态,执行git commit 则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodified状态。
一张图解释git工作原理
日常开发中,git基本常用命令
- git clone
- git checkout -b dev
- git add
- git commit
- git log
- git diff
- git status
- git pull / git fetch
- git push
git基本命令使用流程
git clone
当我们要进行开发时,第一步就是要克隆远程版本库到本地
git clone url 克隆远程版本库
git checkout -b dev
克隆完之后,开发新需求的话,我要需要新建一个开发分支,这里新建了一个dev分支
git checkout -b dev 创建开发分支dev,并切换到该分支下
git add
git add 使用格式
git add . 添加当前目录的所有文件到暂存区
git add [dir] 添加指定目录到暂存区,包括子目录
git add [file1] 添加指定文件到暂存区
有了开发分支后,我们就可以开发了。假设我们开发完了 helloWorld.vue,可以把它放到暂存区,命令如下
git add helloWorld.vue 把helloWorld.vue文件添加到暂存区
git commit
git commit 使用格式
git commit -m [message] 提交暂存区到仓库区,message为说明信息
git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库
git commit --amend -m [message] 使用一次新的commit,替代上一次提交
将helloWorld.vue文件添加到暂存区后,我们就可以提交到本地仓库了
git commit -m helloWorld.vue 把helloWorld.vue文件提交到本地仓库
git status
git status,表示查看工作区状态,使用格式
git status 查看当前工作区暂存区变动
git status -s 查看当前工作区暂存区变动,概要信息
git status --show-stash 查询工作区中是否有stash(暂存的文件)
当你忘记是否把代码添加到暂存区或者是否提交到本地仓库,都可以用git status看看哦~
git log
git log ,这个命令用来查看提交日志/提交历史
git log 查看提交历史
git log --oneline 以精简模式显示查看提交历史
git log -p <file> 查看指定文件的提交历史
git blame <file> 一列表方式查看指定文件的提交历史
git diff
git diff ,对比文件修改差异
git diff 显示暂存区和工作区的差异
git diff filepath filepath路径文件中,工作区与暂存区的比较差异
git diff HEAD filepath 工作区与HEAD ( 当前工作分支)的比较差异
git diff branchName filepath 当前分支的文件与branchName分支的文件的比较差异
git diff commitId filepath 与某一次提交的比较差异
git pull / git fetch
我们一般都会用git pull 拉取最新的代码看看,解决一下冲突,在推送到远程仓库
git pull 拉取远程仓库所有分支更新并合并到本地分支。
git pull origin master 将远程master分支合并到当前本地分支
git pull origin master:master 将远程master分支合并到当前本地master分支,冒号后面表示本地分支
git fetch --all 拉取所有远端的最新代码
git fetch origin master 拉取远程最新master分支代码
*注:有些小伙伴可能对使用 git pull 和 git fetch 有点疑惑,其实 git pull = git fetch + git merge 。pull的话,拉取远程分支并合并并与本地分支合并,fetch只是拉远程分支,怎么合并,可以直接选择。
git push
git push 可以推送本地分支,标签到远程仓库,也可以删除远程分支
git push origin master 将本地分支的更新全部推送到远程仓库master分支。
git push origin -d <branchname> 删除远程branchname分支
git push --tags 推送所有标签
git reset (版本回退)
git reset 的理解
git的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是master,HEAD指针一遍指向当前分支,如图:
假设执行了git reset,回退到版本二,版本三就不见了,如图:
git reset 的使用
git reset HEAD --file
回退暂存区里的某个文件,回退到当前版本工作区状态
git reset –-soft 目标版本号 可以把版本库上的提交回退到暂存区,修改记录保留
git reset –-mixed 目标版本号 可以把版本库上的提交回退到工作区,修改记录保留
git reset –-hard 可以把版本库上的提交彻底回退,修改的记录全部revert。
举个栗子,代码 git add 到暂存区,并未commit提交,可以这样退回,如下
git reset HEAD file 取消暂存
git checkout file 撤销修改
还有一个栗子,代码已经git commit 还没push
git log 获取到想要回退的commit_id
git reset --hard commit_id 想回到过去,回到过去的commit_id
如果代码已经push到远程仓库了,也可以使用reset回滚
git log
git reset --hard commit_id
git push origin HEAD --force