我的github&&Git学习资源
我的github&&Git学习资源
分享两篇文章:
其中第一篇为转载原文地址:https://segmentfault.com/a/1190000002413519
第二篇如下,在他人的基础上修改而来:
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。
说白了git就是个软件,可以帮你高效地管理本地代码。Github就是个网站,可以保管你上传的代码。我们在本地使用git整理好自己的代码仓库后可以直接使用git命令上传代码到github。
我们要协同开发一个项目就可能有这样的需求:
- 每个人都可以得到项目的copy。
- 把自己负责的部分开发完成之后提交代码到项目源仓库进行合并。
Git就是这样一款控制本地代码仓库的软件,github就是我们存放项目的平台,每个人都可以从中获取项目copy和提交代码。
Git使用基础教程
1.安装git
Git安装包的下载就不多说了,可以去git官网也可以去其他的一些网站,只不过下载的时候一定要看好系统,windows64位系统就下windows64位版本的。安装也是傻瓜式的双击安装包一直点击下一步就可以了。
2.创建本地代码仓库
2.1 安装完成之后右击鼠标你会发现多了两个选项,分别是“Git GUI Here”和“Git Bash Here”一个是图形化界面;一个是命令行方式。不同版本的git可能有所不同,大家随机应变,不过命令都是相同的,选择“Git Bash Here”,打开之后是这个样子
2.2 首先应该配置一下自己的身份,这样在提交代码的时候git就知道是谁提交的了,命令如下所示(其中加粗部分是自己的信息):
git config –global user.name “yourname”
git config –global user.email “youremail”
2.3 配置完成之后你还可以用同样的命令来查看是否配置成功,只需要将最后的名字和邮箱地址去掉即可,下图是我的git示例
2.4 身份配置完成之后我们就可以开始创建代码仓库了,这里为了演示我创建了一个Android工程,名字叫做LearnGit,工程路径及文件如下所示:
创建代码仓库需要先进入到项目所在目录,可以在bash中使用cd命令,也可以使用windows的资源管理器先进入到项目目录下然后右击–git bash here,就是上图中在工程文件夹下空白的地方右击–git bash here,我一般倾向使用第二种。
然后在项目所在目录下输入如下命令:
git init
可以看到代码仓库创建完成后会在本目录下生成一个隐藏的.git文件夹,这个文件夹就是用来记录本地所有的git操作的,如果想要删除本地仓库,只需要删除这个文件夹就行了。
3.提交本地代码
3.1 代码仓库创建完成之后就可以提交代码了,注意,这里的提交是指提交到本地代码仓库,并不是提交到github。
一个点号”.”代表的是本目录,熟悉linux命令的同学对此应该并不陌生,所以我们可以使用如下命令将本目录所有文件添加进来:
git add .
3.2 将要提交的文件添加进来之后使用如下命令执行提交操作:
git commit -m “first commit.”
-m参数用来加上提交的描述信息,这个是必须的,没有描述信息的提交被认为是不合法的。这样执行两条命令之后所有的代码就已经成功提交了!
4.查看修改内容
有时候我们可能忘记自上一次提交过代码之后修改过什么东西了,这种情况下我们就可以使用git status命令来查看自上次提交后项目改动的内容。
现在我对LearnGit项目中的代码做一点改动,MainActivity的布局文件activity_main.xml初始内容如下所示,这些是创建项目的时候自动生成的:
我把布局文件中的TextView删掉然后添加一个Button
保存之后执行git status命令,结果如下所示:
git status
可以看到git提示我们activity_main.xml文件被修改了。那么怎样看到具体更改的内容呢,这就要借助另外一个命令了,执行git diff命令,结果如下:
git diff
可以看到删去的内容用红色字体标识并且前面有减号,增加内容用绿色字体标识并且前面有加号,由于中间android:layout_width=”wrap_content”一句在更改前后内容和位置都相同,所以git认为它没有变动,用白色字体标识。
5.撤销未提交的修改
5.1 有时候我们的代码可能写得过于草率,以至于原本正常的代码被改出了bug,这个时候只要代码还未提交,我们就可以借助git checkout <文件地址>命令来撤销修改,这个有点像恢复系统备份,用法如下所示:
git checkout <文件夹>
在执行git checkout之后输入git status检查一下,可以看到确实撤销了修改。不过这种方式只适用于还没有执行过add命令的文件。
5.2 如果某个文件已经被执行了add命令,这种方式无法撤销其中改变的内容。这种情况下我们应该先使用reset命令对其撤销添加。假设我已经添加了activity_main.xml文件,现在我可以执行以下命令将其撤销添加:
git reset app/src/main/res/layout/activity_main.xml
6.查看提交记录
在我们开发一段时间后可能已经向git提交过上百次代码了,这个时候你可能已经忘记每次提交都是什么时候,都修改了哪些内容。这种情况下我们可以使用log命令来查看历史提交信息
图中commit后面跟的是这条提交记录的id,如果你想查看某条提交记录具体修改了什么内容,可以使用如下命令:
git log -p
7.分支操作
分支是git中非常重要的概念,它主要的作用就是在现有代码的基础上开辟一个分岔口,使得代码可以在主干线和分支线上同时进行开发,且相互之间不会影响。就像是在ps中画图,为了不影响已完成的部分我们会新建一个图层,在新图层上画好之后再合并到原图层,分支就是那个新建的图层。建议看完第一篇文章后再返回来看一下这部分,这样会对分支有更好的理解。
言归正传,下面就列举一些分支操作命令。查看当前的版本库当中有哪分支使用git branch -a命令,执行结果如下所示:
git branch -a
可以看到当前项目中只有一个主分支存在,也就是master分支,接下我们创建一个新的分支,执行命令git branch liusdev,然后再次执行git branch -a检查是否创建成功
可以看到新分支liusdev已经创建成功了,master前面的星号*代表当前工作在主分支上,现在我们可以使用git checkout liusdev命令来切换到liusdev分支上,切换完毕之后再次执行git branch -a检查是否切换成功
git checkout liusdev命令来切换到liusdev分支
可以看到已经切换成功了,这里需要注意,我们在liusdev分支上做的任何修改提交不会影响到master分支,同理在master分支上所做的任何修改提交也不会影响到liusdev分支。现在假设我们在liusdev分支上修复了一个bug,然而这个bug在master分支上依然是存在的,这个时候就需要使用merge命令来完成合并操作,
没错,我们要将liusdev分支上的改动合并进master分支就要先切换回master分支。如果我们不再需要liusdev这个分支了,可以使用git branch -d liusdev命令将liusdev分支删除掉,结果如下所示:
git branch -d liusdev
8.与远程版本库协作
对项目代码仓库的每一次更新都可以看做是项目的一个新的版本,所以我们又把代码仓库称为版本库。如果是一个人在开发,那么使用版本控制工具就远远无法发挥出它真正强大的功能。所有版本控制工具最重要的一个特点就是可以使用它来进行团队合作开发。首先我们在github的服务器上有一个远程的版本库,团队的每个成员都从中获取原始的代码,然后各自进行开发,当某个成员在自己的电脑上编写完成了某个功能之后,就将代码提交到远程版本库,其他的成员只需要将远程版本库上的代码同步到本地,就能保证大家的代码都是相同的。所以团队中的每个成员都要养成经常从版本库中获取最新代码的习惯,不然大家的代码可能会经常出现冲突。这样每个团队成员就可以各司其职,大家合作来完成一个项目。
同样为了演示,我在github上创建了远程版本库LearnGit:
版本库地址为https://github.com/benxhinGH/LearnGit现在我们可以使用如下命令将代码下载到本地:
git clone https://github.com/benxhinGH/LearnGit
下载完毕之后我们发现在当前目录下多了一个名字为LearnGit的文件夹:
这个文件夹中包含的就是远程版本库中所有的文件,我们需要把这个文件夹下的文件和我们的工程文件进行合并,具体操作就是把LearnGit中的文件复制出来(如果提示文件冲突就选择替换)这里注意复制的时候不要忘了还有一个隐藏的文件夹.git。复制出来之后把LearnGit删除,这样就算合并完毕了。
之后假设我在这份代码的基础上进行了一些修改和提交,那么怎样才能把本地修改的内容同步到远程版本库上呢,这就需要借助push命令了,以本例为例,具体命令如下所示:
git push https://github.com/benxhinGH/LearnGitmaster
这样就把本地代码同步到远程版本库的master分支了
因为我们将远程版本库与本地版本库合并后还没有进行过提交,所以上图中我先使用add和commit命令将代码添加并提交,然后使用push命令将本地代码同步到远程版本库,这样就相当于直接修改了远程版本库的master分支,所以git会要求输入benxhinGH账户的用户名和密码。在实际开发中大家当然不可能直接操作源仓库,大家需要申请自己的github账号,然后fork源仓库到自己的账号下进行开发,觉得功能做的差不多了之后提交pull request申请进行源仓库的合并,这些会在第一篇文章中讲到。
言归正传,我们检查一下远程版本库,发现已经同步上去了:
知道了将本地代码同步到远程版本库上的方法,接下来我们看一下如何将远程版本库上的修改同步到本地。Git提供了两种命令来完成此功能,分别是fetch和pull,fetch的语法规则和push是差不多的,如下所示:
git fetch origin master
其中origin部分指定的是远程版本库的git地址,master部分指定的是哪一个分支。如果我想把远程版本库LearnGit上master分支的修改同步到本地,具体命令如下:
git fetch https://github.com/benxhinGH/LearnGitmaster
执行这个命令后,就会将远程版本库上的代码同步到本地,不过同步下来的代码并不会合并到任何分支上去,而是存放到一个origin/master分支上,这时我们可以通过diff命令来查看远程版本库上到底修改了哪些内容:
git diff origin/master
之后再调用merge命令将origin/master分支上的修改合并到本地主分支上即可:
git merge origin/master
而pull命令则是相当于将fetch和merge这两个命令放在一起执行了,用法如下所示:
git pull origin master
与fetch命令格式相同,就不多说了。