什么是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教程
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。