Git学习笔记

  1. 云栖社区>
  2. 博客>
  3. 正文

Git学习笔记

codingcoge 2018-05-10 22:37:35 浏览668
展开阅读全文

之前做项目的时候学的是SVN:

 特点:集中式
 有一个终端服务器,你要提交代码得联网 然后向服务器提交代码 覆盖原来的 
 优点:可记录版本回滚
 缺点:速度慢 得联网

这次主要来介绍一下Git:

特点:分布式
没有终端服务器 可下载到本地进行分支操作
优点:速度快 多人协作 记录所有版本号 可回滚
缺点:没想到

Git是流行的版本控制 建议学习 学习成本也不高 两天足矣
这里只是做简单的教程 让你知道如何实现 本地创建项目到提交修改到远程的版本库和从Github中克隆仓库到本地
git有这几个区域
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库

建议可以直接看廖雪峰的Git教程

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

想深入了解的话 看GitHub入门与实践 这本书很详细

Git背景就不介绍了 直接上操作
使用工具:Git Bash
安装一直下一步 默认安装就好
问:为什么用这个 ?
答:Git Bash和Git CMD区别

第一步:Git初始化

首先需要对git进行初始化 
git config --glotal user.name "jjc"
git config --glotal user.email "1115106468@qq.com"
该config文件保存在c盘的用户名下
以后如果上传远程库的话 会显示 name和email
为了方便交流 最好写英文的

第二步:检查版本号

git version
可以查看版本号

第三步:创建版本库:

方法有两个:
1. 通过命令行
   cd d:/learngit // 自己创建的文件夹 learngit作为版本仓库
                  //cd是切换到d盘learngit文件下  
   git init       // 初始化仓库

2. 可以直接文件夹 然后右键 git init初始化库 
   不用cd进入一个文件夹

注意:版本库里面文本文件的格式要UTF-8 因为中文乱码问题

第三步 :了解版本库机制:
分三个区 :
1. 工作区 //包括.git文件夹 存储底层内容
2. 暂存区 //中间层
3. 版本库 //最终的项目
在版本库中创建的文件都在工作区内 要先add提交到暂存区 然后才commit增订版本库
Git是对操作的管理 而不是对文件的管理
第四步:进行各种操作的命令行

git init                    //初始化一个Git仓库 最先要实现的操作 
git status                  //可以查看仓库的状态
touch README.md             //创建被管理对象   README.md每个项目都有一个 相当于文档
touch aa.txt                //创建被管理对象
git add                     //向暂存区中添加文件
git commit -m “name”        //保存仓库的历史记录 name是给你的最新版本描述信息
                            //也可以直接git commit进行更详细的说明
git log                     //可以查看历史日志信息 如版本信息 提交人名字邮箱 日期
git log --pretty=short 或者--pretty=oneline   //如果嫌弃太长 简述信息
git log  -p 文件             //显示文件的日志和提交前后的差异
git add .                  //该目录下全部文件添加到暂存区
clear                      //清空当前页面
git diff                   //查看暂存区和工作区状态差别
git reset --hard HEAD^     // 返回上一个版本
git reset --hard HEAD~100  // 上100个版本
git reset --hard 3628164   // 返回到指定版本库
cat readme.txt             //可以查看当前文件文本内容
git reflog                 //可以查看历史操作
q                          //返回上一个层次
git checkout -- readme.txt //把readme.txt文件在工作区的修改全部撤销
rm test.txt                //删除文件 只是修改了工作区 还没有提交暂存区
git rm test.txt            //删除文件 修改了工作区并且提交到了暂存区

总结:
在工作区单纯创建文件夹 没用 你得在里面创建文本文件才会提示可添加 而且只提醒文件夹 不会具体到里面的文本文件
git init 后git status显示
Untracked
表示是没有被添加到暂存区中
这里写图片描述

git commit进行更详细的说明
这里写图片描述

初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:

第一步,使用命令git add ,注意,可反复多次使用,添加多个文件;
这里写图片描述
第二步,使用命令git commit,完成。
这里写图片描述

第一次修改 -> git add -> 第二次修改 -> git commit 最新版本只是保存了第一次修改的内容
记住:每次修改,如果不add到暂存区,那就不会加入到commit中

每次修改后 都要 git add . 是当前目录所有文件全部添加 就算是删除也是如此
删除后 也要 add 上传到仓库中 然后commit 保存当前版本 log也可以显示出这个信息
git log
显示历史版本
如果版本数多 拉到底 有个end 但是无法继续输入cmd命令行 可以q返回上一层继续输入cmd
diff:
如果git add . 后再git diff 则什么也不会显示 //因为diff是暂存区和工作区区别
git diff HEAD 可以查看工作区和版本库里面最新版本的区别 然后再commit commit之后没啥显示 //因为此时 工作区和版本库一样
如:git diff HEAD – readme.txt命令 可以查看工作区和版本库里面最新版本的区别

版本回退
这里写图片描述
git reset –hard HEAD^
返回上一个版本
git reset –hard HEAD~100 上100个版本
Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,
上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到你要的版本的commit id是3628164…,于是就可以指定回到未来的某个版本:

$ git reset –hard 3628164
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
版本号用git log就可以找到 是一串哈希值 下图中的 commit后面那一串就是了
这里写图片描述

粘贴复制:
右击copy复制 paste粘贴
Ctrl+ins 复制 ins全名是insert
Shift+ins 粘贴

查看历史操作:
git reflog 可以查看历史操作
然后找到原来版本的 commit id
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset –hard commit id
穿梭前,用git log可以查看提交历史,就可以看到那串哈希值了以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
这里写图片描述

git checkout
命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改, 等于说status 有了两个状态 (git rm 是一个状态 但是工作区和暂存区都修改了 不一样 )现在,撤销修改就回到添加到暂存区后的状态。(第二次对工作区的操作被取消 保留第一次对工作区的操作 而且暂存区中的状态还存在)
这里写图片描述

总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout – file命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令

git reset HEAD file

git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
又到了小结时间。

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file回到添加到暂存区操作前,就回到了场景1,第二步按场景1操作。
这里写图片描述
如果commit了远程版本库
记住不要用reset 因为版本无法回退
这里写图片描述

删除:
rm test.txt
删除文件 但是还要add 才可以 commit
如果是 git rm test.txt 就直接commit
这里写图片描述

如果确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit  
回退删除:
git checkout -- test.txt其实是用版本库里的版本替换工作区的版本,无论  
工作区是修改还是删除,都可以“一键还原” 前提没有add提交到暂存区  
如果是 git rm删除的话 要先git reset head aa.txt 这样撤销添加到暂存区  
的指令 回到添加到暂存区前的状态 这个时候工作区那个虽然aa.txt还是被删除的 只  
是没有提交到暂存区而已 然后 git checkout --aa.txt 直接丢弃工作区的修改 

如果 提交到暂存区 然后再修改  status看的话 有两个操作  git reset HEAD  
aa.txt 只是取消了暂存区内的操作

这里写图片描述
总结:git checkout是撤回工作区操作
git reset HEAD 是撤回暂存区操作
所以 Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

第五步:添加远程库
登陆你的github创建一个新的仓库 具体的创建过程省略 比如创建了learngit
目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的learngit仓库下运行命令:这里写图片描述

绑定remote
首先要把本地版本库和github上的绑定
git remote add origin xxx(你的仓库地址)
这里写图片描述

http和ssh都行 接下来介绍的是ssh的
重点:
在管理Git项目上,很多时候都是直接使用https url克隆到本地,当然也有有些人使用SSH url克隆到本地。这两种方式的主要区别在于:使用https url克隆对初学者来说会比较方便,复制https url然后到git Bash里面直接用clone命令克隆到本地就好了,但是每次fetch和push代码都需要输入账号和密码,这也是https方式的麻烦之处。而使用SSH url克隆却需要在克隆之前先配置和添加好SSH key,因此,如果你想要使用SSH url克隆的话,你必须是这个项目的拥有者。否则你是无法添加SSH key的,另外ssh默认是每次fetch和push代码都不需要输入账号和密码

上传push
由于远程库是空的,我们第一次推送master分支时,加上了 –u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在github页面中看到远程库的内容已经和本地一模一样了

从现在起,只要本地作了提交,就可以通过如下命令:
git push origin master

绑定比较简单
你可以通过本地版本库的 config查看
这里写图片描述

但是push推送就比较麻烦了 你得设置ssh 不然报错 说你没有访问权限
首先查看一下 你电脑有没有.ssh
这里写图片描述
里面有个pub是公匙 还有一个密匙
这里写图片描述
没有怎么办?
这里写图片描述
复制得到的一串码
这里写图片描述
new 添加即可
然后就可以
$ git push origin master
第一次的话 要git push -u origin master
以后就可以直接git push origin master
上传成功标志
这里写图片描述

记住上传的时候这三个是必备的:
这里写图片描述
具体的 内容改天添加 先到这吧
小结
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!

从远程库克隆
这里写图片描述
地址也可以直接复制
这里写图片描述
第一次会出现警告

Warning: Permanently added the RSA host key for IP address '13.250.177.223' to the list of known hosts.

不只可以克隆自己的仓库 还可以克隆别人的
这里写图片描述
只要获得别人的仓库地址就行
没事 以后克隆就不会弹出来了
GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

小结

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

开源许可证:
这里写图片描述

三个东西是注意的:
1. README.md : 来描述你的项目 必要的
2. gitignore 忽略文件什么的
3. LICENSE 开源许可证 可参考如下地址
http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html
4. ssh密匙

目前就学习了这么多 可以实现简单的个人上传 克隆操作

那有个问题就是 如何在github中的md中显示图片?
方法就是 你先把图片一起传到仓库中 然后右击图片有个复制地址
然后 在Markdown中引用图片

![随便起个名字](复制的图片地址)

参考:
https://stackoverflow.com/questions/19660744/git-push-permission-denied-public-key
https://blog.csdn.net/zhang1027963459/article/details/50478340
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
https://www.cnblogs.com/cxk1995/p/5800196.html

网友评论

登录后评论
0/500
评论
codingcoge
+ 关注