代码转移到git 上也有近一年,但一直都是在用Android Studio 来管理git,最近部门又在倡导规范使用git,看着后端的大哥们用命令行来控制git。感觉自己用着工具太low了,暗暗发誓辣么高大上的命令行一定要掌握,所以就开始了我的为期2天的命令行之路
git 的起源和历史用的伙伴们应该都了解过,这里我也就不再啰嗦一遍,直接说一下在Android实际操作中用得到的东西,可能有些理解不是很恰当,但是也算是自己掌握的东西了。
一、 前期的准备工作(以下的所有操作都是在已安装git版本控制的前提下)
在自己的gogs git服务端创建一个新的仓库,就会得到一个引导性的提示“快速帮助”
这里面包含我们新建的仓库两种形式的地址 即http 和gogs协议,这个地址的选择要看后台搭建的时候支持那种,这里我就选择http的了。
还包含了从命令行创建仓库可执行的命令
我在我的E盘下创建一个名为gitText的文件夹,文件夹里仅有一个名为git001的txt文本如图
之后我将把gitText文件夹通过命令行上传到git上管理,并且进行一系列的测试
二、开始测试
右键文件夹gitText选择Git Bash Here 打开,进入到当前文件夹,效果如图
1、根据图1的提示进行操作
touch 命令是创建一个文件
git init 是在本地创建一个git 仓库,成功后getText文件夹下会生成一个.git文件,默认隐藏,可以设置显示
git commit -m 为本次提交添加描述 把代码提价到本地仓库
git remote add origin 添加仓库地址
git push -u origin master 将本地仓库推送到远程指定默认主机上(含 -u master 分支名称)即将本地仓库代码推送到远程指定分支上
初次提交这里有一个bug可能会遇到
当不执行git commit -m "first commit" 时会报错
如果不设置git 的账号的话也会提交失败,查看git 的【配置】使用git config --list可查看所有配置,设置git 的用户名和密码使用如下指令
git config --global user.name yourName
git config --global user.email yourEmail
添加git commit 指令后如图:
有人可能会好奇为什么文件夹gitText后会有一个master 这是当前分支,分支的相关操作一会儿会说
提交成功后可以在后台看见提交的文件
2、对git001文件进行编辑后如何提交
git 文件有三种状态,即committed 已提交、modified 已修改、staged 已暂存
git 有几个常用的命令
git status 查看仓库的状态,会指出是否有新建的文件,修改的文件或者删除的文件等,即所有已追踪文件的状态
当我在git001文件内添加几个数字111111111111111并保存后,执行git status 命令
文件进入已修改状态,并且会提示你下一步操作,需要添加git add 或者git commit -a
git add 文件名 添加指定文件到监控工作区的状态树
git add . 他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除 的文件。
git add -u 他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)
git add -A 是上面两个功能的合集(git add --all的缩写)
执行git add. 后查看git status 文件添加追踪成功,依次执行git commit 和git push -u origin master ,将本地修改提价到仓库
这样就可以把修改的内容提价到线上了,在后台可以看见修改后的内容
有时候提价了某些内容后悔了,想回退到某个提交之前的状态,这就需要版本回退 的相关操作了
3、版本回退
想回退版本,首先要知道都提交了那些版本,这是采用git log的指令查看提交日志
commit 的版本id
Author 的提交者的信息 用户名 邮箱
Date 提交时间
first commit 提交时的信息描述
我们可以根据commit id去回退到指定版本(版本回退是针对本地仓库的,远程仓库不会修改)
git reset commitId
id可以只写一部分,此时查看代码发现本地代码回退到first commit 状态
//注意使用--hard参数会抛弃当前工作区的修改//使用--soft参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交
版本回退后如果立即使用git push origin 分支名 命令会提示本地版本落后于远程版本,需要把远程版本也拉低使用命令
git push origin 分支名称 --force 之后就可以正常使用了
如果进行了版本回退以后又变卦了不想回退了想回到之前的状态,唉呀妈呀好变态啊,这时执行git log命令发现找不到second commit 的提交id了
没关系git总是那么的人性化,执行git reflog 可以查看每一次提交的id so easy 回到想回去的点 然后拿到commit id 执行git reset --hard 就好了
4、分支
master 是主分支,在开发的时候一般都会在自分支上进行开发,待功能完善后在与主分支合并
git branch 查看分支,会列举出所有的分支,且当前分支前会有一个*号
git branch BranchName 创建一个新的的分支BranchName
git checkout BranchName 切换到BranchName 分支上(工作空间在BranchName 分支上)
git checkout -d newBranch 创建并切换到newBranch 分支上(git branch 分支名称+git checkout 分支名称)
5、分支合并
git merge 命令用于合并指定分支到当前分支
根据上述操作当我在newDev分支上对文件git001进行操作,删除之前的内容,执行
git status---->git add .----->git commit -m "third commit"------>git push -u origin newDev
提交到远程
此时我要把newDev分支与master分支合并执行
git checkout master------> git merge newDev
这样就把newDev分支上开发的内容合并到了master主分支上,当newDev分支没有用了的时候可删除分支
执行git branch -d newDev 删除本地newDev分支
执行git push origin --delete newDev 删除远程分支
合并必然会存在冲突,实际操作一下冲突怎么解决
6、解决合并分支时的冲突
冲突的产生: 当在不同的分支对同一个文件进行操作的时候,合并必然产生冲突
当我在本地dev分支中对文件git001的第一行进行修改如添加字符串222222222222222提交到远程
切换到主分支master (主分支下的git001文件第一行存在数据111111111111111)
此时把自分支dev 合并到主分支master上即执行下列操作
merge failed 提示在文件git001 中存在冲突,这时打开git001文件
选择需要的内容
在master分支上(执行merge冲突的这个分支)执行如下指令
这时自分支dev上的内容就合并到了主分支maser上
当合并的过程中不想合并了可以执行 git merge --abort 回到合并前的状态
还有一个指令是git merge --continue 合并中止了继续合并的命令
7、标签操作
git除了每次提交的commitid可以标记提交的点以外,还有一种标签tag,这个tag一般用来为每次发布的版本来做记录,每一个标签都代表一个已发布的版本
git tag 查看已有标签命令
git tag -a 标签名 -m "标签信息" 创建标签
git push origin --tags 推送本地标签到远程
git tag -d 标签名 删除本地标签
git push origin :refs/tags/标签名 删除远程仓库标签
8、一些其它命令
当我们和他人共同开发,远程仓库是别人已创建好的时候,需要从远程拉取代码到本地,需要clone
git clone 地址url
git help 指令获取git完整的使用说明
git remote git remote -v 查看源
git remote set-url origin 新的url 修改源
git remote rm origin 结合 git remote add origin 新url 修改源
git blame 文件名 查看指定文件是谁修改的
git blame -L lineFrom,lineTo 文件名 产看指定文件从那行到那行是谁修改的
git config --global core.finemode false 忽略文件权限
git config --global core.ignorecase false 忽略字母大小写
在windows中单独设置
git config --global core.autocrlf false 换行符转换
git config --global gui.encoding utf-8 避免ui乱码
git config --global core.quotepath off 避免git status 中文文件名乱码
9、实践中拓展问题
今天在自己clone远程仓库的时候发现没有同时下下来远程分支代码,这时候执行git branch 命令,只能看见主分支和自己新建的分支,然后想查看一下所有的分支
执行了git branch -a 命令,看到了远程端的所有分支,分支显示名称均为红色,下载远程端分支只能在本地创建一个与远程端分支同名的分支 例如:远程端有一分支名为Yong
则执行命令为 git checkout -b Yong origin/Yong 即可,此时创建的新分支YongYu代码就与远程分支YongYu相同了
在Android 开发过程中,项目里会有许多本地相关的配置文件,这些是需要忽略的,这些忽略的内容是设置在.gitignore文件中
再来记录一下.gitignore 文件的应用吧!!!
来源自己测试的经验。
脑补一下git的忽略规则 http://www.cnblogs.com/kevingrace/p/5690241.html
在使用Android Studio开发的过程中 有一些文件是可以不用每次都提交的本地配置之类的
自动生成的 .iml文件
.gradle build 文件
本地的local.properties文件等
下面是我使用的.gitignore文件
#*.iml #.gradle #/local.properties #/.idea/workspace.xml #/.idea/libraries #.DS_Store #/build #/captures #.externalNativeBuild #.idea # ---> Android # Built application files *.apk *.ap_ # Files for the Dalvik VM *.dex # Java class files *.class # Generated files bin/ gen/ *.iml # Gradle files .gradle/ build/ # Local configuration file (sdk path, etc) local.properties # Proguard folder generated by Eclipse proguard/ # Log Files *.log # Android Studio Navigation editor temp files .navigation/ # Android Studio captures folder captures/ .idea .gradle在实际的使用过程中,如果修改了.gitignore文件,会发现没作用,这是需要执行
git rm -r --cached .
git add .
git commit -m "update .gitignore"
即清楚本地缓存即可