Git的详细使用教程——三部曲

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等,我会在后面的博客中慢慢写出来,如博客中有不对的地方,欢迎斧正。

猜你喜欢

转载自blog.csdn.net/oman001/article/details/80208632
今日推荐