你是不是还停留在clone、commit、pull、push...的阶段,是不是对rebase心里没底只敢用merge?
Git相比于svn有什么优势呢?
打个比方:"巴拉巴拉写了一大堆代码,突然发现写的有问题,我想回到一个小时之前",对于这种情况Git的优势就很明显了,因为commit的成本比较小并且本地会保存所有的提交记录,随时随刻可以进行回退。
在这并不是说svn的不能完成这种操作,只是Git的回退会显得更加的优雅。Git相比于中央式工具还有很多优点,就不一一列举了,感兴趣的可自行了解。
** 文件状态**
在Git中文件大概分为三种状态:已修改(modified)、已暂存(staged)、已提交(committed)
- 修改:Git可以感知到工作目录中哪些文件被修改了,然后把修改的文件加入到modified区域
- 暂存:通过add命令将工作目录中修改的文件提交到暂存区,等候被commit
- 提交:将暂存区文件commit至Git目录中永久保存
** 提交相关**
前面我们提到过,想要对代码进行提交必须得先加入到暂存区,Git中是通过命令 add 实现
添加某个文件到暂存区:
git add 文件路径
添加所有文件到暂存区:
git add .
同时Git也提供了撤销工作区和暂存区命令
撤销工作区改动:
git checkout -- 文件名
清空暂存区:
git reset HEAD 文件名
提交:
将改动文件加入到暂存区后就可以进行提交了,提交后会生成一个新的提交节点,具体命令如下:
git commit -m "该节点的描述信息"
3.2 分支相关
创建分支
创建一个分支后该分支会与HEAD指向同一节点,说通俗点就是HEAD指向哪创建的新分支就指向哪,命令如下:
git branch 分支名
切换分支
当切换分支后,默认情况下HEAD会指向当前分支,即HEAD间接指向当前分支指向的节点
git checkout 分支名
同时也可以创建一个分支后立即切换,命令如下:
git checkout -b 分支名
**删除分支 **
为了保证仓库分支的简洁,当某个分支完成了它的使命后应该被删除。比如前面所说的单独开一个分支完成某个功能,当这个功能被合并到主分支后应该将这个分支及时删除。
删除命令如下:
git branch -d 分支名
合并相关
关于合并的命令是最难掌握同时也是最重要的。我们常用的合并命令大概有三个merge、rebase、cherry-pick
merge
merge是最常用的合并命令,它可以将某个分支或者某个节点的代码合并至当前分支。具体命令如下:
git merge 分支名/节点哈希值
rebase
rebase也是一种合并指令,命令行如下:
git rebase 分支名/节点哈希值
rebase优缺点:
- 优点:会使提交历史看起来更加线性、干净
- 缺点:虽然提交看起来像是线性的,但并不是真正的按时间排序,比如图3-3中,不管C4早于或者晚于C3提交它最终都会放在C3后面。并且当合并发生冲突时,理论上来讲有几个节点rebase到目标分支就可能处理几次冲突
cherry-pick
cherry-pick的合并不同于merge和rebase,它可以选择某几个节点进行合并
命令行:
git cherry-pick 节点哈希值