git status
命令可以查看仓库当前的状态。比如哪个文件被修改过,并且是否提交过。
git diff
具体文件名.后缀名命令可以查看某个文件修改前后的区别。
版本回退:
版本回退是有条件的,就是你还没有把自己的本地版本库推送到远程版本库。
在Git中,用HEAD
表示当前版本,也就是最新的提交,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
git log
命令显示从最近到最远的提交日志。在日志中,可以找到各个版本的commit id。
如,回退到上一个版本:
git reset --hard HEAD^
如果你回退到了某个版本,但后悔了又想恢复到新版本,可以用git reflog
命令用来记录你的每一次命令:
从中找到你想恢复的版本的commit id,使用命令git reset --hard commit_id
可以回退到该commit id的版本。
如:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
从输出可知,append GPL
的commit id是1094adb
。使用命令git reset --hard 1094adb
可以回退到该commit id的版本。
工作区和暂存区:
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
就是你的本地版本库所在的目录。
工作区有一个隐藏目录.git
,这就是Git的本地版本库。
暂存区(stage):
暂存区(stage)在Git的本地版本库中,同时版本库中还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
把文件添加到Git本地版本库中需要两步:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到本地版本库中的当前操作分支。
创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以默认情况下git commit
就是往master
分支上提交更改。
管理修改:
同其他版本控制系统相比,Git跟踪并管理的是修改而非文件。
每次修改后,只有git add添加到暂存区中后,git commit才会把修改提交到本地版本库分支。
删除修改:
如果你修改后,还没有git add到暂存区:
使用git checkout -- 文件名
可以丢弃工作区的修改。
命令git checkout -- readme.txt
意思就是把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之就是让这个文件回到最近一次git commit
或git add
时的状态。
如果你修改后,已经git add到了暂存区但还没有git commit:
用命令git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
如果你不但git add到了暂存区并且git commit到了版本库:
参见上面版本回退的操作。
删除文件:
在Git中,删除也是一个修改操作。
如果你提交了一个新文件到版本库,现在你想删除它:
你可以直接在文件管理器中把没用的文件删掉,或者用$ rm
文件名删除它。
此时使用git status
命令会立刻告诉你哪些文件被删除。
这时候有两种情况:
如果确实要从版本库中删除该文件,那就用命令git rm 文件名
删掉,并且git commit;
如果删错了,但版本库里还有该文件最近一次提交的版本,可以使用$ git checkout -- 文件名把误删的文件恢复到最近一次提交的版本。