git checkout -b newBranch2 //新建名为newBranch的分支,同时切换到该分支。
1、git commit
图中:有C0和C1两个提交(在实际当中,C0,C1表示两个提交的hash值,一长串字符的),当前处于master分支,
使用命令:
git commit -m "本次提交提示信息"
git commit -m "本次提交提示信息"
此时有: HEAD->master->C1
使用后变为:
HEAD->master->C3
2、git branch
- 使用前:
HEAD->master->C1;
git branch newBranch //新建名为newBranch的分支,指向当前提交
变成:
HEAD->master->C1;
newBranch->C1;
git branch -a //显示所有分支,包括本地分支和远端分支
显示结果为:
git branch -fnewBranch HEAD^ //将分支newBranch 指向当前提交(HEAD)的上一个(^)提交。如果当前分支不存在,则创建该分支;如果分支位置未指定,则默认为指向当前分支
此时:
HEAD->newBranch->C0;
master->C1;
git branch -d newBranch //删除名为 newBranch的分支,当删除分支为以下情况会失败:1. 当前分支时; 2. master分支时; 3. 未知的分支时。
变成:
3、git merge
此时:
HEAD->master->C3;
bugFix->C2;
git merge bugFix //将当前分支与 bugFix 合并,重点注意:在实际操作过程中,合并时需要解决代码冲突问题。
此时:
HEAD->master->C4;
bugFix->C2;
4、git rebase
注意与 git merge 相比较,两者都是合并分支,merge更简单,保留所有信息;而rebase能得到更加清晰的工作流
此时:
HEAD->master->C3;
bugFix->C2;
git rebase bugFix //将当前分支的父提交移到bugFix分支下,得到比merge具有更加线性的提交历史
变为:
HEAD->master->C3'
bugFix->C2;
5、git checkout 切换分支
此时:
HEAD->master->C2;
git checkout C2^ //切换分支,将HEAD指向C2的父提交(^表示上一个提交)——C1 (此处C1代表这个提交的hashcode);
此时:
HEAD->C1;
master->C2;
git checkout -b bugFix //创建分支,并切换到该分支;
此时:
HEAD->bugFix->C1;
master->C2;
6、git log 显示日志
使用 git log 可以查看每一次提交的详细信息。
git log
7、git reset 和git revert 撤销更改
git reset 是真正的撤销,当前操作直接丢弃,而git revert 则是将你要撤销回退到的某个状态作为一个新的提交,使得新的提交与你要回退到的状态是一致的,达到撤销的效果,由于git reset只适用于本地的分支,因而:本地撤销一般使用 git reset;远程分支的撤销使用 git revert;
此时:
master->C1;
pushed->C2;//假设该分支与远端分支绑定
HEAD->local->C3;
git reset master //将当前分支local撤销更改回退到master状态
git checkout pushed //切换到pushed分支
git revert master //使用revert将当前远端分支pushed回退到master状态
此时有:
master->C1;
local->C1;
HEAD->pushed->C1';
8、git cherry-pick 转移工作区
使用该命令可以将选定的提交记录转移到当前的位置<HEAD>下面。具体看图:
此时: HEAD->master->C1
git cherry-pick C3 C4C7 //将提交 C3 C4 C7 按顺序转移到当前位置之后
9、git tag 和 git describe
git tag<commit-name><tag-name>给某个提交打一个标记,一般是在一些特殊意义的提交打标记,比如标记名为版本号等。
git describe 则用来描述当前位置距离最近的一个标记点相差几个提交,输出格式为:<tag>_<numCommits>_g<hash>
此时:
git tag V0 C1 //给C1打上标记V0
git tag V2 side
git describe //描述当前位置距离最近的标记相差几个提交
结果为:
C5距离最近标记V0相差3个提交: C2 C4 C5
10、git clone
在开始一个项目时,使用git clone <版本库的网址> 将远端版本库克隆到本地仓库。
在clone 之前远端仓库的样子:
git clone <版本库的网址> //克隆目标版本库到本地仓库
此时,本地仓库和远端仓库示例如下:
其中 o/master为本地仓库的远端分支,与远端仓库的master分支相互映射,实际项目中,一般使用origin而不是o,名字格式为:<remote name>/<branch name>
注意:当前分支<HEAD>不能指向远端分支: o/master;这些分支的状态只伴随远端分支更新而更新,即使用push和pull等于远端相关的git操作时。
11、git fetch
git fetch 完成了两项工作:1> 下载本地仓库中未包含的提交;2> 更新我们的远端分支(如origin/master)。但不会:更新你的本地分支。
git fetch //1> 下载本地仓库中未包含的提交;2> 更新我们的远端分支(如origin/master)
12、git pull
注意,此时 本地分支master 与远端分支 o/master 处于绑定状态。
如果不处于绑定状态则无法使用pull和push;因为如果没有绑定的话,不知道到底要pull哪一个分支下来,以及不知道将该分支push到哪个分支上去。
git pll //实现两个功能,git fetch 以及git merge;
等价于:
git fetch
+
git merge o/master
注意:git pull --rebase的作用等同于 git fetch + git rebase,这样能够得到更加清晰线性的工作流
13、git push
提交当前代码到远端分支;注意:master与远端分支o/master相对应;
git push 之后,完成本地与远端的同步
git push --force
强行将当前分支提交到远端分支,即使会导致远端版本回滚;如果不存在映射的远端分支,则会创建对应的远端分支。
git push origin<localname> :<originname>
将指定的本地分支<localname> 推送到指定的远端分支 <originname>