git指南及知识点目录
一、版本进退
每commit一次就产生一个版本(一个“存档”)
HEAD 表示当前版本
HEAD^ 表示上个版本
HEAD^^ 表示上上个版本
HEAD^^^ 表示上上上个版本
HEAD~100 表示上一百个版本
HEAD相当于一个指针,指向当前版本
-
用
git log
来列出目前版本(也就是HEAD指向的版本)以及之前的版本。 -
从现在穿梭回过去:
# 回到之前 commit id 以 “xxx” 开头的版本
$ git reset --hard xxx
这个操作实际上是改变HEAD指针的指向,并没有丢失当前的几个版本
此时用 git log
显示出来的是回退到的那个版本以及那个版本之前的版本
- 从过去穿梭回到现在:
如果后悔,想要去到最新的几个版本,但又无法用 git log
找到他们的 commit id,那么:
git reflog 可以帮你找到
二、工作区和版本库
2.1 工作区 Working Directory
工作区就是当前文件夹里的源文件源代码们
2.2 版本库 Repository
版本库是当前文件夹里的 .git 文件夹,它包含着项目的版本
版本库包含:
-
暂存区(stage):
-
# 将工作区(working directory)的文件xxx的修改,添加到暂存区(stage) $ git add xxx
-
-
master 分支:
-
HEAD指向这个master分支
-
# 将暂存区(stage)的文件提交到当前HEAD分支 $ git commit -m "xxx"
-
2.3 工作区和版本库穿梭
git add
:工作区 (working directory) --> 暂存区 (stage)
git commit
:stage --> HEAD 分支
git diff
:用来比较工作区和暂存区一个文件的差异
2.3.1 撤销本地修改
撤销本地修改,等同于:重回暂存区 (stage),撤销工作区 (working directory)
# 丢弃在工作区的xxx文件的改变
$ git checkout -- <file>
# 把 README.txt 在工作区 (working directory) 的修改全部撤销
$ git checkout -- README.md
git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态
git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop回复。
git reset --hard HASH #返回到某个节点,不保留修改,已有的改动会丢失。
git reset --soft HASH #返回到某个节点, 保留修改,已有的改动会保留,在未提交中,git status或git diff可看。
git clean -df #返回到某个节点,(未跟踪文件的删除)
git clean 参数
-n 不实际删除,只是进行演练,展示将要进行的操作,有哪些文件将要被删除。(可先使用该命令参数,然后再决定是否执行)
-f 删除文件
-i 显示将要删除的文件
-d 递归删除目录及文件(未跟踪的)
-q 仅显示错误,成功删除的文件不显示
注:
git reset 删除的是已跟踪的文件,将已commit的回退。
git clean 删除的是未跟踪的文件
- 情况一: README.txt 已经在暂存区(stage),但是在工作区(working directory)又被修改。
- t = 0:git add README.txt
- t = 1:修改 README.txt
- 使用
git checkout -- README.md 可以让 README.md
变成 t = 0 的样子
- 情况二:README.txt 还没有被添加到版本库(stage或master分支)。
- 使用
git checkout -- README.md
会让README.md 变成当前版本库的样子
- 使用
2.3.2 撤销 add 操作
撤销add,等同于:重回工作区 (working directory) ,撤销暂存区 (stage)```
$ git reset HEAD xxx
# 将已经在暂存区的README.md撤销,换句话说,把已经 git add 的文件撤销
$ git reset HEAD README.md