Git基本操作指令
工作区和暂存区
Git管理的文件分为:工作区(本地的文件夹),版本库(.git文件夹),版本库又分为暂存区stage和暂存区分支master(仓库)
工作区>>>>暂存区>>>>仓库
git add把文件从工作区>>>>暂存区,git commit把文件从暂存区>>>>仓库
git diff查看工作区和暂存区差异
git diff --cached查看暂存区和仓库差异
git diff HEAD 查看工作区和仓库的差异
git add的反向命令git checkout,撤销工作区修改,即把暂存区最新版本转移到工作区
git commit的反向命令git reset HEAD,就是把仓库最新版本转移到暂存区
管理修改
Git跟踪并管理的是修改,而非文件
现在有一个文件a.txt
你修改了a.txt
,并使用git add a.txt
把它存进了暂存区
此时你又对a.txt
进行了修改
然后使用git commit
进行了提交
Git管理的是修改,当你用git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
提交后,用git diff HEAD -- a.txt
命令可以查看工作区和版本库里面最新版本的区别:
撤销修改
丢弃工作区文件的修改
如果你在本地工作区修改了某个文件,但是你突然不想要这些修改了,你可以通过git checkout -- file
命令来撤销修改,他会撤销你的所有修改
存在两种情况,首先假设你要撤销的是a.txt
- 如果a.txt在你修改前已经从工作区被添加到暂存区了,此时你修改完了以后,要进行撤销,那就会被撤销回到暂存区的状态
- 如果a.txt没有被添加到暂存区,那就会被回退到版本库的最新状态
总的来说,就是会回退到最近的一次git commit
或git add
时的状态
丢弃暂存区文件的修改
如果你改了a.txt文件的内容,并git add进暂存区了,此时你想把暂存区的修改撤销掉(unstage),可以用git reset HEAD <file>
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
shell
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.txt
$ git reset HEAD a.txt
Unstaged changes after reset:
M a.txt
$ 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: a.txt
$ git checkout -- a.txt
$ git status
On branch master
nothing to commit, working tree clean
相当于利用两次撤销,将a.txt的内容变成了最新一次commit进仓库的状态
丢弃版本库的修改
如果你不小心把不想修改的内容提交到了仓库,那你就只能使用版本回退了,回退到上一个版本
shell
git log #可以显示从最近到最远的提交日志
git log --pretty=oneline #可以将每条简化为一行
commit id即版本号,用SHA哈希出来的一个值,用十六进制表示
Git中用HEAD
表示当前版本,上一个版本是HEAD^
,上上个版本是HEAD^^
所以如果想回退到上一个版本
shell
git reset --hard HEAD^
#或者是
git reset --hard xxxxx#后面写版本号,取前几位就可以,git会自己找
此时,git log看到的版本也是会回到上一个版本所能看见的
现在的操作相当于"回到过去",如果你想回到未来,但是你又忘了之前的版本号是多少,你可以用
shell
$ 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
进入git log或者git reflog后,按q
可以退出
删除文件
rm
命令仅仅是删除本地工作区的文件,相当于一次对文件的修改,如果想同步给版本库的文件,就想要git add
和git commit
git rm
命令等同于rm + git add
,此时只想要git commit
即可完成版本库的同步
git rm -f
,删除工作区和暂存区文件,并且将这次删除放入暂存区,主要是解决文件被add进暂存区,但是没有commit到仓库,导致暂存区和仓库存在不同,此时直接使用git rm
就无法执行,可以添加-f
的参数,强制删除
git rm --cached
, 删除暂存区文件,但保留工作区的文件,并且将这次删除放入暂存区,此时使用git status
shell
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: test.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt
git commmit
以后仓库内的就被删除了,但是本地工作区还是保存的,而且不会被追踪