开源社区/职场小白必备:Git入门

262 阅读10分钟

前言

此为Git入门教程。 由于本人能力有限,如有错误还请多多包涵,若能指出则非常感谢。

什么是GIT

git是一款分布式版本控制工具。简而言之,它可以让团队协作开发或者个人开发更加的方便快捷,提高开发效率。

git安装

下载对应的版本即可

git结构

git本地的结构有三部分组成:工作区(Working Directory)暂存区(Stage)本地库(Repository)远程库(Remote) 他们之间的关系如下:

1090617-20181008211557402-232838726.png 通过git命令可以实现各个区域之间的交互。

各区域简单介绍

  • 工作区:你的文件夹的内容
  • 暂存区:文件修改(这里的修改包括新增和删除)之后,通过命令去让Git暂时存放你的文件
  • 本地库:使用Git命令去提交你的文件。并产生一个版本记录
  • 远程库:通过同步本地库到远程库,可以让你的代码实现远程保存。一般远程库是创建于服务器,公司里可能是用的GitLab本地服务器,而全球最大的同性交友网站Github,就是一个出名的代码托管平台。你可以在上面开设自己开源远程库。当然由于总所周知的原因,国内的Gitee(码云)应运而生。

Git创建使用的过程

这里用一个项目建立到使用的过程来复现Git命令的使用场景,让入门更加容易。这里要注意不同命令对于各区域的作用效果。

基于远程库的协作流程

团队内部协作

当你刚入职公司,需要从远程库拉取代码时,是这样的一个流程图:

微信截图_2021102816237.png

注意这里如果是带分支的开发,也是一样的流程

这里还会有设计到邀请新人加入团队的流程:这里先挖个坑

跨团队协作流程

这种情况包括给其他开源项目贡献代码

微信截图_20211028165225.png

或许一开始还看不太明白,但请把下面的流程及命令看完,回过头来就明白了

初始化本地库

首先进入到你准备好的项目目录,进入命令行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@{移动到当前版本需要多少步}

真实效果:

微信截图_20211028173139.png 说明:HEAD@{移动到当前版本需要多少步},会涉及到回退版本的一个命令git reset --hard HEAD~n 这里的n就是多少步

前进后退

基于索引值

基于索引值的命令:

git reset --hard 指针位置
例子:git reset --hard a6ace91 #回到这个状态

示例: image.png

基于指针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 功能分支 开发功能新分出去的分支

微信截图_20211028182443.png

这里还涉及到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检测到你和其他人同时修改了同一行的代码

解决冲突步骤

  1. git pull 拉下并合并远程库到本地库之后,会有冲突(conflict)提示

image.png 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 进入此页:

image.png

点击 create pull request之后:

image.png

仓库所有者该做的事: 适用于被人给你贡献代码 pull request--> 点击对应的pull--> 进入后选择关闭,对话,或者合并--> 点击合并之后输入合并的描述即可

image.png

这里是进入后的示例:

image.png

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

占坑

这里是后续更新的占坑位置