以learngit测试项目为例,介绍git使用,".../"代表上级目录
以learngit测试项目为例,".../"代表上级目录
- 新建learngit文件夹作为项目根目录
- 进入learngit目录
$ git init命令创建git项目,返回Initialized empty Git repository in .../learngit/.git,就说明成功了
NOTE! 不要修改自动生成的.git文件,那是git用来跟踪管理版本库的!
git只能跟踪文本文件的修改历史,可以具体到哪一行加了什么单词,但图片啦、word文档啦(二进制文件)只能记录修改时间和改动前后的文件大小
- 在learngit下写个README.md,实际上项目根目录下的任意子目录都可以
git add [file]添加文件
git add README.md
git commit提交到仓库,-m "Comment"参数提交说明
git commit -m "wrote a readme file."
git会告诉我们几个文件改了,插入了几行内容
add一次只能加一个文件,而commit一次能添加数个文件,因为它只是说明性步骤
git status 能输出当前repo的状态,比如有没有修改需要提交?提交的修改有没有注释?
git diff 查看上次修改的具体内容
所以提交修改和添加文件步骤是一样的,先add 再commit,中间活用status和diff来掌握repo状态
每次git提交了修改都有一个commit id,相当于版本号,它是一串十六进制代码,通常前7位就足够指示了
git log查看版本提交历史,确定id,嫌多用--pretty=oneline简化输出git reset --hard commit_id来回退到某一个id的版本,也可以用HEAD指针HEAD指针是git特有的,永远只想最新更新的版本,
HEAD^则是倒数第二个版本的id,HEAD^^就是倒数第三个,HEAD~n就是倒数第n+1个版本(上n个版本)git reflog能查看历史命令,获取回退前的id,回退之后后悔了,可以用它回到未来,同样,回到未来也用git reset ...
- 工作区(Working Directory):git项目的根文件夹,比如learngit这个项目的
learngit/文件夹 - 版本库(Repository):工作区下有一个
.git目录,比如learngit/.git/,是Git的版本库。版本库之下有暂存区(stage)、第一个分支master、指向master的HEAD指针- 暂存区(Stage):
git add之后暂时保存的地方 master分支:新建Git版本库时自动创建的第一个分支HEAD指针:
- 暂存区(Stage):
- 修改工作区文件,比如修改
learngit/README.md git add README.md添加修改到暂存区(Stage)git commit ...提交暂存区(Stage)的修改到版本库(Repo),这时就有了新的版本号
如果 "第一次修改--> git add --> 第二次修改 --> git commit" 那么对于版本库(Repo)来说,只有第一次修改进入了版本库,因为第二次修改没有git add,也就没能进入暂存区,而git commit只能添加暂存区的内容
被这样一层一层提交的是对文件的修改,而非文件本身,所以Git管理的是修改,而不是文件。
可以用如下命令来比较WD、Stage和Repo三者的状态:
# 比较WD和Stage
git diff [filename]
# 比较WD和Repo的HEAD commit
git diff HEAD -- filename
git status:只能比较当前WD(分支多的话叫Working tree,也就是当前分支树)和HEAD commit的区别,能找出新增的文件,但没有详细细节
git diff:能比较的对象很多,可以是WD和Stagev之间,WD和Repo里的任意一个commit之间,不同commit之间等等,而且能列出修改详情。直接输入git diff,默认比较WD和Stage的区别。但不能列出新增文件,而且不能列出新增文件