git教程--廖雪峰--https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
1、
版本库=仓库=repository
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
工作区,暂存区,当前分支
mkdir first
cd first
git init 就会把目录变成仓库,而且是空的仓库(empty Git repository)
产生一个.git文件,是Git来跟踪管理版本库的,没事别乱改
ls -ah 可以查看隐藏的.git目录
只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外
而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
Unix的哲学是“没有消息就是好消息”
把一个文件放到Git仓库
git add readme.txt //添加readme.txt文件到“暂存区”,
use "git add <file>..." to update what will be committed
git add . //添加所有文件到“暂存区”
git commit -m “信息” //把“暂存区的文件”提交到仓库,原子性的提交
git status //跟踪仓库当前的状态
git diff readme.txt //查看readme.txt文件上次修改了什么
提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别:
git log //可以查看历史commit的东西,命令显示从最近到最远的提交日志
你看到的一大串类似3628164...882e1e0的是commit id(版本号)
是一个SHA1计算出来的一个非常大的数字,用十六进制表示
git reset //把当前版本“append GPL”回退到上一个版本“add distributed”
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed //指定回到未来某个版本 果然,我胡汉三又回来了。前提是没有推送到远程库。
git reset --hard 3628164
HEAD is now at 3628164 append GPL
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL
git reflog //Git提供了一个命令git reflog用来记录你的每一次命令:
而LICENSE还从来没有被添加过,所以它的状态是Untracked。
git checkout —— readme.txt //Git会告诉你,git checkout -- file可以丢弃工作区的修改:(checkout其实是用版本库里的版本替换工作区的版本)
$ git checkout -- readme.txt
用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
git rm readme.txt
git commit -m "fix"
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt. //git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。