工作区(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