一、理解git工作原理
git与svn最大的不同之处,就是存在工作区与暂存区的概念,如下图:
工作区可以理解为我们需要提交文件的地方,版本库是.git文件,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。 HEAD指向某一个版本
我们知道提交修改文件是分两步执行的:
第一步是用git add test.txt
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit -m "第一次提交文件",
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改,且git commit是不会提交非暂存区的修改的。
二、git命令
把文件添加到暂存区:git add txt.test
提交文件:git commit -m "第一次提交文件" (-m写的是日志说明,记录这次提交是修改了什么,做一个说明)
查看仓库状态:git status (查看哪些文件有修改,未提交)
查看具体修改内容:git diff (顾名思义就是查看difference,显示的格式正是Unix通用的diff格式)
查看修改日志:
git log (会显示所有日志信息)
git log --pretty=oneline (显示简单的日志信息)
版本回退:
Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交1094adb...,
上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
git reset --hard HEAD^ (回退上一个版本)
cat test.txt (查看当前文件内容是不是回到上一个版本)
git reset --hard a9f63e9824c1a017eaaf47ba945d7b9e05a9d18f (回到某一个指定版本,后面一串字符串为commit ID)
当我们关了命令窗口,找不到commit ID时,又想回到某一个版本,可以用:git reflog ,这个命令记录了之前执行的每一次命令(查看历史命令)。
git checkout -- test.txt
意思就是,把test.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是test.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是test.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
上面的两种情况是如何撤销还没有添加到暂存区的修改或者添加暂存区后的修改,如果是撤销已经添加到暂存区的修改呢?
git reset HEAD test.txt (git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本)
当我们打印时,发现工作区还有修改,于是得重新执行:git checkout -- test.txt 来丢弃工作区的修改
总结:
1. 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
2. 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
3. 已经提交了不合适的修改到版本库时,想要撤销本次提交,则进行版本回退,不过前提是没有推送到远程库。
删除文件:
git rm test.txt
git commit -m "删除文件"