前几天想把Android Studio上的代码发布到github,以为很简单的步骤,愣是出现很多错误,所以打算好好学习一下gitO(∩_∩)O,以下是慕课网上课程的学习笔记:
1.初识git
git创始人:Linus Torvalds(也是创造Linux这个开源操作系统的大牛Σ(っ °Д °;)っ)
git是一个分布式的版本管理工具,不同于集中式的需要联网操作(每次提交都把文件推送到版本控制服务器),它可以在线下开发,也可以联网操作,使得每个开发人员都可以从服务器中克隆一份完整的版本库到自己的计算机,提高了效率,而且在本地就能执行提交文件等操作。
版本控制:可以有效记录每次修改代码的变化,同时可以回滚
学习git的重要性:版本控制解决多人协作的问题,提高开发效率
2.git安装与创建git仓库
- git安装
- 下载
如果下载过程中遇到The setup files are corrupted Please obtain a new copy of the program错误,换一个下载网站试试(/≧≦)/ - 安装
初学时安装过程中按照默认配置进行安装即可 - 配置用户信息
因为git是分布式版本控制,所以需要配置用户的用户名和邮箱
安装好之后,在安装路径下找到gitbash,双击,在里面配置用户名和邮箱,如图所示:
所用的两个命令:
git config --global user.name "username"
git config --global user.email "useremail"
注意:如果输入一行,回车后没有错误表示配置成功
查看参数配置是否成功,输入以下命令:
git config --list
如果出现下图中的两行,表明配置成功:
另外:git可以通过 客户端GUI界面 和 命令行界面 两种方式来使用
客户端GUI界面:
下载地址:https://www.sourcetreeapp.com/
安装比较简单,注册部分很快就注册好了,或者可以参考https://www.cnblogs.com/lucio110/p/8192792.html
安装GUI的过程中,Mercurial是版本控制系统高级选项中如下所示的地方要记清自己有没有选(′д` )…彡…彡
命令行通过打开gitbash的界面来进行操作。
-
git仓库的创建
git仓库:可以理解为一个目录,该目录中的每个文件的修改、删除都可以被git追踪
仓库的构建过程。
- 初始化版本库
git init
- 添加文件到版本库
git add
git commit
- 查看仓库状态
git status
接下来演示一个示例:
示例:创建新仓库,添加文件到 --本地-- 仓库:
- 创建新仓库
1.1. 在sourcetree上点击文件--> 克隆/新建 按钮,选择 create 创建新仓库
1.2. 选择目标路径
1.3. 点击创建
这个步骤相当于用git init
命令来初始化版本库
如图所示:
- 添加文件
在左边目录下创建一个文件,并写入内容,保存之后,文件存放在未暂存区,右击该文件,点击添加,文件被加入到暂存区,这部分相当于命令行中的git add
命令
3.提交文件
在软件的下方输入commit的描述,然后点击右下角进行提交
提交之后,会自动创建一个master分支
命令行模式示例:
在界面的右上角有一个“命令行模式”的按钮,可以快速打开命令行
pwd命令:显示当前目录:
ll命令:文件的详细信息:
ls -a 展示所有隐藏与不隐藏的目录:
cat test.txt:展示test.txt文件中的内容
- 创建git版本库:
- 将内容"git repo"追加到文件test.txt中
- 添加文件
- 提交文件
最后再通过
git status
命令查看当前仓库中的状态:
3.git工作流
首先做一个示例,然后再对工作流这个概念进行总结归纳。
- 暂存区到目录区的回滚
如果因为需求变更等原因,需要修改代码,但是在需求变更的过程中,需要暂时停止开发,需要把文件保存到已暂存区域。
如果在这时需求又不需要变更,则在已暂存文件区域右击该文件,将其丢弃:
2.删除第三次已提交的请求
需要右击第二次提交,选择
会弹出如下对话框:
这样就能回滚到它的前一次提交了,而第三次修改后的文件会放到未暂存区域,注意:此时文件中的内容还包括第三次提交时的内容,如果想彻底改回第二次提交时的内容,需要丢弃未暂存区域的文件,如下:
- 删除特定的文件
首先在本地的资源文件工作区中删除该文件,此时该文件在git版本中的状态如下:
需要继续将其添加到已暂存区,并提交后,该文件才能真正被删除
-----------------这里是以上操作的命令行实战演练分割线(#`O′)-----------------
1. 暂存区到目录区的回滚
还未添加到已暂存区的文件在命令行中测试git版本库的状态时:
添加到已暂存区:
此时版本库的状态:
然后用commit命令提交:
临时变更需求:
由于下班等原因暂停写代码,需要先把代码添加到已暂存区(这是因为个人电脑可能会不定期修改,如果没有添加到已暂存区,可能没有记录)
通过以下代码提交到已暂存区:
(临时开发且没有做过自测的代码只添加到已暂存区,而不进行提交)
这时将版本回退到未修改时:
此时文件中的内容如下:
当执行以下操作时,文件中的内容才被完全清除:
此时文件中的内容:
2.删除第三次已提交的请求
在对文件进行第二次修改后,在命令行执行以下操作:
git log
命令可以查看每次comiit的commit号:
通过该命令查看commit号,然后使用以下命令清除目前版本,回滚到上一版本:
3. 删除特定的文件
用如下命令删除:
此时,暂存区已被清除,仓库区还没有被完全清除,需要如下提交一下才可以完全清除:
总结:
- 未暂存区其实代表的就是工作区,相当于存放于资源管理设备中的文件;
- 已暂存区和分支master中都存放了指向objects的指针,其结构是目录树结构;
- objects中实际存放了仓库中的代码,objects相当于一个数据库;
- HEAD是指向master分支的指针;
- 版本库中的reset HEAD只对暂存区中的代码有影响,对工作区中的内容无影响;
- 使用checkout命令后,所有本地仓库就变干净了(如果本地仓库中有未提交的内容,这些内容会被清除);
-
rm --cache
会删除暂存区里的文件; -
checkout HEAD <FILE>
会将head指向的分支中的文件替换掉暂存区和工作区中的文件---该动作很危险,一般不会这么做。
4.本地与远程仓库
- 远程仓库的作用:分享代码,或与其它开发人员合作
4.1 远程仓库的创建:
- 创建SSH key:
(需要创建SSH是由于本地仓库与github之间是通过SSH加密传输的)
登录git-hub,打开settings,侧边栏有个SSH and GPG keys,如下:
然后点击new ssh key按钮:
出现:
在标号(1)处填入密钥名称,在标号(2)处填入key,key的生成命令如下:
ssh-keygen -t rsa -C "emailaddress@163.com"
具体操作如下:
获得key后,到key所在路径下:
将密钥复制到上面github网页中标号(2)的方框中,点击add ssh key按钮,key就生成了,如下:
(注意,这里用的是公钥)
之后,用如下命令判断本地仓库是否和github连通:
ssh -T git@github.com
实际操作如下:
这样本地仓库就和github连通了,但是!!!现在还没有跟远程仓库建立连接,所以接下来就是与远程仓库建立连接的过程(✿‿✿)
4.1 添加远程仓库:
添加远程仓库的命令主要有以下三个:
git remote add origin git@github.com/workflow_demo.git
git pull origin master --allow-unrelated-histories
git push -u origin master
- 第一个命令是将本地仓库与远程仓库关联起来,
git@github.com/workflow_demo.git
是ssh写法,这里还可以填https://github.com/believe563/workflow_demo.git
这种http的写法,origin
表示远程,这里表示添加这一长串所表示的远程仓库到git中 - 第二个命令的作用是将本地当前分支与远程的repository的分支进行合并,这样合并之后才能进行第三步,不然会抛出如下错误:
错误中指出远程仓库中存在本地仓库中没有的文件,所以需要先把远程仓库的文件pull
下来, --allow-unrelated-histories
是告诉git,即使本地和远程有不相关的commit历史,也可以合并本地和远程的分支为一个分支。执行第二步,git bash上显示如下:
这样就可以进行第三步操作了o( ̄ ̄)ブ
(关于master和origin/master的区别请看-->In Git, what is the difference between origin/master vs origin master?)
断开本地仓库与远程仓库的连接:
git remote remove origin
- 第三个命令是将本地当前目录下的代码push到远程的master分支中,
-u
的意思是默认把本地master与远程master相关联,在第二次修改文件内容,进行push操作时,可以只写git push
,不用添加-u
操作
然后现在来个实战操作,再来梳理一下添加远程仓库的过程:
在通过ssh key与github建立连接后,在github创建一个仓库,创建完成后,在仓库页面可以找到仓库的链接:
复制这个链接,在命令行输入以下命令:
这样就在本地添加了远程的这个仓库。
如果现在该目录下是如下状态时:
就可以直接push本地的项目到github仓库中啦:
在最后一个push命令中出现了超时的问题,最后从知乎上找到了答案,感谢伟大的知友,附上链接:
使用github出了些问题?fatal: unable to access;Failed connect to github.com:8087; No error - yun liu的回答 - 知乎
侵删(o゜゜)o
以下是出现问题的语句:
以及解决办法:
sourcetree界面相对比较简单,在commit操作之后,首次push操作只需要右击master,点击 创建拉取请求 按钮,添加远程仓库,并推送就可以了,具体操作看以下几个图:
这样,在sourcetree远程菜单下会出现:
最后:
就可以把修改推送到github啦,°:.( ̄ ̄)/$:.° 。
5.克隆仓库
将远程仓库中的代码克隆一份到本地,然后基于本地代码进行开发,再远程推送,用到的命令只有一个:
git clone git@github.com:believe563/***.git
该命令的作用就是将远程仓库的代码克隆一份到本地
使用该命令后,远程仓库会克隆到当前目录下。
因为此时本地仓库和远程仓库已经建立连接,所以再次修改提交时,只需要用git push
命令就可以
sourcetree克隆仓库需要填写要克隆到的目录:
6.标签管理
标签相当于版本号,上线时,如果想回滚,主要是通过标签来回滚,而不是通过分支或commit来回滚
用到的命令主要有:
git tag //查看所有标签
git tag name //创建标签
git tag -a name -m "commit" //指定提交信息,-m表示可直接输入后面的备注字符串,而不用打开vim窗口
git tag -d name //删除标签
git push origin name //标签发布
- 标签的添加
命令行实现方式:
这样,在github上就可以看到标签号了:
用soursetree添加标签:
添加完成后,sourcetree界面和github界面显示为:
- 标签的删除
命令行:
使用上面的删除标签命令来删除:
这样删除之后本地已经没有标签了,但是远程还有标签,还需要用如下命令删除远程的标签:
sourcetree:
可以看到,标签已被删除,但是更新提交的内容没有被删除
6.分支管理
分支管理有助于个人在公司开发时,(将个人的开发放在单独的分支),既不影响整体代码,又可以保证自己每天的进度被看到。在开发完成后,再与团队的分支进行合并
- 用到的命令
git branch branchname //创建一个分支
git branch //查看当前在哪一个分支上,变绿的分支是当前使用的分支
git checkout branchname //切换分支
git merge thebranchtobemerged //用当前分支合并该分支
git branch -d branchname //删除分支
命令行实现如图所示:
sourcetree上对分支的操作比较简单,这里不再举例
补充说明:
- 关于版本的指定
回到过去的版本:
首先用git log
查看修改日志
然后用git reset --hard commit号
来定位到commit号对应的版本
回到未来的版本:
需要找到未来版本的id,通过git reflog
命令查找
然后用git reset --hard 最近一次的id号(7位)
回到最近一次修改的版本
撤销未提交的修改:
用git checkout 文件路径/文件名
,这个命令适用于被修改的文件没有通过git add
命令添加过,如果被添加过,需要通过git reset HEAD 文件路径/文件名
命令来取消添加,撤销之后再用git checkout 文件路径/文件名
命令来撤销
- 关于忽略文件
像bin目录和gen目录下的文件都是会自动生成的,所以可以在.ignore文件下忽略掉这些文件夹,写作:
bin/
gen/
这样就把bin目录和gen目录下的所有文件都忽略掉,从而它们不会加入到版本控制当中。
- 关于查看
- 查看所修改的具体内容
用git status
查看有没有文件被修改后还没提交的情况
用git diff 某个被修改后未提交文件
来查看具体文件的更改内容
例如,修改了项目中的README.md文件,用git status
命令查看如下:
再用git diff
命令找到该文件下被修改了的具体位置:
注意,如果某句前面是减号,表示删除的部分,加号表示添加的部分。
类似的,如果是修改了Android项目中的某java文件,就写成如下形式:
git diff src/com/example/test/MainActivity.java
- 查看提交记录
用git log
命令查看所有提交记录
用git log 记录id -1
命令查看其中一条记录
用git log 记录id -1 -p
命令查看这条提交记录具体修改了什么内容
- 关于删除
情形1:
将文件夹push到github时,文件夹名变为灰色且不能点击:
首先 删除该目录:
git rm -r --cached .idea #--cached不会把本地的.idea删除
git commit -m 'delete .idea dir'
git push -u origin master
其次 重新执行add、commit和push操作
情形2:
将文件通过git add filename
命令添加到暂存区后,在commit操作后,因为添加的文件夹中有些文件命名太长、有些文件没添加成功等因素,会报错:untracked file...
,这时通过如下命令删除untracked的目录:
git clean -df dirname
然后用git status
查看当前目录文件的提交状态,再重新add commit即可
情形3:
撤销上一次的commit和all changes
git reset --hard HEAD^
撤销上二次的commit和all changes
git reset --hard HEAD^^
还在零碎补充中,找个时间系统补一下各种操作,遇到的问题如下:
- git 中怎样查看未传送(git push)到远程代码库的(git commit)提交?→这里
整篇文章写完啦 学到新的东西会继续更新** o( ̄ ̄)ブ
(感觉还是需要多运用才能得心应手(ง •_•)ง)
gitLab使用记录:
1.git remote -v查看是否和远程连接
2.如何从仓库中下载单个或多个目录
参考https://www.cnblogs.com/elisun/p/8665550.html
有时git库里的东西比较多,我们只希望像SVN一样,只拉取git库的一个目录。
例如:基础代码仓库infra-code_ops有很多基础代码,我们只想拉取仓库里nginx-conf目录的文件。
$ git init infra-code_ops-nginx && cd infra-code_ops-nginx //初始化仓库,并进入该目录
$ git remote add -f origin http://gitlab.xxx.com/ops/infra-code_ops.git //添加远程仓库地址
$ git config core.sparsecheckout true //开启sparse checkout功能
$ echo "nginx-conf/" >> .git/info/sparse-checkout //将nginx-conf/目录写入到该文件中
$ cat .git/info/sparse-checkout //确认查看该文件内容
$ git pull origin master //拉取远程master分支
如果是需要拉取某个分支的内容,首先需要通过git checkout命令切换到该分支,再执行下拉操作
直接下拉某个分支的的代码用如下操作:
如果遇到以下错误:Permission denied (publickey). fatal: Could not read from remote repository.
可以用如下解决方法:
- 终端运行命令:ssh-keygen -t rsa -C "youremail@example.com"
将邮箱换成自己的邮箱
然后cd ~/.ssh可以看到有如下几个文件: - 终端执行命令:vim id_rsa.pub
复制里面的所有内容,在gitee或github找到设置,在设置左侧找到“ssh公钥”,添加一个公钥
就解决问题了