一、撤销和回滚
- 撤销变更:git checkout [filename] 将工作区内某个文件的变更(修改或删除)撤销到最近一次git commit或git add的状态,需要注意的是该命令不会对新增加的文件生效。若使用git checkout .则会撤销当前目录及其子目录下所有文件的变更,与git add相似
- 撤销增加:git reset [filename] 如果说checkout是对工作区的撤销,那么git reset就是对暂存区的撤销。当我们使用完git add后发现有些文件又不想提交了,那么使用该命令可以将暂存区内的文件变更重新撤回工作区,需要注意的是若不指定文件名,则会将暂存区内所有的文件变更撤回。
- 回滚:git reset HEAD~[n] 就算是git commit之后Git也能允许你回滚。使用该命令可以撤销你最近n次的commit,使变更回到工作区,若不指定n则默认回滚一次,HEAD可以理解为当前仓库所指向最新一次的commit。有时候我们会希望回滚的同时所有的文件内容也同步到那一次提交点,这时我们只需要加上--hard参数即可实现硬回滚,例如git reset --hard HEAD~
- 第二种回滚:git reset <commit ID> 除了使用头指针回滚的方式,Git还支持commit id回滚。当我们使用git log或者reflog的时候,可以发现一连串“随机”字符串,那个就是用来指示我们每一次对头指针的移动并具有唯一性,因此使用该命令也能实现相同功能。
二、隐藏
- 隐藏修改:git stash 当我们在工作区或暂存区进行修改的过程中,需要紧急切换分支或处理一个其他需求,此时你可以使用该指令将变更隐藏起来,使仓库status回到最近一次commit的状态。
- 查看隐藏:git stash list 该命令可以列出所有隐藏记录所在的分支及其索引。
- 删除隐藏:git stash drop [stash ref] 删除某个隐藏的修改,若没指定索引,则删除全部。
- 弹出隐藏:git stash pop 将隐藏的修改恢复出来,同时删除该条隐藏记录。
三、分支
- 创建分支:git branch <branch name> 从当前所在分支切出一个副本作为一个新的分支。
- 查看分支:git branch 和上一条命令相同,只是没有指定分支名,这样该命令就会显示本地所有的分支。
- 更改分支名:git branch -m [old name] <new name> 更换分支名称,若处在需要更换的分支,可以省略老的名称直接指定新名称。
- 删除分支:git branch -d <branch name> 必须处在其他分支上才能删除指定分支,如果要删除的分支有新的提交且没有合并过则必须使用参数-D
- 切换分支:git checkout <branch name> checkout除了撤销的功能外还可以切换分支。切换到指定分支后,所有的修改和提交都是针对当前分支的,不会对其他分支造成影响。需要注意的是切换分支前,当前分支的工作区和暂存区不能有修改,需要提交或隐藏。
- 合并分支:git merge [branch name] 将指定分支的更改内容合并到当前所处分支,也就是将另一分支的commit附加到当前分支。若输入分支名则默认合并远程的同名分支。
四、相关说明
关于远程仓库的命令会在下一篇给出,分支的操作与远程仓库密切相关。例如需要修复某个bug、发布一个版本都需要切出一个分支进行独立操作,最后再合并到主分支中。在多人协作中,合并分支的时候往往会出现修改同一个文件而发生冲突的情况。因此分支的操作也较为繁琐,需要多练习使用