前言
此为Git入门教程。 由于本人能力有限,如有错误还请多多包涵,若能指出则非常感谢。
什么是GIT
git是一款分布式版本控制工具。简而言之,它可以让团队协作开发或者个人开发更加的方便快捷,提高开发效率。
git安装
下载对应的版本即可
git结构
git本地的结构有三部分组成:工作区(Working Directory)、暂存区(Stage)、本地库(Repository)、远程库(Remote) 他们之间的关系如下:
通过git命令可以实现各个区域之间的交互。
各区域简单介绍
- 工作区:你的文件夹的内容
- 暂存区:文件修改(这里的修改包括新增和删除)之后,通过命令去让Git暂时存放你的文件
- 本地库:使用Git命令去提交你的文件。并产生一个版本记录
- 远程库:通过同步本地库到远程库,可以让你的代码实现远程保存。一般远程库是创建于服务器,公司里可能是用的GitLab本地服务器,而全球最大的同性交友网站Github,就是一个出名的代码托管平台。你可以在上面开设自己开源远程库。当然由于总所周知的原因,国内的Gitee(码云)应运而生。
Git创建使用的过程
这里用一个项目建立到使用的过程来复现Git命令的使用场景,让入门更加容易。这里要注意不同命令对于各区域的作用效果。
基于远程库的协作流程
团队内部协作
当你刚入职公司,需要从远程库拉取代码时,是这样的一个流程图:
注意这里如果是带分支的开发,也是一样的流程
这里还会有设计到邀请新人加入团队的流程:这里先挖个坑
跨团队协作流程
这种情况包括给其他开源项目贡献代码
或许一开始还看不太明白,但请把下面的流程及命令看完,回过头来就明白了
初始化本地库
首先进入到你准备好的项目目录,进入命令行PowerShell
git init
这里会生成.git的一个隐藏文件夹,里面是git工作的文件,不能删除
设置签名
目的是为了之后的代码提交到本地库做版本记录的时候,能够留下标识:谁,在何时,做了提交代码的操作。 这里的签名根据作用的效果分为全局签名和项目级别签名
- 项目级别签名:仅仅在此项目生效
git config user.name tom #设置用户名tom
git config user.email liu@qq.com #设置用户邮箱
- 系统用户级别签名:仅在当前操作系统用户有效
git config --global user.name tom
git config --global user.email liu@qq.com
小结
区别:
--global优先级:
项目级别>系统级别信息保存位置:
~/.gitconfig 文件
基础操作
下面的内容是对Git的简单使用
添加
如果此时你修改了一定文件的数目,准备提交到缓存区
git add fileName #指定文件
git add . #所有
说明:将工作区的文件添加到暂存区
查看状态
此时你想查看一下工作区(Working Directory)和暂存区(Stage)的状态
git status #查看工作区、暂存区状态
提交
将本地代码提交到本地库
git commit -m 'commit message' fileName
说明:将暂存区内容提交到本地库
注意:一定要-m 添加提交描述,不然会进入vim编辑器,此时需要i先进入编辑,写好提交描述后:wq退出编辑
查看历史记录
git log
git reflog #常用
git log --greph #图形显示,更直观
git log --pretty=oneline #漂亮一行显示
git log --oneline #简洁显示
说明:HEAD@{移动到当前版本需要多少步}
真实效果:
说明:HEAD@{移动到当前版本需要多少步},会涉及到回退版本的一个命令
git reset --hard HEAD~n 这里的n就是多少步
前进后退
基于索引值
基于索引值的命令:
git reset --hard 指针位置
例子:git reset --hard a6ace91 #回到这个状态
示例:
基于指针HEAD
这里的两种方法都只能用来倒退版本
- 用^来表示HEAD指针移动步数
git reset --hard HEAD^
例子:git reset --hard HEAD^^
注意:几个 ^ 表示后退几步,这里表示后退2步
- 用~步数来表示HEAD指针移动步数
git reset --hard HEAD~n
例子:git reset --hard HEAD~3,这里表示向后移动3步
reset后退命令的三个参数
通过使用不同的参数,可以选择本地库,工作区,暂存区三者的重置情况
soft: git reset --soft 指针位置
- 仅本地库移动HEAD 指针 #意思是对工作区和暂存区没影响
mixed: git reset --mixed 指针位置
- 在本地库移动HEAD指针
- 重置暂存区
hard: git reset --hard 指针位置
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
删除文件找回
这里的删除文件找回,仅讨论已经提交到本地库的文件,若是只提交到了暂存区的文件,恐怕无法找回。 假设我提交了一次本地库之后,删掉了本地的一些文件,此时找回则可以使用此命令
git reset --hard HEAD
这里没设置移动步数,则表示移动指针到最进一次提交的版本处。
hard参数表示重置工作区、缓存区和本地库,同步为最近版本的样子
文件差异比较
git diff 文件名 #将工作区和暂存区的进行比较
git diff 哈希值 文件名 #和历史中的一个版本比较
git diff #不带文件名,则比较本地库和暂存区之间共同的文件,若暂存区为空,则比较工作区与最新本地库内的共同文件
分支相关的操作
分支的作用在于代码模块化。有了分支,你的代码就能够在模块化的道理上越走越远了。 在团队协作当中,分支就是核心功能了,可以让团队协作开发
一般常用的分支
- master 主分支 生产环境分支一致的版本
- develop 开发分支
- release 准生产分支 大版本更新前,从开发分支分出来,做最后阶段测试,完成后合并主分支
- feature 功能分支 开发功能新分出去的分支
这里还涉及到Git工作流的问题,先埋一个坑
创建分支
git branch 分支名
查看分支
git branch #查看当前各分支的列表
git branch -v #查看各个分支最后一个提交信息
切换分支
git checkout 分支名
git checkout -b 分支名 #创建分支并直接切换到该分支
删除分支
git branch -d test 删除本地已经合并到主分支的test分支
git branch -D test test分支还没有合入当前分支,所以要用-D参数才能删掉。
git push origin --delete test 删除远程test分支
合并分支
git merge xxx
注意:合并分支的时候要明确谁谁合并
我在a分支里面修改了。要合并到master,就先切换到master,然后合并b
解决冲突
协同工作,在所难免会发生冲突。冲突之处在于git检测到你和其他人同时修改了同一行的代码
解决冲突步骤
- git pull 拉下并合并远程库到本地库之后,会有冲突(conflict)提示
2.根据提示手动修改冲突的文件
3.重新添加到缓存区git add .
4.git commit -m "日志信息" 此时这里不能接单个文件了
远程仓库(以GitHub为例)的相关操作
创建远程库地址别名
git remote -v #查看远程地址别名
git remote add 别名 远程地址
例子:git remote add origin https://xxx.git
推送本地库到远程库
想要把本地库的修改同步到远程库
git push 别名 分支名
git push -u 别名 分支名 #-u指定默认主机
例子:git push origin master
注意: 这里会涉及到拉入团队的问题,若远程库主人没把你拉入协作团队,是不能提交到远程库的,此时会有提示无权限。若有权限,需要进行github账号的登录,win10环境下有凭据管理器会自动记录账号密码。做到与ssh一样的免密效果
ssh免密登录
- 输入:
ssh-keygen -t rsa -C GitHub邮箱地址 - 进入
.ssh目录,复制id_rsa.pub文件内容 - 登录GitHub
Settings-->SSH and GPG keys-->New SSH Key - 回到git通过ssh地址创建。
git remote add 别名 SSH地址
克隆
把远程库克隆到本地的目录当中,你进入到指定目录下执行以下命令
例子:git clone https://xx.git
此操作会在本地开设一个本地库
拉取
当你克隆了一个本地库之后,需要更新远程库的内容时,需要用到此命令
pull = fetch + merge
git fetch 别名 分支名
git merge 别名 分支名
git pull 别名 分支名
#这里的别名指的是远程库别名
冲突
这一步可能会存在冲突,当你解决之后重新add commit 即可
协作
邀请人加入团队协作
邀请成员:Settings --> Collaborators -->填写用户名 -->复制邀请链接 copy invite link--> 被邀请的人:打开链接接受邀请 accept invitation
跨团队协作
这里适用于开源社区贡献代码
点击别人Git仓库的fork 到自己的Git仓库 -- > 然后clone下来 修改后推送到远程库 --> 点击Pull Request请求 --> Create pull request发消息
当你push到你fork的自己的远程库之后,点击Pullrequest 进入此页:
点击 create pull request之后:
仓库所有者该做的事:
适用于被人给你贡献代码
pull request--> 点击对应的pull--> 进入后选择关闭,对话,或者合并--> 点击合并之后输入合并的描述即可
这里是进入后的示例:
git stash 命令
此命令用来暂存部分功能,可以理解为一个栈,和git log --oneline 出来的git提交记录一样,是一个栈
压入stash栈中
git add xxx //首先你需要讲文件添加到暂存区
git stash push -u -m "msg" // -u ~ --意思是包含未被跟踪的文件\
git stash push -m "msg" //这里是普通的提交,提交到C,stash缓存站的顶部
git stash // 保存当前修改到stash@{0},stash缓存站的顶部
查看stash栈状态
git stash list //这里会出现栈的状态 :stash@{0} 'msg'
stash@{1} 'msg'
。。。。。。
将stash栈内修改记录取出来
git stash apply stash@{id} //将内容取出来
git add . 将内容重新跟踪
git commit -m 'msg' 将内容提交到分支
取出来也可以用 git stash pop stash@{id}
git stash pop stash@{id}命令会在执行后将对应的stash id 从stash list里删除,而 git stash apply stash@{id} 命令则会继续保存stash id
删除stash栈
git stash drop <stash@{id}> 如果不加stash编号,默认的就是删除最新的,也就是编号为0的那个,加编号就是删除指定编号的stash。\
git stash clear 是清除所有stash
占坑
这里是后续更新的占坑位置