工作区(Working Directory)
就是你在电脑里能看到的目录,
版本库(Repository)
工作区有一个隐藏目录 .git ,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向 master 的一个指针叫 HEAD 。
初始化一个Git版本库
使用 git init 命令。
添加文件到Git版本库
分两步:
- 第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;(实际上就是把文件修改添加到版本库的暂存区;)
- 第二步,使用命令git commit,完成。(实际上就是把暂存区的所有内容提交到本地当前分支。)
版本退回
第一种:使用命令 git reset --hard commit_id 。
- 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。需要友情提示的是,你看到的一大串类似3628164...882e1e0的是commit id(版本号)
- 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
第二种 :在Git中, HEAD 指向的版本就是当前版本 ,也就是最新的提交 ,上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成 HEAD~100 。
例如:回退到上个版本
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
修改
commit 前可以用 git status 查看一下状态(工作区和暂存区里面修改的内容)。 每次修改,如果不 add 到暂存区,那就不会加入到 commit 中。
虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用 git diff 这个命令看看( 对比工作区和版本库的暂存区的内容 ):
撤销修改
场景1:
当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,
状态:
此时用git diff这个命令可以看到工作区和暂存区的不同,
此时用git status这个命令查看出对应文件有修改(文件显示为红色),
修改:
用命令git checkout -- file把版本库里的暂存区的修改内容恢复到工作区
场景2:
当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改(已经执行了git add 命令),
状态
此时通过git status查看出提交的修改文件(文件显示为绿色)
修改:
第一步用命令git reset HEAD file (从git仓库恢复当前版本到暂存区),就回到了场景1,第二步按场景1操作。
场景3:
已经提交了不合适的修改到当前分支时,想要撤销本次提交(已经执行了git commit命令),
修改:
参考版本退回一节,不过前提是没有推送到远程库。(这个是直接回退到之前的版本)
git checkout -- file 命令中的 -- 很重要,没有 -- ,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到 git checkout 命令。
删除
现在你有两个选择:
一是确实要从版本库中删除该文件,那就用命令 git rm <file> 删掉,并且 git commit : 现在,文件就从版本库中被删除了。
二是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git checkout -- file , 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
注:
git log 命令显示从最近到最远的提交日志 。 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file