前言
git是一个版本控制工具,是我们在日常开发中常常会使用到的工具。一些和git相关的基础知识在这里就不再赘述了。这里主要介绍一些基础的命令,掌握这些基本命令后,基本就可以解决绝大部分开发场景下遇到的问题。
git的分支本质上是个指向commit对象的指针,和每个commit对象都有唯一的版本号。那么我们要对代码分支的操作,其实就可以想象成对一个链表的操作,无非就是对链表中的结点进行增删改查操作,或者把这个链表的结点加入到另一个链表中。
因此理论上,只要掌握了一些基本的操作命令,经过这些命令的排列组合,就能很好的解决各种问题了。
基本操作
这里首先记录的是一些最最基本的git命令,要使用git基本就离不开这些命令。这里我只做了简单的说明,如果有不懂的,还需要自己去查找了解。
- git init 创建一个本地仓库
- git clone <仓库名> 克隆一个仓库,一般是把远程仓库克隆到本地。并会把远程仓库自动命名为默认的origin
- git clone <仓库名> <目录名> 和上面一样。不同的是指定了仓库克隆下来之后,在本地的目录名(不指定默认为origin)
- git add . 将当前目录下的所有文件加入暂存区(注意后面的.) 当然我们也可以指定文件加入暂存区,把 . 换成文件名就行了
- git commit -m <注释> 提交你的代码,注释一般就用来描述这次提交干了什么
分支操作
git通过指针来保存分支,并通过Head指针来区别当前处于哪个分支。正如前言中所说,我们可以把分支看成链表,多个分支就是多个链表,用这种思路去思考,各种场景我们都能够用基础的几个命令去解决。遇到较为复杂的场景时,才需要去查找资料,这样能更好的提高效率。
下面先介绍查看分支的一些命令:
- git branch -a 查看所在目录下的分支
- git branch <分支名> 根据目录下当前分支,新建新分支
- git log 查看提交的版本记录,可以通过该命令查找到某次提交的版本号(按q退出)
- git log --oneline 更简洁的查看历史记录
- git log --graph --oneline --decorate 可以理解为一个可以显示结构的版本提交记录
在分支切换的时候,最常见的问题是出现合并冲突。这部分知识这里也不做记录了,出现冲突,那么我们必须解冲突,这里建议使用一些idea去解,没必要折磨自己。
下面是分支切换相关操作:
- git checkout <分支名> 根据分支名切换到指定分支
- git checkout -b <分支名> 根据分支名,先创建新分支,再切换到新分支
- git checkout -b <分支名> <版本号> 根据版本号,新建并切换到新的分支(版本号通过git log 查看)
- git merge <分支名> 根据分支名合并。补充一下,如果要合并的分支B的提交,是当前分支A提交的直接后继,那么这种merge就会被称为快进(Fast-forward)
- git status 查看因为冲突而未合并成功的文件
- git branch -d <分支名> 根据分支名删除分支
- git branch -D <分支名> 根据分支名强制删除某分支
下面是一些较为常用的进阶操作:
- git rebase <分支名> 在a分支上执行rebase b,结果是将自己的提交变基提交到b上。当然,这并不会改变b的指针。关于rebase和merge的不同,可以自行了解,一般来说,使用rebase会使得提交记录看上去更简洁
- git cherry-pick <版本号> 将其他分支的某一次提交挑拣加入当前分支上
- git cherry-pick -n <版本号> 同样是将其他分支的某次提交加入到当前分支上,但区别是不会自动提交,还需要手动commit
- git commit --amend 修改最近一次提交的注释和代码(如果要修改非最近一次提交的注释,就需要使用rebase)
这里额外说明一下,利用commit --amend的命令和cherry-pick的相关操作,可以解决很多问题。这部分可以深入了解一下。
远程仓库操作
git有远程追踪分支的功能。当我们和远程分支进行通信(例如pull 或者 push代码。就算作通信)时,git会保存一份存有远程仓库状态的本地分支。
例如远程仓库和本地仓库中都有一个master分支,那么在本地后就会有一个origin/master分支,作为远程分支的副本。
- git fetch <远程仓库名> 更新关联的远程仓库的数据(不影响本地的其他分支,例如上面举的例子,使用该命令,就会更新origin/master分支)
- git remote -v 查看目前存在的远程库库名
- git remote add <远程仓库名> <远程仓库地址> 添加或者说新增远程仓库
下面是我们较为常用的push 和 pull命令
- git push <远程仓库名> <本地分支名>:<远程分支名> 将本地分支推送到远程分支上
- git push <远程仓库名> <分支名> 当本地分支和远程分支同名时,push命令就能简化成这个样子
- git push --force <远程仓库名> <分支名> 将本地分支强行push到远程分支,不管有无冲突
- git pull <远程仓库名> <远程分支名>:<本地分支名> 将远程分支拉取下来,该操作会自动进行merge操作,如果有合并冲突的话,pull操作会失败
- git pull <远程仓库名> <远程分支名> 直接将远程分支拉取到当前分支