Git指令
一、前言
阅读本教程,默认读者已了解版本控制和git的相关概念
借用菜鸟教程 git 简明指南 (runoob.com) 的一个图复习一下git的工作流程:
二、指令
1. 主要指令
通过一个git使用流程介绍git指令
1.1 git add
git add [filename]
指令将你在工作目录修改的内容加入暂存区。
1.2 git commit
git commit -m "message"
指令提交暂存区到本地仓库。
-
Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然后再粘贴一样,但比复制粘贴优雅许多!
-
Git 希望提交记录尽可能地轻量,因此在你每次进行提交时,它并不会盲目地复制整个目录。条件允许的情况下,它会将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。
-
Git 还保存了提交的历史记录。这也是为什么大多数提交记录的上面都有父节点的原因 。对于项目组的成员来说,维护提交历史对大家都有好处。
1.3 git push
git push
指令将本地仓库的提交同步到远程仓库(github/gitee等)
2. 分支
结点:一次提交就是一个结点
2.1 git branch
git branch name
创建新分支name,git做的操作只是将name指向当前的结点(提交),但是工作目录仍是master(主分支)
2.2 git checkout
git checkout name
切换分支到name分支。如果分支不存在,可以使用git checkout -b name
创建分支同时切换到name分支
2.3 git merge
git merge name
指令将name分支合并到当前分支。git做的事是建立一个新结点,其父节点为name分支和当前分支;同时将当前分支指向该结点,name所在分支指向结点不变。如果想让name分支也指向当前结点,在name分支上运行git merge nowBranch
指令,参数是前述的“当前分支”。
2.4 git rebase
git merge name
指令将当前指令不在name分支上的结点复制后加在name分支上,并将当前分支指向最后的结点,name分支指向结点不变。如果想让name分支也指向最新结点,类似git merge
,在name分支上运行git rebase nowBranch
指令,参数是前述的“当前分支”。
2.5 git cherry-pick
git cherry-pick <提交号列表>
将提交号列表中的提交复制后加入当前结点的下方。
2.6 git rebase -i
git rebase -i HEAD~4
Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。
HEAD~4即不是从当前结点开始往上四个结点。在该界面中,我们可以调整这些选中结点的顺序,并决定是否删除,提交后将根据你设置的顺序和是否删除在当前结点下分支相同的记录。
2.7 总结
git rebase
和git cherry-pick
都是将你要的结点复制到当前分支的下方,这破坏了“分支树”的结构,很难直观地看到某次提交来源于哪些分支。但从功能上看三个命令各有优势,有些操作无法用merge指令完成。
3. 相对引用
3.1 HEAD
HEAD
指当前的结点(当前的工作目录)。
事实上默认指向为“HEAD→分支名→结点(提交)”,git checkout var
指令就是将HEAD指向var,var可以是分支,也可以是提交记录的哈希值。当var是分支时,就是上述的“HEAD→分支名→结点(提交)”,当var是提交记录的哈希值时,就变成了“HEAD→结点(提交)”,实现了分离HEAD
3.2 ~
& ^
分支/提交记录哈希值/HEAD后加~
& ^
表示这些名字对应的提交记录的上一个结点。在~
和 ^
后可以加数字n表示上n个结点。
3.3 使用
git branch -f master HEAD~2
:将master分支指向HEAD结点的第2级父提交。
4. 撤销变更
4.1 git reset
git reset HEAD~
将当前分支指向HEAD的父节点,实现撤销HEAD指向的提交记录
- 对远程分支无效,为了撤销更改并分享给别人,我们需要使用
git revert
。
4.2 git revert
git revert HEAD
创建一个新结点,将会在HEAD下生成一个新结点,该结点引入的更改刚好是用来撤销 HEAD 这个提交的。也就是说该结点的状态与HEAD~
是相同的。
4.2 git revert
git revert HEAD
创建一个新结点,将会在HEAD下生成一个新结点,该结点引入的更改刚好是用来撤销 HEAD 这个提交的。也就是说该结点的状态与HEAD~
是相同的。