在使用git之前,应该了解到git有四个区域,分别是 工作区、暂存区、本地版本库、远程版本库
命令 | 解释 |
---|---|
git init | 初始化工作区 |
git add . | 将改动的所有文件添加到暂存区 |
git commit -m “first commit” | 提交至本地版本库 |
git push origin master | 提交至远程版本库 |
一、reset 用法
## 撤销提交(commit)操作
```shell
# 撤销上一次的提交
git reset --X HEAD^
其中X有如下三种类型
- mixed : 不删除工作空间改动代码,撤销commit,并且撤销git add . 操作(默认)
- soft:不删除工作空间改动代码,撤销commit,不撤销git add .
- hard:删除工作空间改动代码,撤销commit,撤销git add
画个表格方便记忆:
类型 | 工作区改动内容 | add | commit |
---|---|---|---|
hard | 删除 | 撤销 | 撤销 |
mixed(默认) | 不删除 | 撤销 | 撤销 |
soft | 不删除 | 不撤销 | 撤销 |
# 恢复工作区到上一次提交时的状态(如果已提交本次工作区修改的内容)
git reset --hard head^
# 恢复工作区到上一次提交时的状态(如果未提交本次工作区修改的内容)
git reset --hard head
#拉取最近一次提交到版本库的文件到暂存区
git reset HEAD -- <file>
场景一:若我们使用reset之后,如何撤销reset?
首先查看所有分支的操作记录
git reflog
可以看到第一个索引bdb6d0c中,使用了reset指令移动了head索引。那么我们此时再通过git reset --hard c5c560b
即可撤销该reset操作。
再使用reset的时候,看到使用了head^
,它的意思是重置到head的前向一个索引位置。有几个^就往前移动几次索引。
二、revert
# 回滚版本库的某一次的提交 version为某次提交的索引
git revert -n [versino]
git reset 和git revert的区别:
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进
三、恢复工作区内容(checkout)
# 恢复工作区的单个文件到上一次提交时的状态(暂存区覆盖工作区)
git checkout -- <file>
# 恢复工作区到上一次提交时的状态
git checkout .
# 恢复工作区到上一次提交的状态并清空暂存区未提交的内容
git checkout head .
删除
#从磁盘和暂存区删除
git rm -f a.txt
#仅从暂存区删除
git rm --cached a.tx
四、日志
#查看提交日志
git log
# 一行输出
git log --oneline
# 漂亮的格式
git log --pretty=oneline
#查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
git reflog
五、分支
5.1 创建分支
#创建分支
git branch <branchname>
5.2 提交至远程仓库
# 推送本地分支至远程分支(本地分支与远程分支可以不一致)
git push origin <branchname>:<branchname>
# 如果本地分支与远程分支名字一致则直接使用
git push origin <branchname>
5.3 切换分支
#切换分支
git checkout <branchname>
#创建并切换到该分支
git checkout -b <branchname>
# 创建远程分支dev到本地dev并切换到dev(前提:远程仓库必须存在该分支)
git checkout -b dev origin/dev
有时候我们本地创建的分支没有与远程仓库的相关联,这时候push或者pull操作都会失败,那么我们需要先建立本地关联远程分支。
#先切换到分支
git checketout dev
# 再做关联
git branch --set-upstream-to=origin/dev
5.4 查看分支
# 列出所有分支
git branch
#查看本地和远程分支
git branch -a
#查看远程分支
git branch -r
5.5 合并分支
# 将<branchname>分支合并到当前分支
git merge <branchname>
5.6 删除分支
# 删除本地分支
git branch -d <branchname>
# 删除远程分支<branchname>
git push origin --delete <branchname>
# 删除远程分支<branchname>
git push origin :<branchname>
六、标签(tag)
给历史某次提交打上标签,已表示此次提交比较重要!
# 创建标签(名字为v1.0 可任意起名)
git tag v1.0
#创建标签并附加信息
git tag -a v1.0 -m "create func..."
# 查看目前有的标签
git tag
# 查看标签信息
git show v1.0
# 删除标签
git tag -d v1.0
# 推送标签至远程
git push origin v1.0
# 一次性推送所有标签至远程
git push origin --tags
# 删除远程标签
git push origin :refs/tags/v1.0
七、rebase
7.1 合并commit
我们可以使用rebase命令合并多次commit为一次。
git rebase -i [startpoint] [endpoint]
其中startpoint,endpoint即为编辑区间,效果相当于(startpoint,endpoint](前开后闭)。
eg:
现在我本地提交了很多次,而我想把红框框的三次合并为一次提交。如果[endpoint]不是head当前所指向 hash值,那么其后面 的提交将会被丢弃。
所以我们也可以不指定[endpoint],这样就相当于合并[startpoint] 后面的所有提交了。
其实除了rebase,还有一种更为简单的方式,这里先说一下。
使用之前介绍reset命令:
git reset --hard b11326a
git commit -m "merga commit "
现在是介绍rebase,那我们还是使用如下命令合并红框中的三次提交。
git rebase -i b11326a^ d58574b
输入完命令后,弹出如下内容。
其中:
- pick:保留该commit(缩写:p)
- reword:保留该commit,但我需要修改该commit的注释(缩写:r)
- edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该commit和前一个commit合并(缩写:s)
- fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行shell命令(缩写:x)
- drop:我要丢弃该commit(缩写:d)
此时键入i进入编辑模式,修改为如下内容:
意思即为:touch d,touch e的两次提交直接和touch c的提交合并。
此时键入ese,退出编辑模式,输入:wq
保存即可。
然后进入如下界面:
这是进入合并后的注释修改界面,根据自己的需要改动提交信息即可。
最后查看日志,发现合并到一起了,果然把红框后面提交(3db910a)丢失了。
7.2 复制 commit 到其他分支
此时我们拥有两个分支,分别为master和develop,这时候想把develop的c,D,E三次提交平行复制到master分支上,直接使用命令:
# 切换分支
git checkout develop
git rebase 0152896 7d8c6a4 --onto master
此时切换到master分支上再根据提示完成拷贝commit。
八、fetch
fetch看了很多大佬的介绍,个人也不是太理解,先这么理解吧。
fetch +merge = pull