Valentine’s Day 你收到了几枝花,又送出去了几枝花?还是····· Anyway,愿你现在所爱之人是你一生想嫁/想娶之人。
今天说说第三方的代码托管,学习Git的应用,虽然Git提供良好的界面操作,但是我很同意前辈们的看法,技术性质不同于其他,我们应该掌握相应的代码命令,而图形化的操作应该是在你能熟练掌握命令用法的前提下进一步提升工作效率的手段,不要主次颠倒。
本节开始git的学习,我会以一个项目的创建,上传,修改,查找,远程托管等操作进行阐述。
git(不解释了,百度就好)
github下载链接
选择是用你的版本进行下载,然后一路next进行安装即可
使用git
找到你的git安装路径,比如我的路径是—-G:\Git
在下面找到
点击打开效果如图
配置自己的身份
提交如下命令
git config --global user.name "wedfrend"
git config --global user.email "[email protected]"
如果要进行查看自己的配置 是否成功,可以使用
git config --global user.name
git config --global user.email
3 . 创建代码仓库(Repository)
1).进入到Service项目中 使用 cd命令进入项目
此时代码仓库创建完成,在你的项目文件下会生成一个隐藏的.git文件夹,用来记录本地所有的Git操作。
打开自己的项目文件,可以看到隐藏的.git文件夹,如果你的看不到,请在你的 文件—>查看—>将隐藏的项目打钩就可以看到了。
3).使用 ls -al
查看Git的操作
4 .提交本地代码
提交本地代码:`git add`操作命令
git add build.gradle 添加一个单独的文件
git add app 添加一个文件夹
git add . 添加项目下方的整个工程(个人使用居多)
5 .忽略文件
关于git的忽略文件:Git提供一种可配性很强的机制来允许用户将指定的文件或目录排除在版本控制之外,它会主动的去检查代码仓库中的.gitignore
文件,如果存在该文件,便会一行行的读取文件内容,并把指定的文件或目录排除在版本控制之外。.gitignore
中指定的文件或目录是可以用“*”进行通配的。
以android项目工程为例:AndroidStudio在创建项目的时候,会自动为我们创建.gitignore
文件,一个在根目录下,一个在app文件夹下,那么有些android自动生成的文件是不需要进行版本控制android已经进行了排除,在app文件夹下面只有将/build
进行了排除,其实在版本控制中,/src/test
和/src/androidTest
也是不需要进行版本控制,所以添加进去。
此时执行 `git add .`将代码进行添加
6 .提交代码
git commit -m "初建仓库,提交代码。"
如图
此时我们已经将第一版本的代码进行了托管。
git进阶阶段
经过上述的内容,我们已经将Service项目进行了本地托管,但是在实际开发中,我们不可能只有一次代码的提交,比如修改了,删除了,增加了等等都是需要提交,在提交前查看修改了哪些内容等等,这些Git都帮我们记着呢!下面进行git进阶阶段
1 . 查看修改内容
比如在刚才提交的代码的基础上,我对项目中的 MainActivity中增加一行debug输出代码
Log.i("TAG", "onCreate: Add Debug");
那么此时本地代码肯定与Git托管的代码不同,那么我们只需要执行
git status
此时Git便会查找出不同并输出,如图
并且会明确的指明出修改了哪一个类(红色字体指出)
如果我们想要知道具体改了什么内容,执行
git diff +具体路径 如:
git diff app/src/main/java/com/welive/serviceapplication/MainActivity.java
结果如图:
此时将修改的地方指出。
2 . 撤销未提交的修改
上述内容我们明白修改之后如何进行查看修改的类以及详细内容,那么现在我们并不需要将这个修改过的内容提交至git托管,那么怎么办?
1)我们自己在代码中进行删除就好了
2)使用 git checkout
命令 +文件的具体路径
3)在执行 git status
效果如图
此时你在去看你的MainActivity的内容,Debug输出已经被删除
3 . 撤销已添加的修改(执行了 add 命令)
上述方式是在没有执行 git add .
方法时使用 git checkout
进行撤销,那如果手快,没顾及其他进行了 add 命令怎么办?
我们试一下:
将MainActivity添加的logi代码进性add命令
执行 git add .
—>git status
—>git checkout
效果如图:
此时的MainActivity处于已经添加的状态,撤销不下来。当执行了add命令之后,首先要将其取消添加,执行 命令
git reset HEAD
或者 执行
git reset HEAD app/src/main/java/com/welive/serviceapplication/MainActivity.java
均可以取消添加,然后我们在执行
git checkout app/src/main/java/com/welive/serviceapplication/MainActivity.java
便可以将其撤销。
4 . 查看提交记录
git log
提交记录按照时间逆序排列,最后提交的内容最先显示,由于我们目前只提交过一次,所以只显示一条记录,你可以随便改改,提交多次在看看。
记录包含的信息
commit 30c265d08b0c80029a77cb573a4bfb124beb3408
Author: wedfrend [email protected]
Date: Tue Feb 14 15:45:32 2017 +0800
<88><9D><93><93><8C><8F><90><81>
提交的id,提交人,时间,提交的备注。(我的中文会出现乱码,后面解决之后再说明解决办法,若是有看到的人知道,请留言,感激)。
最后多说两条语句
只看 提交id为30c265d08b0c80029a77cb573a4bfb124beb3408这一条记录数据
git log 30c265d08b0c80029a77cb573a4bfb124beb3408 -1
只看 id为30c265d08b0c80029a77cb573a4bfb124beb3408这一条记录并输出详情
git log 30c265d08b0c80029a77cb573a4bfb124beb3408 -1 -p
5 . 关于分支(branch)
分支的概念请浏览:分支的概念以及模式解释
分支:简单的讲在现有代码的基础上开辟一个分叉口,使得代码可以在主干线和分干线上同事开发,且两者之间互不影响。(当然你也可以开很多的分支)
为什么建立分支:直观的认为在主分支中开发就可以了,对于以前的版本直接进行复制存储就好了,要使用的时候直接修改。这样可以,但是笨。坦白讲我之前也是这样使用的,但是身为软件开发者,若故步自封,没有师夷长技的觉悟,或许真的该考虑是否转行,因为迟早会被淘汰。
打个比方:当你开发完一个项目之后,1.0版本上线已经在市场上被大众使用。那么老板肯定不会让你闲着,在原有版本会有新的功能,新的需求进行开发或者改进,那么我们便会投入到下一个版本1.1的开发中。开发了几周后,市场反应1.0版本有bug需要修复(比较敏感的修复之后需要马上上线,不敏感的可以等到下一个版本更新),你运气不好,这个bug属于敏感范畴,怎么办?如果你只有主干线而没有开辟分支,你就会遇到很尴尬的地步。修复bug你的现开发版本已经带有一些1.1版本的功能,上线是不可能了,会有差异化。不修复你急的要死,难道说将新开发的代码备份,删掉,可能你都不记得自己修改过那里了。所以这时候的分支就显得很有必要。对吧?
使用分支即在你上线发布1.0版本时候在代码仓库中建立一个分支,然后继续在主干新开发新的功能,当出现上面这种情况的时候,只需要切换分支后直接修改,上线,之后再将修改后的代码与主干线的代码合并即可。
开始分支的学习
上面的学习中,我们已经将以此代码进行了提交,那么我们去创建一个分支
git branch //查看有多少分支
git branch **** // **** 表示你要新建分支的名字
// 比如:git brabch version1.0
当创建分支之后,使用 git branch
来查看分支
此时存在两个分支 master 和 version1.0
图片上的master分支前面有一个 “*”表示我们现在开发代码还是处于主干线
切换分支
git checkout version1.0
接下来在version1.0分支上进行bug修复,或者新的功能添加
修改完之后,切换到主干线进行代码的合并
git checkout **** // ****要切换到主干线的名字
// 如:git checkout master
git merge **** // ****表示分支的名字
// 如:git merge version1.0
当你确定项目已经不再需要某一个分支的时候
git branch -D **** // ****表示分支的名字
//如:git branch -D version1.0
实践一下:(实践出真知)
1)先切换分支到version1.0
2)在分支上进行操作,在项目中的MainActivity中添加一个方法如下
/**
* 调试并输出当前的时间
*/
private static final String TAG = "MainActivity";
public void showTime(){
Log.i(TAG, "showTime: "+ System.currentTimeMillis());
}
3)执行添加提交操作 即:
git add .
—>git commit -m "version1.0 add"
4)提交成功后,将分支切换至主干线
git checkout master
5)切换至主干线后,查看代码,你会发现你刚刚书写的代码已经不存在了,这也就表示了分支相互独立,互不影响。
6)最后一步就是将分支添加的功能与主干线的代码进行合并
git merge version1.0
合并之后,再去看看代码吧,之前在分支中的操作又合并到主干线中了。
至此本地的git基础常用的介绍已经完成了。其实也没有那么复杂!!
将代码托管到GitHub上与远程版本库协作
至此,远程仓库已经建立完成。接下来要将本地的代码进行远程托管。在这之前,我们还需要做一些事情 。
[1]还记得你的Service项目中有一个隐藏的.git
的文件夹吗,将这个文件夹删掉,先取消本地的托管。(当然这一步可以不做)
就是这个 https://github.com/wedfrendwang/Service.git
上述两步完成之后,将远程版本库克隆到本地来,继续下面的步骤:
[3]打开Git Bash 并切换到 Service 工程项目下
[4]输入
git clone https://github.com/wedfrendwang/Service.git
将远程版本克隆,看到如图中的文字表示已经克隆成功
[5]此时打开你的 项目 文件,你会发现在你的项目中多了一个文件夹 Service
[6]现在需要做的事情就是 将这个Service文件夹的所有文件复制并粘贴在你的工程项目的根目录中。
上面的文字要是没有理解看下面:(我的Service项目在电脑的f盘的 AndroidStudio文件夹下)
[6.1] F:\AndroidStudio\Service 这是我的工程目录
[6.2] F:\AndroidStudio\Service\Service 这是执行克隆远程仓库后多出 来的文件夹
[6.3] 现在要做的就是将 [6.2]文件夹下的所有文件 复制到 [6.1] 的路径下。(切记,隐藏文件.git
也是要进行复制的)
[7] 在复制过程中出现如图中的提示
选择 替换目标中的文件就好
[8] 复制粘贴完成后,便可以将 Service 文件夹删掉了。
[9] 之后你用AndroidStudio打开你的项目,可以看到
这些类颜色变为红色,这里并不是你的代码出现错误,只是与远程版本库的不同而已,怎么解决呢?只需要我们将本地的内容同步到远程版本库即可。
同步远程仓库并与远程版本库协作
1 . 提交代码至远程仓库
接上面的步骤 ,现将本地代码进行 add .
—> commit
操作
git add .
git commit -m "First commit github"
之后进行同步命令
git push origin master
解释:提交命令
git push origin master
/**
* origin:指定远程版本库Git的地址
* master:指定同步的分支
* 整句话的意思:将本地代码同步到 https://github.com/wedfrendwang/Service.git这个版本库的master分支上
*/
2 . 将远程版本库上的修改同步到本地,git提供fech
,pull
两种命令来完成此功能,origin master
的意思同上
[2.1] git fetch origin master
解释:该命令执行后会将远程版本库的代码同步到本地,但是不会进行任何合并的操作,而是将同步下来的代码存放在一个 origin/master的分支上。
那么我们就可以通过 diff
命令来进行查看到底修改了什么
git diff origin/master
当我们经过确认后在进行合并操作
git merge origin/master
进行实践一下:
因为目前的所有操做只有我一个人在做 ,并没有其他的同事一起开发,所以这里我简单的说一下
step1:将你的Service工程进行修改,添加输出在MainActivity中
Log.i("MainActivity", "onCreate: change something");
setp2:然后将代码进行添加、提交、同步等操作
git add .
git commit -m "add debug"
git push origin master
此时版本库的代码已经是最新的代码了,可以进行日志查询
git log
step3:此时版本库的已经是最新的代码,要将远程的同步至本地,需要代码有差异化,那么先在本地的MainActivity中删除之前添加的
Log.i("MainActivity", "onCreate: change something");
在添加一句代码
Log.d("MainActivity", "onCreate:add ");
step4:同步远程代码至本地并查询不同点
git fetch origin master
git diff origin/master
效果如图
“-”号(红色)表示我们本地进行删除
“+”号(绿色)表示我们本地进行添加
step5 : 检查之后,没有什么疑问的时候,便可以进行合并操作
git merge origin/master
之后我们在进行提交,同步等操作即可
[2.2] git pull origin master
对于这个方法没什么可以多说的,简单讲 pull 是 fetch 和 merge的结合体
最渺小的我 最卑微的梦
我发现这世界没有那么那么的不同
现实如果对你不公 别计较太多
走吧 暴风雨后的彩虹
结束语:对于Git的学习至此告一段落,Git的功能异常强大,作为最火的第三方托管,其重要地位不言而喻,也希望所有的程序人共同进步,不求改变世界,只愿世界更加美好。