新仓库初始化
运行git init
来初始化仓库
它会创建一个隐藏的文件夹.git
文件的添加和提交
在这个文件夹里面创建一个today.txt的文件。
这时使用git status
来查看有什么变化。
它告诉我有一个还未追踪的文件,并提示我可以使用git add <file>...
把它加进去,执行git add -A,
再次使用git status
。
状态变了,说明add成功。再看看它的提示Changes to be committed,也就是说现在可以执行commit了。注意,只有被add到暂存区的更新才会被提交进入repo。提交前,如果对WorkSpace的文件进行修改,而没有被添加到暂存区,那么提交进repo中的只是暂存区的更新,WorkSpace修改的部分不会提交进repo中的。
执行git commit -m "提交信息"
将文件提交到repository里。提交信息用英文的双引号括起来。
这时运行git log
就可以看到提交的记录了,git log
显示内容依次是:
- 此次提交对应的版本号
- 提交人:姓名 邮箱
- 提交的时间
- 提交版本修改的内容:就是我们
commit -m "xxx"
里的xxx
文件的修改
接着修改文件内容。
我们用git status
看看有什么变化。
这和之前的提示不一样了。之前是这个。
比较一下就会看到,之前的是添加新文件,当时文件还没被追踪(untracked),而这次是更改已经追踪(tracked)的文件。现在我们通过git看看文件做了哪些变化,执行git diff
它默认跟最新的一个commit进行比较。红色(前面有减号-)表示删除,绿色(前面有加号+)表示添加。因此,在git看来,我们是删除了原来那一行,并添加了新的两行。这在文件内容特别多的时候效果比较明显。当然,我们也可以把WorkSpace中的状态和repo中的状态进行diff,命令如下:git diff HEAD~n
,这个命令在以下情况可以使用:
- 你忘记改了什么,又想知道。
- 别人发给你新版本,你想知道更改了什么。
假如我现在想撤销这些更改,执行git checkout -- .
(git add之前)就行了。
执行git status
看看,上一个status的提示已经不见了。再来看看文件,已经复原了,那么再次进行修改。
1
2
git add -A
git commit -m "将[自己]改为[米娜桑]"
用git log
看看提交(commit)记录。
现在有两个提交了。
版本回退
现在试着将文件回退到第一个commit时的状态。从刚才的git log
我们看到两行黄色部分是以commit开头的,后面接着一串字符。这一串字符是16进制的数,是一串哈希值。我们叫它版本号就行了。开始回退,执行git reset --hard 1df0573
(取版本号前7位就可以了)。
这里提示HEAD已经更改指向至1df0573了。此时文件内容已经回到第一个版本的状态。这里文件的修改日期被更改为现在的时间 2016\6\2 19:29,这是由于文件的修改日期是由Windows修改的,因为它检测到这个文件被修改了。而我们刚才从最新版本回退到现在这个版本,就像是我们手动修改了文件内容一样,事实上是由git来完成的。现在再执行git log
。
新版本的commit记录不见了,这就是reset --hard
的力量,那怎么回到最新版呢?先执行git reflog
。
可以看到HEAD的变化情况。第一行表示当前HEAD所在的版本号是1df0573,而之所以在这个版本号,是由于我们执行了reset命令。看第二行,它告诉我们,这个HEAD所在的版本号是ad93b89,这个版本号是在执行commit之后形成的。此时我再用一次reset,git reset --hard ad93b89
,将HEAD指向ad93b89, 同时查看log。
回到第一次reset前的状态了。
清除未追踪的文件
现在看看如何用命令删除新加的文件。首先手动创建个文件,用来演示。
用checkout是没办法删除掉它的,使用git clean -xf
。
这个命令的杀伤力比较大,它删除当前目录下所有没有track过的文件。不管它是否是.gitignore文件里面指定的文件夹和文件。