git学习笔记
背景介绍
特点
- git分布式的版本控制系统;
- 是用C语言开发的;
- CVS、SVN为集中式;
集中式分布式区别
集中式
- 集中式中央服务器负责存储;
- 每次开发前都要从中央服务器中 clone 源码;
- 必须联网才能工作;
- 中央服务器宕机,源码若无备份就完蛋;
分布式
- 可以没用中央服务器;
- 中央服务器只是方便交换文档;
- 一人宕机,可以从其余分支处直接 clone 一份源码;
- 无需联网也能工作;
基本指令
git init :将目录变成git可管理的仓库
创建工程文件夹,并进入文件夹,讲目录变成git可管理的仓库。
lius@pix:~$ mkdir testgit
lius@pix:~$ cd testgit/
lius@pix:~/testgit$ pwd
/home/lius/testgit
lius@pix:~/testgit$ git init
初始化空的 Git 仓库于 /home/lius/testgit/.git/
lius@pix:~/testgit$
初始化之后,实际testgit目录下多了一个 .git 的隐藏文件夹,是 git 用来跟踪管理版本的,千万不要去修改里面的文件。
版本控制系统,只能跟踪文本文件的改动(xx文件第n行增加/删除了什么),图片、视频等二进制文件每次改动,只知道文件发生了变化知道发了哪些变换。
git add :将文件添加到仓库
git add file1.txt file2.txt
# 或者使用*通配符
git add *
# 或者使用.通配符
git add .
两个通配符没有任何的区别,就是使用形式不一样。使用通配符会将工作时所有的变化存放到暂存区,包括所有修改和新建的文件,但不包括已经被删除的文件。
git commit :将文件提交到仓库
- m 添加本次提交的说明,方便以后查找,非常有意义!!
-m 可以不加,不加会跳到文件中,直接编辑文件内容,文件的内容就是mark。
# -m直接添加注释
git commit -m "This is mark"
# 不用-m,到文件中添加注释
git commit
commit是把所有add的文件都提交。
git log :查看commit的历史记录(回到历史)
注意,这个是commit的记录,如果回到之前版本,这个版本之后的commit都将不会在此命令中显示。
例如,版本顺序如下,最后一个版本为E:
A→B→C→D→E
我从E版本回到C,则 git log 显示的历史记录如下:
A→B→C
具体操作如下:
# 查看所有内容
git log
# 只显示一行
git log --pretty=oneline
git reflog :查看历史的命令/版本号(回到未来)
此处每一次执行git commit,git reset等命令时的版本号,帮助恢复到之前的版本。
执行 git reflog之后的输出如下,最前方的是版本号,之后是执行的命令。
lius@pix:~/gittest/zxf$ git reflog
5abdc6e HEAD@{0}: reset: moving to 5abdc
bab3c40 HEAD@{1}: reset: moving to bab3
5abdc6e HEAD@{2}: reset: moving to 5abdc
bab3c40 HEAD@{3}: reset: moving to HEAD^^
5abdc6e HEAD@{4}: commit: version 1.2
7f68583 HEAD@{5}: commit: version 1.1 add headfile
bab3c40 HEAD@{6}: commit (initial): version 1.0
git reset - -hard HEAD^ :返回之前的版本
重要,实现回到过去,回到未来版本的指令!!!
HEAD的不同含义:
HEAD HEAD^ HEAD^^ HEAD~n
当前版本 上一个版本 上上个版本 往上n个版本
HEAD也可以被替代成log显示的版本号(没必要写全,几位唯一确定就可)
# HEAD
git reset --hard HEAD~2
# 版本号
git reset --hard 1094ab
常见的操作失误
- 空的文件夹无法被add, 所以任何空的文件夹删除了就只能自己新建;
- 可以执行以下指令看一看:
mkdir test
git add test # 或者git add *
git status # 会显示是干净的分支
- 删除文件要用 git rm < 文件夹/文件名 > , 不能使用通配符!
不要用以下指令
# 如果要删除 aaa/xxx xxx为文件名, aaa为文件夹名
# 删除时正常使用 git rm aaa/xxx
# 不要使用下面的通配符
git rm * # 这样删除不成功
# 会提示未提供 -r 选项不会递归删除 'aaa'
# 如果你认为下面的指令能删除 'aaa' 和 'aaa/xxx', 你就错了
# 它会把所有文件都删除!!!!
git rm -r *