- Git基础一
- git命令操作
- 本地库操作
- 本地库初始化
- 基本操作
- 查看git当前状态
- 将工作区中的内容add到暂存区
- 将暂存区中的文件rm出去
- 从暂存区commit到本地仓库
- 版本的前进与后退
- 比较文件差异
- 分支管理
- 查看所有的分支
- 创建分支
- 切换分支
- 合并分支
- 解决冲突
- 远程库操作
- 给github项目地址起别名
- 查看地址别名 git remote -V
- 添加地址别名 git remote add
- 推送内容到远程库
- 克隆远程库中的内容
- 将远程库中的内容pull到本地库
- git fetch下载内容
- git merge 合并内容
- 直接 pull 拉取远程库
- 解决 pull 冲突
- 使用SSH免密登录
git的优势:
- 大部分操作在本地完成(也就是本地就有版本库),不需要联网
- 完整性的保证(它会对每一次提交进行哈希)
- 在git的版本库中会尽可能的添加数据,而不是删除数据
- 分支操作非常流畅快捷
- 与linux命令全面兼容
git有这么几个区:
- 工作区:就是你的项目文件中(写代码的地方,你上传的时候不是需要右击你的项目然后git bush吗)
- 暂存区:你在git窗口中使用命令 git add 就会将你的工作区暂存起来(我的理解就是个双缓冲),但是这时你的工作区中的内容并没有上传到本地库中。
- 本地库:在你使用 git add 命令后,使用 git commit 命令将暂存区中的内容上传到本地库中。本地库保存着所有你上传的历史版本。(所以我将暂存区理解成一个双缓冲的作用)
git与github的区别:
- git 是一个版本控制软件,它的作用就是控制历史版本
- github 是一个代码托管中心,它的作用就是存储历史版本到服务器上,维护远程库。但是github并没有git的一些操作。是git与github进行交互将代码存到远程服务器上的。
- 例如在局域网环境下,我们可以使用gitlab作为代码托管中心
- 在外网环境下,我们可以使用github、码云作为代码托管中心
本地库与远程库有两种个交互方式,分别对应本地团队开发、多团队开发两种场景。
- 初始化命令初始化(创建)一个本地仓库:git init。 初始化仓库后会出现一个隐藏文件.git,这个文件就是这个工作空间的本地仓库
git init
需要注意的是!.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。如果本地库乱了,git就不能正常帮我们进行版本控制了!
-
设置签名:使用命令 git config
git config user.name xxx git config user.email xxxxx
形式:(主要作用是使用用户名与Email地址区分不同开发人员的身份)
- 用户名
- Email地址
- 注意!在登录远程代码仓库的时候也需要用户名密码,但是那个用户名密码与这里的签名是一点关系都没有的!
在使用命令时,我们使用参数可以将它们分为两个级别
- 命令:git config 项目级别/仓库级别:在项目中设置的签名的作用与只是这个项目,其他项目你的签名登不进去
- 命令:git config --global系统用户级别:在整个系统中设置的签名的作用域,对所有仓库都可以登进去
- 优先级:就近原则:两个签名都有的话,项目级别优先于系统用户级别
仓库级别用户信息保存在 ./git/config 下,使用cat查看就可以
系统级别用户信息保存在 用户家目录下的 .gitconfig 中
基本操作 查看git当前状态git status
查看你git是在主干还是哪个分支上的
查看你有没有commit文件
查看你是否将文件git add到暂存区
git add . git add# 点为添加所有文件到暂存区, 为添加某个文件到暂存区
首先在添加之前必须git init一下保证初始化存在一个本地仓库,暂存区就是个缓存,只有将项目存在暂存区才能进行commit操作。
git rm --cache . git rm --cache# 点为移除暂存区中所有文件, 为移除暂存区中的某个文件
< file >为你要移出去的暂存区中的文件
git commit # 提交某个文件 git commit# 在提交文件的时候就附带添加信息,这样提交后就不会弹出让vim让你写message了 git commit -m "some message"
在git commit后会出现这个vim界面,就是让你添加一些信息,相当于提交时的注释!
按i向里面写一些信息,然后保存退出
以上就是提交后显示的信息了
[master (root-commit)2xxx],master就是你提交到主干文件中了。root-commit是你第一次提交。2xxxx那堆数字就是你提交时的版本号
first commit 就是你提交时添加的那个信息message
版本的前进与后退# 查看历史提交(也就是查看本地库中的版本迭代信息) git log # 每个版本信息只输出一行(显示head位置,提交message) # 最好用,拥有移动版本的移动次数 git reflog # 每个版本信息只输出一行 git log --pretty=oneline # 每个版本信息只输出一行(哈希值不全显示) git log --oneline
在log中commit后面是一个哈希值索引,提交的版本是以键值对进行存储的。
HEAD是一个指针,指向的当前版本,当移动head的时候就可以将当前工作区为历史版本的工作区
版本历史与回退
-
基于索引 {推荐}:
# 索引值可以是长的也可以是短的 git reset --hard 索引值
git reflog拥有历史的版本移动信息,其他的git更好的查看当前是哪个版本!
reset三个参数对比:
-
--soft
仅仅在本地库移动指针
-
--mixed
在本地库移动指针,并且重置暂存区
-
--hard
在本地库移动指针,并且重置工作区和暂存区
# 和暂存区的文件进行比较 git diff
我修改了hello.txt中的最后一行,添加了几个a。可以看出红色部分为之前信息,绿色部分为修改后的信息。由于git是以行为单位的,所以相当于删除了原行后添加新行。
当使用了git add命令后使用git diff发现没有差异了,所以此命令时工作区文件与暂存区文件进行比较。暂存区存着修改前的文件,工作区里的文件修改了。
# 和本地库中的某一个文件进行比较 git diff <记录索引>
我第二次提交的记录中是没有修改过文件的记录,change那次是修改后提交的记录(也是当前记录)。所以与第二次记录进行比较的时候可以看出差异
分支管理master --主干分支 # 分支的命名以feature为开头(不是必须的) feature_model --一个模型分支
分支用于分模块开发。例如这个小组做的开发失败了,不影响另一个小组。
分支从主干分出来的时候,是拷贝一份主干的内容作为分支的初始化内容。
git branch -v创建分支
git branch切换分支
git checkout合并分支
-
分支合并需要切回接受合并的分支,例如你要将一个分支合并回主干,那么你需要切换回主干才能合并
-
使用merge命令即可
# 切回接收合并的分支,例如master,将merge_branch_name分支合并到master里 git merge
在不同分支里修改同一个文件的同一行,在合并时会产生冲突
他会提示你自动合并失败,需要手动合并,并且当前的状态处于合并过程中的状态(既不是合并前的文件,也不是合并后的文件)
除了我们修改的内容,还增加了一些特殊标记
# 这是当前版本内容 xxxxx <<<<<<<< HEAD xxxxx ======= # 从等号到>>>这个符号是合并内容(master要合并到当前版本) xxxxx >>>>>>>> master
然后我们手动将冲突的内容选择一个,另一个删除掉,保存退出
然后git add提交上去git commit
远程库操作单团队开发
多团队开发
由于github上项目名特别长,所以我们需要将地址存储为一个变量,这样我们每次使用变量进行连接就可以了,不需要输入特别长的地址路径。
查看地址别名 git remote -Vgit remote -V添加地址别名 git remote add
git remote add origin https://github.com/Panda-eat-meat/yctest.git $ git remote -v origin https://github.com/Panda-eat-meat/yctest.git (fetch) origin https://github.com/Panda-eat-meat/yctest.git (push)
这将http那堆地址起一个别名叫origin
- fetch 指明是使用这个地址进行取回(pull)
- push 指明的是使用这个地址进行推送(push)
git push origin master # 使用git push命令 # origin表明你要推送的地址 # master表明你推送到远程库的哪个分支下
在push命令之后会让你登录github的账号密码
克隆远程库中的内容git clone http://xxxx # 使用 git clone命令 # http://xxx 表明你要克隆的远程库的地址
在github上所有项目都是开源的(除非你付费私密),所以clone命令不需要验证。而且克隆命令用于第一次下载远程库,也就是本地没有相关项目的内容,第一次参加项目。如果本地库中有远程库中的内容则需要使用命令 pull 了
克隆命令的另外作用(也就是一个克隆命令额外做了哪些东西):
- 完整的将远程库克隆到本地
- 创建 origin 远程地址别名(不用我们手动创建)
- 初始化本地库(不用我们手动初始化)
pull操作分为 fetch 和 merge。
fetch与clone都是下载远程库中的内容,但是fetch只是从远程库中下载下来,下载下来后并不会修改本地库中的内容。
git fetch下载内容git fetch origin master # git fetch 下载内容命令 # origin 远程库地址变量 # master 远程库中的分支
-
查看 fetch 中的内容
# 首先需要切换到fetch下来的分支中 git checkout 'origin/master' # git checkout 切换分支命令 # 'origin/master' fetch下的内容在这个分支中
你 fetch 下的内容都在这个分支中
现在的分支是本地的master(就叫master)
# 首先你得切换到待合并的分支中,现在需要合并的分支就是本地的master git merge origin/master # git merge 合并命令操作 # origin/master 合并的分支直接 pull 拉取远程库
git push origin master # git push 拉取+合并命令 # origin 远程库地址 # master 远程库分支
pull = fetch + merge
解决 pull 冲突在push的时候,如果说你的内容和远程库中的内容不同,直接上传会覆盖掉远程库中的很多内容,所以git在你push的时候,会先让你pull下远程库中的东西,然后才让你push上去。
但是说你 pull 下的内容和你本地库中有冲突,那么就会让你手动的选择哪些内容留下!
pull解决冲突的方法与merge命令的操作相同
你删除冲突内容然后git add、git commit
使用SSH免密登录使用http地址每次push的时候需要登录,但是使用ssh就不需要。
首先创建一个ssh的地址别名
git remote add origin_ssh ssh地址
在 git 中使用ssh有些局限性,就是登录的时候git只能存储一个ssh
如果我们在设置ssh之前,设置过ssh 需要删除ssh。
# 首先进入用户家目录 cd ~ # 然后删除ssh文件 rm -r .ssh/
然后重新生成一个ssh文件
ssh-keygen -t rsa -C github邮箱地址
使用该命令会生成两个文件:id_rsa、id_rsa.pub
我们查看生成的ssh密匙
# ssh密匙存在id_rsa.pub中 cd ~/.ssh cat id_rsa.pub
然后就会显示密匙,将密匙存在github中的SSH andGPG keys -> New SSH key将密匙存到key中titile随便写。
然后下次push的时候就可以不用登陆了



