git版本控制—从安装到应用

前几天想把Android Studio上的代码发布到github,以为很简单的步骤,愣是出现很多错误,所以打算好好学习一下gitO(∩_∩)O,以下是慕课网上课程的学习笔记:

1.初识git

git创始人:Linus Torvalds(也是创造Linux这个开源操作系统的大牛Σ(っ °Д °;)っ)
git是一个分布式的版本管理工具,不同于集中式的需要联网操作(每次提交都把文件推送到版本控制服务器),它可以在线下开发,也可以联网操作,使得每个开发人员都可以从服务器中克隆一份完整的版本库到自己的计算机,提高了效率,而且在本地就能执行提交文件等操作。
版本控制:可以有效记录每次修改代码的变化,同时可以回滚
学习git的重要性:版本控制解决多人协作的问题,提高开发效率

2.git安装与创建git仓库

  • git安装
  1. 下载
    如果下载过程中遇到The setup files are corrupted Please obtain a new copy of the program错误,换一个下载网站试试(/≧≦)/
  2. 安装
    初学时安装过程中按照默认配置进行安装即可
  3. 配置用户信息
    因为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是版本控制系统高级选项中如下所示的地方要记清自己有没有选(′д` )…彡…彡


选了LF到CRLF的自动转换

命令行通过打开gitbash的界面来进行操作。

  • git仓库的创建
    git仓库:可以理解为一个目录,该目录中的每个文件的修改、删除都可以被git追踪
    仓库的构建过程。
  1. 初始化版本库
git init
  1. 添加文件到版本库
git add
git commit
  1. 查看仓库状态
git status

接下来演示一个示例:

示例:创建新仓库,添加文件到 --本地-- 仓库:

  1. 创建新仓库
    1.1. 在sourcetree上点击文件--> 克隆/新建 按钮,选择 create 创建新仓库
    1.2. 选择目标路径
    1.3. 点击创建
    这个步骤相当于用 git init 命令来初始化版本库
    如图所示:
    创建仓库的过程
  2. 添加文件
    在左边目录下创建一个文件,并写入内容,保存之后,文件存放在未暂存区,右击该文件,点击添加,文件被加入到暂存区,这部分相当于命令行中的git add命令

3.提交文件
在软件的下方输入commit的描述,然后点击右下角进行提交
提交之后,会自动创建一个master分支

命令行模式示例:

在界面的右上角有一个“命令行模式”的按钮,可以快速打开命令行

pwd命令:显示当前目录:

pwd命令

ll命令:文件的详细信息:

ll命令

ls -a 展示所有隐藏与不隐藏的目录:

展示所有隐藏与不隐藏的目录

cat test.txt:展示test.txt文件中的内容

展示test.txt文件中的内容
  1. 创建git版本库:
git init命令创建版本库
  1. 将内容"git repo"追加到文件test.txt中
将内容"git repo"追加到文件test.txt中
  1. 添加文件
添加文件
  1. 提交文件

提交文件

最后再通过git status命令查看当前仓库中的状态:

查看仓库中的状态

3.git工作流

首先做一个示例,然后再对工作流这个概念进行总结归纳。

  1. 暂存区到目录区的回滚
    如果因为需求变更等原因,需要修改代码,但是在需求变更的过程中,需要暂时停止开发,需要把文件保存到已暂存区域。
    如果在这时需求又不需要变更,则在已暂存文件区域右击该文件,将其丢弃:

暂存区到目录区的回滚

2.删除第三次已提交的请求
三次请求的内容

需要右击第二次提交,选择

重置当前分支到此次提交

会弹出如下对话框:

选择确定

这样就能回滚到它的前一次提交了,而第三次修改后的文件会放到未暂存区域,注意:此时文件中的内容还包括第三次提交时的内容,如果想彻底改回第二次提交时的内容,需要丢弃未暂存区域的文件,如下:

丢弃未暂存区域的文件

文件中的内容
  1. 删除特定的文件
    首先在本地的资源文件工作区中删除该文件,此时该文件在git版本中的状态如下:
删除工作区中文件后该文件在git版本库中的状态

需要继续将其添加到已暂存区,并提交后,该文件才能真正被删除


-----------------这里是以上操作的命令行实战演练分割线(#`O′)-----------------


1. 暂存区到目录区的回滚
还未添加到已暂存区的文件在命令行中测试git版本库的状态时:

git版本库存在未添加到已存区的文件时的状态

添加到已暂存区:

添加到已存区

此时版本库的状态:

已暂存区有文件时版本库的状态

然后用commit命令提交:


首次提交workflow_demo.txt

临时变更需求:


第二行为临时变更的内容

由于下班等原因暂停写代码,需要先把代码添加到已暂存区(这是因为个人电脑可能会不定期修改,如果没有添加到已暂存区,可能没有记录)
通过以下代码提交到已暂存区:
提交到已暂存区

(临时开发且没有做过自测的代码只添加到已暂存区,而不进行提交)
这时将版本回退到未修改时:


回退命令

此时文件中的内容如下:
虽然回退到之前的版本,但文件中的内容并未完全清除

当执行以下操作时,文件中的内容才被完全清除:
清除文件中未暂存区域代码的命令

此时文件中的内容:
文件中的内容

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 远程仓库的创建:
  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仓库中

在最后一个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:

sourcetree删除标签v2.0.1
勾选后会从github上删除

可以看到,标签已被删除,但是更新提交的内容没有被删除

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目录下的所有文件都忽略掉,从而它们不会加入到版本控制当中。

  • 关于查看
  1. 查看所修改的具体内容

git status查看有没有文件被修改后还没提交的情况
git diff 某个被修改后未提交文件来查看具体文件的更改内容
例如,修改了项目中的README.md文件,用git status命令查看如下:

git status命令查看到有文件的变化

再用git diff命令找到该文件下被修改了的具体位置:

注意,如果某句前面是减号,表示删除的部分,加号表示添加的部分。

类似的,如果是修改了Android项目中的某java文件,就写成如下形式:

git diff src/com/example/test/MainActivity.java
  1. 查看提交记录
    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^^

还在零碎补充中,找个时间系统补一下各种操作,遇到的问题如下:

  1. 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公钥”,添加一个公钥
    就解决问题了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容