GIT的简单理解与常用命令总结
什么是git?
Git 是一个免费的开源分布式版本控制系统,它的设计目的是为了速度和效率的处理从小型到大型的项目;Git 可以帮我们管理我们的代码,记录历史,只要代码提交到 Git 上就永久不会丢失,可以随时 “穿越”(回到之前的某一个版本);可以多端共享,团队协作中,多个人操作了同一个文件时,可以实现自动合并(模块化,组件化)、标记冲突,拥有强大的分支管理系统。
Git 与 SVN 的区别
SVN:集中式,需要一台中央服务器,所有代码的拉取和提交都是在中央服务器,一旦中央服务器或者网络出现故障,则不能拉取和提交代码,需要不断去备份中央服务器,防止代码丢失。
Git:分布式,有一个中央服务器的同时,每个开发者本地都有自己的本地仓库,拥有完整的版本库,不用担心代码丢失,Git 存储的是代码变化的快照,更新代码的速度要比 SVN 更快。
Git 工作区、暂存区和版本库
- 工作区: 就是你在电脑里能看到的目录。
- 暂存区: 英文叫
stage, 或index。一般存放在".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。 - 版本库: 工作区有一个隐藏目录
.git,这个不算工作区,而是Git的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。
图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
git基本操作
工作区上的操作命令
提交
- 提交工作区所有文件到暂存区:
git add . - 提交工作区中指定文件到暂存区:
git add <file1> <file2> ...; - 提交工作区中某个文件夹中所有文件到暂存区:
git add [dir];
撤消
- 删除工作区文件,并且也从暂存区删除对应文件的记录:
git rm <file1> <file2>; - 从暂存区中删除文件,但是工作区依然还有该文件:
git rm --cached <file>; - 取消暂存区已经暂存的文件:
git reset HEAD <file>...; - 撤销上一次对文件的操作:
git checkout --<file>。要确定上一次对文件的修改不再需要,如果
想保留上一次的修改以备以后继续工作,可以使用stashing和分支来处理; - 隐藏当前变更,以便能够切换分支:
git stash; - 查看当前所有的储藏:
git stash list; - 应用最新的储藏:
git stash apply,如果想应用更早的储藏:git stash apply stash@{2}
重新应用被暂存的变更,需要加上--index参数:git stash apply --index; - 使用
apply命令只是应用储藏,而内容仍然还在栈上,需要移除指定的储藏:git stash drop stash{0};如果使用pop命令不仅可以重新应用储藏,还可以立刻从堆栈中清除:git stash pop;
撤销修改
a. 撤销工作区的修改,不影响缓存区
$ git checkout -- [file1] [file2] $ git checkout -- .
b. 撤销缓存区的修改,将修改内容放回工作区,与工作区后期修改合并(clean 或者合并2处修改)
$ git reset HEAD xxx(文件名) $ git reset HEAD .
“储藏”和“恢复”工作现场
$ git stash $ git stash list 查看 $ git stash apply stash内容并不删除 $ git stash pop 恢复的同时把stash内容也删了 $ git stash drop (.......)
暂存区上的操作命令
提交文件到版本库
- 将暂存区中的文件提交到本地仓库中,即打上新版本:
git commit -m "commit_info"; - 将所有已经使用git管理过的文件暂存后一并提交,跳过add到暂存区的过程:
git commit -a -m "commit_info"; - 提交文件时,发现漏掉几个文件,或者注释写错了,可以撤销上一次提交:
git commit --amend;
查看信息
- 比较暂存区与上一版本的差异:
git diff --cached; - 指定文件在暂存区和本地仓库的不同:
git diff <file-name> --cached; - 查看提交历史:
git log;参数-p展开每次提交的内容差异,用-2显示最近的两次更新,如git log -p -2;
tag标签
- 创建标签:
git tag <name> - 创建带有说明的标签:
git git tag -a <标签名> -m "<注释>" - 查看标签:
git tag - 删除本地标签:
git tag -d <标签名>
远程操作
- 推送代码到远程:
git push - 获取远程分支:
git fetch origin <分支名> - 删除远程分去名:
git push origin --delete <远程的分支名> - 推送标签到远程:
git push origin <标签名> - 删除远程标签:
git push origin --delete <标签名>
【注】本文章借鉴了网上一些文章,系统学习可以参考廖雪峰GIT教程