创建版本库
切换到相应目录下, git init 把这个目录变成Git可以管理的仓库,目录下多了一个.git
的目录,这个目录默认是隐藏的,用ls -ah
命令就可以看见。
git status 查看仓库状态。
git diff + file 查看修改内容。
git add(后面解释)
git commit -m ""(后面解释)
commit
可以一次提交很多文件,所以你可以多次add
不同的文件
每提交一个新版本,实际上Git就会把它们自动串成一条时间线。
git log (--pretty=oneline)
命令查看commit历史,可以看到每一次提交的版本号。
版本回退
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
git reset --hard HEAD^
reset命令有3种方式:
1:git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
2:git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
3:git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到之前版本时,再想恢复到原先版本,就必须找到原先版本
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
终于舒了口气,第二行显示append GPL
的commit id是3628164
,现在,你又可以乘坐时光机回到未来了。
工作区(Working Directory)
就是你在电脑里能看到的目录,比如项目文件夹就是一个工作区。
版本库(Repository)
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行
git commit
就可以一次性把暂存区的所有修改提交到分支。
管理修改
Git管理的是修改,而不是文件。用git diff HEAD -- file
命令可以查看工作区和版本库里面最新版本的区别。
撤销修改
1. 改了代码,还没add。那么可以手动去删,但是改太多不记得了,git checkout -- file
可以丢弃工作区的修改。
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令。
2. add了没commit。
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
git reset HEAD file
3. commit了, 没push。
那就是版本会退了。
删除文件(在本地删了文件)
1. 确实要删除。用命令git rm
删掉,并且
git commit。
2. 删错了。 git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
关于分支
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master
分支。HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,HEAD
指向的就是当前分支。
在新的dev分支工作。
合并dev的到master分支。
git checkout -b dev
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
git branch
命令查看当前分支。
git merge
命令用于合并指定分支到当前分支。
删除分支:git branch -d <name>。
git pull 拉取代码。
关于push到远程库,重开一篇记录。