第一行代码中的GitHub控制

文章转载自:https://www.jianshu.com/p/89f0d3b056a6

 

1. 创建代码仓库

虽然在Windows 上安装的Git 是可以在图形界面上进行操作的,但是这里我并不建议你使用这一功能,因为Git 的各种命令才是你应该掌握的核心技能,并且不管你是在哪个操作系统中,使用命令来操作Git 肯定都是通用的。
那么我们现在就来尝试一下如何通过命令来使用Git,如果你使用的是Linux 系统,就先打开shell 界面,如果使用的是Windows 系统,就从开始里找到Git Bash 并打开。
首先应该配置一下你的身份,这样在提交代码的时候Git 就可以知道是谁提交的了,命令如下所示:

git config --global user.name "Tony"
git config --global user.email "[email protected]"

配置完成后你还可以使用同样的命令来查看是否配置成功,只需要将最后的名字和邮箱地址去掉即可,如图5.15 所示。

图5.15

然后我们就可以开始创建代码仓库了,仓库(Repository)是用于保存版本管理所需信息的地方,所有本地提交的代码都会被提交到代码仓库中,如果有需要还可以再推送到远程仓库中。
这里我们尝试着给BroadcastBestPractice 项目建立一个代码仓库。先进入到
BroadcastBestPractice 项目的目录下面,如图5.16 所示。

图5.16

然后在这个目录下面输入如下命令:

git init

很简单吧!只需要一行命令就可以完成创建代码仓库的操作,如图5.17 所示。

图5.17

仓库创建完成后,会在BroadcastBestPractice项目的根目录下生成一个隐藏的.git文件夹,这个文件夹就是用来记录本地所有的Git 操作的,可以通过ls -al 命令来查看一下,如图5.18所示。

图5.18

如果你想要删除本地仓库,只需要删除这个文件夹就行了。

2. 提交本地代码

代码仓库建立完之后就可以提交代码了,其实提交代码的方法也非常简单,只需要使用add 和commit 命令就可以了。add 是用于把想要提交的代码先添加进来,而commit 则是真正地去执行提交操作。比如我们想添加AndroidManifest.xml 文件,就可以输入如下命令:

  git add AndroidManifest.xml

这是添加单个文件的方法,那如果我们想添加某个目录呢?其实只需要在add 后面加上目录名就可以了。比如将整个src 目录下的所有文件都进行添加,就可以输入如下命令:

git add src

可是这样一个个地添加感觉还是有些复杂,有没有什么办法可以一次性就把所有的文件都添加好呢?当然可以,只需要在add 的后面加上一个点,就表示添加所有的文件了,命令如下所示:

git add .

现在BroadcastBestPractice 项目下所有的文件都已经添加好了,我们可以来提交一下了,输入如下命令:

git commit -m "First commit."

注意在commit 命令的后面我们一定要通过-m 参数来加上提交的描述信息,没有描述信息的提交被认为是不合法的。这样所有的代码就已经成功提交了!

3. 忽略文件

准备工作就是要给一个项目创建代码仓库,这里就选择在ProviderTest 项目中创建吧,打开Git Bash,进入到这个项目的根目录下面,然后执行git init 命令,如图7.7 所示。

图7.7

代码仓库现在已经是创建好了,接下来我们应该去提交ProviderTest 项目中的代码。不过在提交之前你也许应该思考一下,是不是所有的文件都需要加入到版本控制当中呢?

在第一章介绍Android 项目结构的时候有提到过,bin 目录和gen 目录下的文件都是会自动生成的,我们不应该将这部分文件添加到版本控制当中,否则有可能会对文件的自动生成造成影响,那么如何才能实现这样的效果呢?

Git 提供了一种可配性很强的机制来允许用户将指定的文件或目录排除在版本控制之外,它会检查代码仓库的根目录下是否存在一个名为.gitignore 的文件,如果存在的话就去一行行读取这个文件中的内容,并把每一行指定的文件或目录排除在版本控制之外。注意.gitignore 中指定的文件或目录是可以使用“*”通配符的。

现在,我们在ProviderTest 项目的根目录下创建一个名为.gitignore 的文件,然后编辑这个文件中的内容,如图7.8 所示。

图7.8

这样就表示把bin 目录和gen 目录下的所有文件都忽略掉,从而使用得它们不会加入到版本控制当中。

排除了bin 和gen 这两个目录以后,我们就可以提交代码了,先使用add 命令将所有的文件进行添加,如下所示:

git add .

然后执行commit 命令完成提交,如下所示:

git commit -m "First commit."

4. 查看修改内容

在进行了第一次代码提交之后,我们后面还可能会对项目不断地进行维护,添加新功能等。比较理想的情况是每当完成了一小块功能,就执行一次提交。但是当某个功能牵扯到的代码比较多的时候,有可能写到后面的时候我们就已经忘记前面修改了什么东西了。遇到这种情况时不用担心,Git 全部都帮你记着呢!下面我们就来学习一下,如何使用Git 来查看自上次提交后文件修改的内容。

查看文件修改情况的方法非常简单,只需要使用status 命令就可以了,在项目的根目录下输入如下命令:

git status

然后Git 会提示目前项目中没有任何可提交的文件,因为我们刚刚才提交过嘛。现在对ProviderTest 项目中的代码稍做一下改动,修改MainActivity 中的代码,如下所示:

 public class MainActivity extends Activity {
    ……
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    ……
    addData.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
        ……
        values.put("price", 55.55);
        ……
        }
    });
    ……
    }
}

这里仅仅是在添加数据的时候,将书的价格由22.85 改成了55.55。然后重新输入git status命令,这次结果如图7.9 所示。

图7.9

可以看到,Git 提醒我们MainActivity.java 这个文件已经发生了更改,那么如何才能看到更改的内容呢?这就需要借助diff 命令了,用法如下所示:

git diff

这样可以查看到所有文件的更改内容,如果你只想查看MainActivity.java 这个文件的更改内容,可以使用如下命令:

git diff src/com/example/providertest/MainActivity.java

命令的执行结果如图7.10 所示。

图7.10

其中,减号代表删除的部分,加号代表添加的部分。从图中我们就可以明显地看出,书的价格由22.85 被修改成了55.55。

5. 撤销未提交的修改

有的时候我们代码可能会写得过于草率,以至于原本正常的功能,结果反倒被我们改出了问题。遇到这种情况时也不用着急,因为只要代码还未提交,所有修改的内容都是可以撤销的。

比如在上一小节中我们修改了MainActivity 里一本书的价格,现在如果想要撤销这个修改就可以使用checkout 命令,用法如下所示:

git checkout src/com/example/providertest/MainActivity.java

执行了这个命令之后,我们对MainActivity.java 这个文件所做的一切修改就应该都被撤销了。重新运行git status 命令检查一下,结果如图7.11 所示。

图7.11

可以看到,当前项目中没有任何可提交的文件,说明撤销操作确实是成功了。不过这种撤销方式只适用于那些还没有执行过add 命令的文件,如果某个文件已经被添加过了,这种方式就无法撤销其更改的内容,我们来做个试验瞧一瞧。

首先仍然是将MainActivity 中那本书的价格改成55.55,然后输入如下命令:

git add .

这样就把所有修改的文件都进行了添加,可以输入git status 来检查一下,结果如图7.12所示。

图7.12

现在我们再执行一遍checkout 命令,你会发现MainActivity 仍然是处于添加状态,所修改的内容无法撤销掉。

这种情况应该怎么办?难道我们还没法后悔了?当然不是,只不过对于已添加的文件我们应该先对其取消添加,然后才可以撤回提交。取消添加使用的是reset 命令,用法如下所示:

git reset HEAD src/com/example/providertest/MainActivity.java

然后再运行一遍git status 命令,你就会发现MainActivity.java 这个文件重新变回了未添加状态,此时就可以使用checkout 命令来将修改的内容进行撤销了。

6. 查看提交记录

当ProviderTest 这个项目开发了几个月之后,我们可能已经执行过上百次的提交操作了,这个时候估计你早就已经忘记每次提交都修改了哪些内容。不过没关系,忠实的Git 一直都帮我们清清楚楚地记录着呢!可以使用log 命令查看历史提交信息,用法如下所示:

git log

由于目前我们只执行过一次提交,所以能看到的信息很少,如图7.13 所示。

图7.13

可以看到,每次提交记录都会包含提交id、提交人、提交日期,以及提交描述这四个信息。那么我们再次将书价修改成55.55,然后执行一次提交操作,如下所示:

git add .
git commit - m "Change price."

现在重新执行git log 命令,结果如图7.14 所示。

图7.14

当提交记录非常多的时候,如果我们只想查看其中一条记录,可以在命令中指定该记录的id,并加上-1 参数表示我们只想看到一行记录,如下所示:

git log 2e7c0547af28cc1e9f303a4a1126fddbb704281b -1

而如果想要查看这条提交记录具体修改了什么内容,可以在命令中加入-p 参数,命令如下:

git log 2e7c0547af28cc1e9f303a4a1126fddbb704281b -1 –p

查询出的结果如图7.15 所示,其中减号代表删除的部分,加号代表添加的部分。

图7.15

7. Git 时间,版本控制工具的高级用法

现在的你对于Git 应该完全不会感到陌生了吧,通过了之前两节内容的学习,你已经掌握了Git 中很多的常用命令,像提交代码这种简单的操作相信肯定是难不倒你的。
那么打开Git Bash,并进入到BaiduMapTest 这个项目的根目录,然后执行提交操作:

git init
git add .
git commit –m "First Commit."

这样就将准备工作完成了,下面就让我们开始学习关于Git 的高级用法。

7.1 分支的用法

分支是版本控制工具中比较高级且比较重要的一个概念,它主要的作用就是在现有代码的基础上开辟一个分叉口,使得代码可以在主干线和分支线上同时进行开发,且相互之间不会影响。分支的工作原理示意图如图11.16 所示。

图11.16

你也许会有疑惑,为什么需要建立分支呢,只在主干线上进行开发不是挺好的吗?没错,通常情况下,只在主干线上进行开发是完全没有问题的,不过一旦涉及到出版本的情况,如果不建立分支的话,你就会非常地头疼。举个简单的例子吧,比如说你们公司研发了一款不错的软件,最近刚刚完成,并推出了1.0 版本。

但是领导是不会让你们闲着的,马上提出了新的需求,让你们投入到了1.1 版本的开发工作当中。过了几个星期,1.1 版本的功能已完成了一半,但是这个时候有用户反馈,之前上线的1.0 版本发现了几个重大的bug,严重影响软件的正常使用。领导也相当重视这个问题,要求你们立刻修复这些bug,并重新发布1.0版本,但这个时候你就非常为难了,你会发现根据没法去修复这些bug。因为现在1.1 版本已开发一半了,如果在现有代码的基础上修复这些bug,那么更新的1.0 版本将会带有一半1.1 版本的功能!

进退两难了是不是?但是如果你使用了分支的话,就完全不会存在这个让人头疼的问题。你只需要在发布1.0 版本的时候建立一个分支,然后在主干线上继续开发1.1 版本的功能。

当1.0 版本上发现任何bug 的时候,就在分支线上进行修改,然后发布新的1.0 版本,并记得将修改后的代码合并到主干线上。这样的话,不仅可以轻松解决掉1.0 版本存在的bug,而且保证了主干线上的代码也已经修复了这些bug,当1.1 版本发布时就不会有同样的bug存在了。

说了这么多,相信你也已经意识到分支的重要性了,那么我们马上来学习一下如何在Git 中操作分支吧。分支的英文名是branch,如果想要查看当前的版本库当中有哪些分支,可以使用gitbranch –a 这个命令,结果如图11.17 所示。

图11.17

由于目前BaiduMapTest 项目中还没有创建过任何分支,因此只有一个master 分支存在,这也就是前面所说的主干线。接下来我们尝试去创建一个分支,命令如下:

git branch version1.0

这样就创建了一个名为version1.0 的分支,我们再次输入git branch –a 这个命令来检查一下,结果如图11.18 所示。

图11.18

可以看到,果然有一个叫作version1.0 的分支出现了。你会发现,master 分支的前面有
一个*号,说明目前我们的代码还是在master 分支上的,那么怎样才能切换到version1.0 这个分支上呢?其实也很简单,只需要使用checkout 命令即可,如下所示:

git checkout version1.0

再次输入git branch –a 来进行检查,结果如图11.19 所示。

图11.19

可以看到,我们已经把代码成功切换到version1.0 这个分支上了。

需要注意的是,在version1.0 分支上修改并提交的代码将不会影响到master 分支。同样的道理,在master 分支上修改并提交的代码也不会影响到version1.0 分支。因此,如果我们在version1.0 分支上修复了一个bug,在master 分支上这个bug 仍然是存在的。这时将修改的代码一行行复制到master 分支上显然不是一种聪明的做法,最好的办法就是使用merge命令来完成合并操作,如下所示:

git checkout master
git merge version1.0

仅仅这样简单的两行命令,就可以把在version1.0 分支上修改并提交的内容合并到master 分支上了。当然,在合并分支的时候还有可能出现代码冲突的情况,这个时候你就需要静下心来慢慢地找出并解决这些冲突,Git 在这里就无法帮助你了。

最后,当我们不再需要version1.0 这个分支的时候,可以使用如下命令将这个分支删除掉:

git branch -D version1.0

7.2 与远程版本库协作

可以这样说,如果你是一个人在开发,那么使用版本控制工具就远远无法发挥出它真正强大的功能。没错,所有版本控制工具最重要的一个特点就是可以使用它来进行团队合作开发。每个人的电脑上都会有一份代码,当团队的某个成员在自己的电脑上编写完成了某个功能后,就将代码提交到服务器,其他的成员只需要将服务器上的代码同步到本地,就能保证整个团队所有人的代码都相同的。这样的话,每个团队成员就可以各司其职,大家共同来完成一个较为庞大的项目。

那么如何使用Git 来进行团队合作开发呢?这就需要有一个远程的版本库,团队的每个成员都从这个版本库中获取到最原始的代码,然后各自进行开发,并且以后每次提交的代码都同步到远程版本库上就可以了。另外,团队中的每个成员最好都要养成经常从版本库中获取最新代码的习惯,不然的话,大家的代码就很有可能经常出现冲突。

比如说现在有一个远程版本库的Git 地址是https://github.com/exmaple/test.git,就可以使用如下的命令将代码下载到本地:

git clone https://github.com/exmaple/test.git

之后你在这份代码的基础进行了一些修改和提交,那么怎样才能把本地修改的内容同步到远程版本库上呢?这就需要借助push 命令来完成了,用法如下所示:

git push origin master

其中origin 部分指定的是远程版本库的Git 地址,master 部分指定的是同步到哪一个分支上,上述命令就完成了将本地代码同步到https://github.com/exmaple/test.git 这个版本库的master 分支上的功能。

知道了将本地的修改同步到远程版本库上的方法,接下来我们看一下如何将远程版本库上的修改同步到本地。Git 提供了两种命令来完成此功能,分别是fetch 和pull,fetch 的语法规则和push 是差不多的,如下所示:

git fetch origin master

执行这个命令后,就会将远程版本库上的代码同步到本地,不过同步下来的代码并不会合并到任何分支上去,而是会存放在到一个origin/master 分支上,这时我们可以通过diff 命令来查看远程版本库上到底修改了哪些东西:

git diff origin/master

之后再调用merge 命令将origin/master 分支上的修改合并到主分支上即可,如下所示:

git merge origin/master

而pull 命令则是相当于将fetch 和merge 这两个命令放在一起执行了,它可以从远程版本库上获取最新的代码并且合并到本地,用法如下所示:

git pull origin master

8. Git 时间,将代码托管到GitHub 上

经过前面几章的学习,相信你已经可以非常熟练地使用Git 了。本节依然是Git 时间,这次我们将会把酷欧天气的代码托管到GitHub 上面。

GitHub 是全球最大的代码托管网站,主要是借助Git 来进行版本控制的。任何开源软件都可以免费地将代码提交到GitHub 上,以零成本的代价进行代码托管。GitHub 的官网地址如下:
https://github.com/
官网的首页如图14.1 所示。

图14.1

首先你需要有一个GitHub账号才能使用GitHub的代码托管功能,点击Sign up for GitHub按钮进行注册,然后填入用户名、邮箱和密码,如图14.2 所示。

图14.2

点击Create an account 按钮来创建账户,接下来会让你选择个人计划,收费计划有创建私人版本库的权限,而我们的酷欧天气是开源软件,所以这里选择免费计划就可以了,如图14.3 所示。

图14.3

接着点击Finish sign up 按钮完成注册,就会跳转到GitHub 的个人主界面了,如图14.4所示。

图14.4

然后我们可以点击右下角的New repository 按钮来创建一个版本库,这里将版本库命名为coolweather,然后选择添加一个Android 项目类型的.gitignore 文件,并使用Apache v2License 来作为酷欧天气的开源协议,如图14.5 所示。

图14.5

接着点击Create repository 按钮,coolweather 这个版本库就创建完成了,如图14.6 所示。版本库主页地址是https://github.com/tony-green/coolweather

图14.6

可以看到,GitHub 已经自动帮我们创建了.gitignore、LICENSE 和README.md 这三个文件,其中编辑README.md 文件中的内容可以修改酷欧天气版本库主页的描述。创建好了版本库之后,我们就需要创建酷欧天气这个项目了。在Eclipse 中新建一个Android 项目,项目名叫做CoolWeather,包名叫做com.coolweather.app,仍然使用的是4.0的API,如图14.7 所示。

图14.7

之后的步骤不用多说,一直点击Next 就可以完成项目的创建,所有选项都使用默认的就好。接下来的一步非常重要,我们需要将远程版本库克隆到本地。首先必须知道远程版本库的Git 地址,可以在酷欧天气版本库主页的右下角找到,如图14.8 所示。

图14.8

点击右边的复制按钮可以将版本库的Git 地址复制到剪贴板,酷欧天气版本库的Git 地址是https://github.com/tony-green/coolweather.git。然后打开Git Bash 并切换到CoolWeather的工程目录下,如图14.9 所示。

图14.9

接着输入git clone https://github.com/tony-green/coolweather.git 来把远程版本库克隆到本地,如图14.10 所示。

图14.10

看到图中所给的文字提示就表示克隆成功了,并且.gitignore、LICENSE 和README.md这三个文件也已经被复制到了本地,可以进入到coolweather 目录,并使用ls –al 命令查看一下,如图14.11 所示。

图14.11

现在我们需要将这个目录中的所有文件全部复制到上一层目录中,这样就能将整个CoolWeather 工程目录添加到版本控制中去了。注意.git 是一个隐藏目录,在复制的时候千万不要漏掉。复制完之后可以把coolweather 目录删除掉,最终CoolWeather 工程的目录结构如图14.12 所示。

图14.12

接下来我们应该把CoolWeather 项目中现有的文件提交到GitHub 上面,这就很简单了,先将所有文件添加到版本控制中,如下所示:

git add .

然后在本地执行提交操作:

git commit -m "First commit."

最后将提交的内容同步到远程版本库,也就是GitHub 上面:

git push origin master

注意,最后一步的时候GitHub 要求输入用户名和密码来进行身份校验,这里输入我们注册时填入的用户名和密码就可以了,如图14.13 所示。

图14.13

这样就已经同步完成了,现在刷新一下酷欧天气版本库的主页,你会看到刚才提交的那些文件已经存在了,如图14.14 所示。

图14.14



作者:宝塔山上的猫
链接:https://www.jianshu.com/p/89f0d3b056a6
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/qhlpptdyfn/article/details/85911506