创建版本库
选择一个地方创建空目录
mkdir <filename>
,创建一个空目录;cd <filename>
,打开这个目录;pwd
显示当前目录git init
把这个某变为Git可管理的仓库- 给目录中添加文件
git add <filename>
将文件添加到仓库git commit -m "说明文字"
把文件提交到仓库git status
查看当前仓库的状态git diff <filename>
查看修改的内容
版本回退
git log
查看详细的历史记录;- 如果不想看太详细的信息,使用
git log --pretty=oneline
,它显示的信息是commitID和commit的说明; - 回退到上一个版本
git reset --hard HEAD^
,HEAD
表示当前版本,HEAD^
上一个版本,HEAD^^
上上个版本。如果版本数太大,使用HEAD~n
,表示上n
个版本,如HEAD~5
,往上5个版本。 - 使用
commitId
回退,通过git log
得到版本信息的commitId
,使用指令git reset --hard <commitId>
,就能回退到指定的版本。 git reflog
记录了操作的每一个指令;HEAD
是git内部指向当前版本的指针,回退版本就是把HEAD
重指向,所以git回退非常迅速。
回退总结:
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
;- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本; - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
工作区和暂存区
Git和SVN的不同之处在于Git存在暂存区的概念。
- 工作区:就是在电脑里能看到的目录,比如使用
mkdir
创建的目录,就是一个工作区; - 版本库:工作区有一个隐藏的文件
.git
,它不算工作区,而是git的版本库。 - git的版本库存在了很多东西,其中最重要的就是称为
stage
(或者叫index
)的暂存区,还有git为我们自动创建的第一个分支master
,以及指向master
的HEAD
指针。
git的添加操作
git add
把文件添加进去,实际上就是把文件添加进暂存区;git commit
提交更改,就是把暂存区的所有内容提交到当前分支;- 因为我们创建Git版本库时,Git自动为我们创建了唯一一个
master
分支,所以,现在git commit
就是往master
分支上提交更改; - 一旦提交后,如果又没有对工作区做任何修改,那么工作区就是“干净”的;
为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。 什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
git add .
提交当前的所有修改;git add <filename>
提交修改的文件;git add
把修改的内容提交到暂存区;git commit
把暂存区的修改提交到当前分支;- 如果当前的修改没有
git add
,则git commit
提交的是暂存区的修改,并不会把当前工作区的修改提交到当前分支上; - 查看工作区和版本库的区别,使用:
git diff HEAD --<fielname>
- 每次修改,如果不
add
到暂存区,那就不会加入到commit
中; - 可以多次
add
后,再commit
。
撤销修改
- 工作区的撤销指令:
git checkout --<filename>
,把文件在工作区的修改全部撤销掉。git checkout --<filename>
中的--
很重要,没有--
就成了切换到另一个分支的命令。- 修改后的内容还没有被放到暂存区,撤销修改就会回到和版本库一样的状态;
- 添加到暂存区后,又修改了新的内容,撤销修改就回到添加到暂存区前的状态;
- 总之就是让当前文件回到最近一次git add 和git commit时的状态。
- 修改提交到暂存区,使用修改指令:
git reset HEAD <filename>
把暂存区的修改撤销掉,重新放回工作区,重复工作区的撤销; - 修改的内容提交到版本库,撤销使用版本回退的指令,
git reset --hard <commitid>
、git reset --hard HEAD^
上一个版本库; --hard
删除工作空间的改动代码,撤销commit
且撤销add
;--soft
不删除工作空间的改动代码 ,撤销commit
,不撤销add
;- 只修改
commit
的注释:git commit --amend
进入vim
编辑模式,修改完保存即可; git reset --hard <commitid>
适用于回退到commit-id
的那个版本,且commit-id
之后提交的版本都不要了.
撤销push操作
推荐使用git reset --hard commit-id
、git push origin <分支名> --force
:
- 先执行
git reset --hard <commit-id>
,回滚到commit-id
的提交版本; - 再执行
git push origin <分支名> --force
,本地代码回到commit-id
的提交版本; - 或使用
git push -f
提交更改,用git push
会报错,因为我们本地库HEAD指向的版本比远程库的要旧,所以要用git push -f
强制推上去,此时远程库的HEAD
已经指向commit-id
的版本; - 执行
git log
查看版本信息,此时本地的HEAD
已经指向commit-id
的版本; - 步骤二/三作用相同。
使用revert
:
- 使用场景:
git revert
是用于反做
某一个版本,以达到撤销该版本的修改的目的。比如,我们commit
了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用git revert
命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。 git log
查看版本号,选择要revert
的commit-id
;- 执行
git revert -n <commit-id>
; - 上一步执行后,可能存在冲突,修改冲突后执行
git commit -m '提交说明'
- 执行
git push
; revert
之后再提交,历史纪录里面会有两个commit
是无用的。一个错误提交,一个提交revert
这个错误的提交。当然你也可以用reset
,比如git reset --hard <commit hash>
,然后push
的时候加上-f
强制更新。但是这个操作很危险,如果别人已经checkout
你错误的commit
,你又把它reset
,这样其他人下次pull
,或者push
就会有错误。- 利用
git reset
操作回滚代码到指定版本,此种方式比直接revert
要好一些,采用soft
模式会保留本地代码的变化,hard
则不会。
删除文件
在Git中删除也是一个修改操作。
在文件管理器中删除没用的文件使用指令:rm <filename>
。
Git检测到你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了,这时候有两种操作:
- 确定要从版本库中删除该文件,用命令
git rm <fielname>
删掉,并且git commit
. - 删错了,如何还原:
git checout --<filename>
,因为版本库里还存在这个文件。git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。