03节的时候我们已经成功地添加并提交了一个readme.txt文件,现在,我们继续修改readme.txt文件。运行git status
命令看看结果:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
.classpath
.project
.settings/
bin/
src/
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt
被修改过了,但还没有准备提交的修改。Untracked files列出还没有跟踪的文件。
虽然Git告诉我们readme.txt
被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt
,所以,需要用git diff
这个命令看看:
图中可看到很多乱码,这是readme.txt编码问题,可以用Notepad++等工具把它变成UTF8,这时可以看到:
知道了对readme.txt
作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add readme.txt
执行完之后再执行git status,便可看到:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
此时可以看到readme.txt文件在待提交中,第二步是git commit -m xxxx。
这是正常的提交,但有时候我们会不小心删错了文件或改坏了文件,此时,我们还是可以恢复到修改前的某个commit状态的,首先通过git log命令查看提交的历史。
$ git log
commit cd7519f910527bea01181226d83bd59c03d9e159 (HEAD -> master)
Author: wudiyong <774695423@qq.com>
Date: Sun Nov 25 15:18:40 2018 +0800
第6次提交
commit 425a952a81acf2e2bd549b40519af3be021debf0
Author: wudiyong <774695423@qq.com>
Date: Sun Nov 25 15:17:47 2018 +0800
第5次提交
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交cd7519f910527bea01181226d83bd59c03d9e159
上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
注意,这里是本地版本库(本地仓库)的回退,并不是工作区修改撤销,也不是远程仓库的回退。假设我们要把本地仓库从第6次提交回退到第5次提交,则可以执行git reset --hard HEAD^
命令,执行该命令后,HEAD便指向第5次提交的位置,工作区的内容也恢复到第5次提交的内容。如果执行git reset --hard HEAD,则HEAD指向位置不变,但工作区还是会恢复到HEAD指向的位置内容。我们还可以继续执行git reset --hard HEAD^继续往前回退。
回退到第5次提交后,再执行git log命令查看提交历史,此时第6次提交的记录已经不在了,假如我们回退错了,想恢复到第6次提交,怎么办?
如果命令窗口还没关掉的话,可以往前滚,找到第6次提交的id,也就是cd7519f910527bea01181226d83bd59c03d9e159,
然后执行命令:git reset --hard cd7519f
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。此时第6次提交的内容又回来了。
假如窗口已经关了,找不到要恢复的提交的id,这种情况也是可以恢复的,Git提供了一个命令git reflog
用来记录你的每一次命令,里面可以看到每一次操作的记录:
$ git reflog
425a952 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
cd7519f HEAD@{1}: reset: moving to cd7519f91
425a952 (HEAD -> master) HEAD@{2}: reset: moving to HEAD
425a952 (HEAD -> master) HEAD@{3}: reset: moving to HEAD^
cd7519f HEAD@{4}: reset: moving to HEAD
cd7519f HEAD@{5}: reset: moving to HEAD
cd7519f HEAD@{6}: reset: moving to HEAD
cd7519f HEAD@{7}: commit: 第6次提交
425a952 (HEAD -> master) HEAD@{8}: commit: 第5次提交
3b985ac HEAD@{9}: commit: xsss
a597a2e HEAD@{10}: commit: xxxxx
2f8dd17 HEAD@{11}: commit (initial): 首次提交
上面的操作只提交到本地仓库,还需要用命令git push推送到远程仓库,如果还没配置远程仓库地址,执行git push会报错:
$ git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using
git remote add <name> <url>
and then push using the remote name
git push <name>