Git详细使用三部曲
Git详细使用三部曲(二)
作为一名开发人员,在我们平时的开发中会经常遇到版本管理工具,今天我们就来说说Git的使用,最近我膜拜了蒋鑫的《Git权威指南》一书,收益良多,在此和大家交流交流。
Git是一种分布式版本管理工具,每个人参与开发人员的电脑都是一台代码的仓库,使用起来特别灵活,这里我们就不对Git的安装和配置做说明了,网上相关内容很多。Git的优点也就不多说了,直接开始使用吧。
Git的使用可以说主要分为三部曲来说明,其余的所有命令都是为这三个命令服务的。下面我会对其做详细说明。
三部曲 | 命令 |
---|---|
添加到暂存区 | git add |
提交到版本库 | git commit |
提交到远端 | git push |
以上三个命令是最主要的命令了,其他的命令都是为其服务的,可以将其功能和命令的列举出来。
辅助功能 | 命令 |
---|---|
初始化仓库 | git init |
克隆代码 | git clone |
比较差异 | git diff |
查看状态 | git status |
查看日志 | git log |
检出代码 | git checkout |
重置代码 | git reset |
恢复进度 | git stash |
里程碑 | git tag |
回滚操作 | git revert |
获取(不合并) | git fetch |
合并操作 | git merge |
获取并合并(fetch+merge) | git pull |
rebase命令(可以处理冲突和合并提交) | git rebase |
上面常用的命令都已经写出来了,在真正进入正题之前,我们先简单说一下git版本管理的三个存储代码的地方,其中有一个工作区,就是我们写代码的地方;第二个是暂存区(Index),听名字就知道是暂时存储代码的地方;还有一个是版本库,就是我们本地提交代码后代码存储的地方,也是向远端仓库提交代码的地方。在后面的讲解中会经常遇到HEAD,git是一个支持多分支的代码管理工具,HEAD头指针只要不是处于分离头指针状态(分离头指针是指它指向的是一个具体的commit ID),那么就会指向其中某一个分支,而这立的某一个分支可以理解为master分支,master分支的指针会指向最新的提交ID。其实HEAD就可以理解为一个游标,在所有分支之间灵活切换,但是指向的是当前分支的最新提交。
我们用AndroidStudio建立一个项目名字为Git的项目来举例说明这些命令的作用吧,其实都一样,哪怕你随便建立一个文件夹在里面写东西也可以,主要是学习这些命令的意义和作用。
- 建立一个项目名字为Git的项目
- 在项目的根目录下点击右键运行Git bash here,使用git init 命令初始化git仓库,就会在目录下出现一个名字为.git的隐藏文件夹,接下来我们就可以对代码进行追踪和版本管理了。
- 接下来我们修改项目中的代码(大家不要担心,我们这个项目不会运行,因为运行没什么意义),首先看一下修改之前MainActicity.java的代码,这里需要注意一个问题,git版本管理工具只能管理已经追踪(tracked)的文件,就是说没有添加(add)的文件是追踪不了的,这里我们只是使用git init初始化了一个空的仓库,上面的执行信息也很明显说的是Initialized empty Git responsitory。所以我们正好先了解一下git add命令
1.git add命令
git add 命令 | 意义 |
---|---|
git add .(这里是个点) | 将工作区的变化提交到暂存区,包括文件修改和新增,但是不包括删除的文件 |
git add -u | 将工作区的变化提交到暂存区,包括文件修改和删除,但是不包括新增的文件 |
git add -A | 将工作区的变化提交到暂存区,包括新增,删除和修改的所有内容 |
git add -i | 将工作区的变化提交到暂存区,进入交互模式选择文件进行操作 |
git add [filename] | 将工作区的变化提交到暂存区,选定某一个文件进行提交 |
为了后面的学习不和这里混淆,这里我先将项目的所有内容直接使用git add -A命令然后使用git commit -m "initial commit"提交一次,然后进行这次内容的学习,这里大家不懂的可以先这么做,后面就慢慢讲到。我们使用git log命令查看一下提交记录就会看到刚才的提交信息:
- 这时候我们开始修改代码,在MainActivity中加入一个方法getName();我们使用命令git diff查看一下,增加了一行代码;
这里有几个符号需要注意,其中三个减号指的是修改之前原来文件,三个加号值得是现在文件的内容,看信息很容易看出来是新加了一行代码;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void getName(){}
}
刚才说过了,其他的所有命令可以说都是为了三部曲命令服务的,这里的git diff命令也不例外,这里先对git 命令做一个详细的说明,就知道上面git diff的含义了:
git diff 命令 | 意义 |
---|---|
git diff | 比较工作区和暂存区差异 |
git diff --cached | 比较暂存区和版本库之间差异 |
git diff HEAD | 比较工作区和HEAD头指针指向的分支之间的差异 |
git diff [ID] | 工作区和某一个提交的分支进行对比 |
git diff --cached [ID] | 暂存区和某一个分支比较 |
所以上面的git diff就是工作区和暂存区进行比较了,我们在工作区加入一行代码,没有add,所以暂存区没有。这时候执行git diff HEAD效果和git diff虽然意义不一样,但是效果一样,因为代码还在工作区,,既没有添加到暂且区也没有添加到版本库中,如下图:
- 这时候我们执行一下git status -s命令查看一下,显示如下,我们看到打印信息前面显示了一个大写的红色M但是没有最顶格写,它的意义有两点,第一M代表的是修改的意思,也就是我们是在原来基础上修改的这个文件,并不是新增的(因为之前有一次提交);第二红色以及大写代表是还没有添加到暂存区;等会我们添加后再来对比一下。
- 这时候我们将其git add -A添加到暂存区,执行git status -s命令:查看对比刚才的,这时候会发现add之后,执行git status -s命令,大写M顶格写了,而且颜色也变为绿色的了,这就给了我们一个好的启示,因为执行git diff可能信息量太大,那么我们就可以执行git status命令查看,不仅知道哪个文件修改了,而且还知道是否添加到暂存区了。
- 这时候执行git diff会发现没有变化了,但是执行git diff --cached和git diff HEAD有变化,因为修改已经提交到暂存区,工作区和暂存区一致,但是没有提交到版本库中,如下图:
好了,git add命令讲解就到这里。下面我们讲解git commit 命令。
2.git commit命令
-
现在我们将修改已经提交到暂存区了,下一步就该提交版本库了,需要使用git commit命令
git commit命令|意义
-|-
git commit -m “msg”|将修改从暂存区提交到版本库中,msg指的是本次提交的信息
git commit --amend|修改上次提交的信息,会出现一个交互界面,相当于本次提交和上次提交合并为一个提交
git commit --amend -m “msg”|修改上次提交的信息,不会出现一个交互界面,相当于本次提交和上次提交合并为一个提交
git commit --allow-empty -m “msg”|看意思就是说允许空白提交,多用来测试时候使用 -
了解了以上命令的意思,我们就直接使用一下吧,git commit -m “add method getName()”,如下:查看一下log信息
这里也将git log的命令展示出来:
git log命令 | 意义 |
---|---|
git log | 展示commit的详细信息,包括commit SHA1值,date author和提交信息 |
git log --oneline | 仅仅展示提交的简单信息,有SHA1值前几位,和提交信息 |
git log --graph | 用图表链的形式详细展示提交信息 |
git log --oneling --graph | 用图表链的形式简单展示提交信息 |
3.git push
git push命令 | 意义 |
---|---|
git push origin [branch] | 将代码提交到远端branch分支上 |
git push origin [brchan] -f | 将代码覆盖远端的branch分支,此命令比较危险,慎用,确保此分支只有你个人工作时候可以 |
最后就是提交了,假如是真正的项目的话,使用git push origin [branchname]就可以提交了。默认情况下,如果你是从远端clone来的代码的话默认是远端的master分支,这个得根据项目的实际分支模型,也可能是develop分支,假如是develop分支clone来的话就可以使用git push origin develop来将版本库代码push到远端建立一个新的分支,等别人review后没问题,就可以合并到主分支了,这里我们push肯定是不会成功的。显示不能从远端仓库读取,如下图:
如果想测试的话,可以在建立Git项目的时候就先把项目VCS->Import into Version Control->share Project on GitHub,这样的话就在远端有一个引用指向当前的项目,就可以push成功了。这里因为push比较简单,主要是说明其他一些命令的使用,但是push命令很重要,切记不要随便使用-f命令。
好了,今天的交流就结束了,还有很多重要的的命令,比如rebase checkout reset revert等,我会在后面的博客中慢慢写出来,如博客中有不对的地方,欢迎斧正。
除了这基本的三部曲,在此基础上还有其它的必须掌握的Git命令,请参考: