观前提示

首先注意由于本文章和github相关,所以出现任何bug的时候一定要第一时间检查是否是github连接错误导致的

本文面向对象

手把手教git和github零基础的同学,无门槛放心食用

本文最终目的

简单使用git在github上的远程仓库上进行团队作业,更复杂的操作就要交给自己探索了

正文

准备工作

下载git

去官网https://git-scm.com/download/win下载对应的git,安装无脑next就可以

有那两个git字样就是上传成功

设置你的git用户信息

安装git后要设置用户名和email,以后每次git提交都会使用该用户信息

git config --global user.name "yourname"

git config --global user.email "youremail"

其中yourname是你设置的git提交时的名称

youremail是你设置的git提交时的邮箱

设置完毕后输入git config --list可查看设置好的对应的git配置

git本地仓库

创建

  • 先找个空文件夹打开
  • 进入这个文件夹,点击右键打开Git bash窗口
  • 输入命令git init
  • 看到有**.git**文件生成,说明本地仓库创建成功

本地仓库结构

下面这张图展示了git仓库的大致结构

  • 工作区:包含.git的目录就是工作区,也就是页面显示的区域
  • 暂存区:.git目录下有一个index文件就是暂存区
  • Git仓库:.git文件就是仓库本身,也叫版本库

git本地仓库里的文件上传到版本库总体流程是先从工作区保存到暂存区,再从暂存区提交到版本库

git下文件的状态

使用git status查看文件状态

文件总共分为两大类状态

Untracked

未跟踪状态,一般是新创建的文件还没来的及加入暂存区

Tracked

已跟踪状态,分为三个小状态

  • Unmodified 未修改状态(不会显示)
  • Modified 已修改状态
  • Staged 已暂存状态

举例在工作区里有1.txt,2.txt,3.txt三个文件,对1.txt与2.txt全部提交到暂存区,对1.txt再次提交到版本库,之后修改1.txt与2.txt的内容,对1.txt再次提交到暂存区,3.txt从始到终无操作,结果如上图

这里没听懂没关系,只是为了方便理解上面本地仓库文件提交的流程

本地仓库常用命令

最关键的使用来了!

git add

  • 指令功能是把文件保存到暂存区

  • 正常用法git add filename,这里的filename是指你想保存到暂存区的文件名

  • 拓展用法

如果想把所有未保存到暂存区的文件都保存到暂存区,可以用git add *

git log

  • 指令功能查看日志
  • 正常用法git log即可查看
  • 拓展用法

如果想单独查看某个文件的日志,就可以用git log filename ,这里的filename是指查看的文件名

git commit

  • 指令功能把文件从暂存区提交到版本库
  • 正常用法git commit -m filename "message"这里的filename是指要提交的文件名,不加默认提交所有暂存区文件,message指提交时在日志里写的描述信息
  • 拓展用法

如果直接git commit filename也可以,但会进入类似vim的界面让你输入描述信息,会比较麻烦的说

git reset

  • 回退到某个版本
  • 正常用法git reset --mixed|--soft|--hard commit_id这里的commit_id指版本号,可在git log指令下查看到,不加默认回退到上个版本

上图标黄的一串数字就是版本号

–mixed:此为默认方式,不带任何参数的git reset也和这种方式相同,它回退到某个版本,只保留源码,回退commit和index信息

–soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

–hard:彻底回退到某个版本,本地的源码也会变为那个版本的内容,此命令慎用!

  • 特殊用法git reset --mixed|--soft|--hard commit_id filename这里的filename是指要提交的文件名,功能是只回退某个文件

git堆栈

这里其实已经有点不常用了,可以选择性忽略

在讲解指令前申明,整个git无论有多少个分支只有一个堆栈

git stash
  • 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录
  • 正常用法git stash
git stash list
  • 查看当前堆栈中的内容
  • 正常用法git stash list
git stash pop
  • 将当前stash中的内容弹出,并应用到当前分支对应的工作目录上

由于栈是先进后出,该命令会将堆栈中最近新保存的内容删除

  • 正常用法git stash pop
git stash clear
  • 清除堆栈中的所有内容
  • 正常用法git stash clear

git远程仓库

由于本套指南是github作为远程仓库,所以接下来会有github相关的内容,已经有本地SSH密钥并且已经在github上创建了连接的小朋友可以选择性观看

github相关准备工作

既然是github相关,那在所有步骤之前,别忘了注册github账号

创建本地SSH

  • 随便打开一个文件夹,右键打开git的命令行,输入ssh判断电脑有没有装过ssh,显示usage就说明安装过了(一般来说下载了git就默认装过了)
  • 输入ssh-keygen -t rsa -C "email"这里的email是你注册git的时候用的邮件地址,之后连着摁四次回车,和下图显示一致就是本地ssh注册成功

和github进行远程ssh连接

  • 成功后会在C://Users//用户名下有一个.ssh文件夹,其中id_rsa是私钥(私钥),id_rsa.pub是公钥,打开公钥进行复制全部
  • 在github上右上角头像处的下拉菜单点击settings,选择左侧栏中SSH and GPG keys,点击New SSH Key创建密钥
  • 创建密钥时在下图中填入复制的公钥

创建远程仓库并找到仓库ssh

右上角加号展开菜单选择New repository,直接创建即可

如果是想从远程仓库克隆回版本库推荐创建时Add a README file,如果是想提交已存在的工程尽量不要点否则可能会报错

找到下图仓库的ssh,进行复制

git的分支

在这里紧急插入一下git的分支讲解,有助于后面远程仓库指令的理解

上图右上角蓝色就是分支名称,默认为master

首先需要明确两件事情

  • 分支操作和远程仓库相关操作的操作对象都是版本库和远程仓库,工作区和暂存区不在版本库的文件不但不会被这些操作影响反而会影响操作本身,所以我的建议是每次进行这些操作前都先把文件提交到版本库
  • 分支在版本库和远程仓库之间的操作都是一对一的关系,可以理解为远程仓库到版本库中的满射,且所有的拉取和推送操作都是从a分支到a分支不会分支交叉

可能说的有点乱,上面两点都是我自己总结的,不看也无妨,后续自己可以体会

git branch

  • 查看或者创建分支
  • 正常用法git branch查看所有本地分支或者git branch branchname创建分支,其中branchname是分支名称
  • 特殊用法git branch -r列出所有远程分支,git branch -a列出所有本地分支和远程分支
  • 有个进阶用法,git checkout -b branchname origin/branchname,其中branchname1是要新建的本地分支,branchname2是远程分支,这个函数的作用是将远程分支与新建的本地分支相映射,这也是个很常用的方法

git checkout

  • 切换分支
  • 正常用法git checkout branchname,其中branchname是要切换的分支名称

git merge

  • 合并两个分支

合并后被合并的分支就相当于没了只留个空壳

  • 正常用法git merge branchname,其中branchname是被合并的分支

  • 合并之后的合并分支提交部分文件到版本库时可能会出现 cannot do a partial commit during a merge,只需在提交指令后面加上-i选项即可

git branch -d|-D

  • 删除一个分支
  • 正常用法git branch -d|-D branchname,其中branchname是要删除的分支,如果删除的分支不是当前正在打开的分支就用-d,反之则-D

远程仓库指令

git remote add

  • 指令功能是关联远程仓库
  • 正常用法是git remote add remotename url|ssh这里的remotename代表你给远程仓库起的别名,可以随便取但是建议先取为origin;而url|ssh代表网址或者ssh,由于本指南教学的是github所以这里就填刚才复制的仓库的ssh

git remote

  • 指令功能查看关联的远程仓库
  • 正常用法git remote会查看关联的远程仓库别名
  • 特殊用法想要更详细的远程仓库信息可以git remote -v,如果想删除连接的仓库可以看下一个指令

git remote rm

  • 删除连接的仓库
  • 正常用法git remote rm remotename这里的remotename代表你给远程仓库起的别名

git clone

  • 指令功能是在已有仓库的远程仓库的情况下,让远程仓库无需git init和连接便可关联并拉取到本地

  • 正常用法是打开一个空文件夹,直接输入git clone url|ssh这里的url|ssh代表网址或者ssh,这样远程仓库就被连接并拉取到本地

  • 特殊用法git clone -b branch url|ssh指定拉取的远程仓库分支(默认是main),这里的branch代表分支名称

git push

  • 指令功能是推送本地版本库内容到远程仓库
  • 正常用法是git push remotename branch, 这里的remotename代表刚刚你给远程仓库起的别名,branch代表要推送的分支名称
  • 若想删掉远程分支,则git push remotename --delete branch,这里的remotename代表刚刚你给远程仓库起的别名,branch代表要推送的分支名称

注意一下master有主人的意思,而由于种族运动,github官方已经把默认分支改为main,而git本身的分支默认还是master,这导致推送上github去后需要切换一下分支才能看见文件

  • 特殊用法可以git push -u remotename branch这是让git记住这个分支,之后再想推这个分支就可以直接git push 了,一般建议第一次推的时候加上-u选项

git pull

  • 指令功能是拉取远程仓库内容到本地版本库

注意更新是相对于远程仓库而言的,所以如果远程仓库没有更改版本库如何更改拉取远程仓库的时候都会显示Already up to date,当然push的更新是相对于版本库来说的,同理

  • 正常用法是git pull remotename branch ,这里的remotename代表刚刚你给远程仓库起的别名,branch代表要拉取的分支名称

如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件时会报错fatal:refusing to merge unrelated histories,此时可以在git pull命令后加入参数–allow-unrelated-histories,之后会进入一个vim写日志,写完后文件就被拉取下来了

git fetch

  • git fetch是将远程主机的最新内容拉到本地版,用户在检查了以后决定是否合并到工作本机分支中
  • 一般都是找不到远程分支就fetch一下

总结

总的来说,这篇指南算是把git最基础的功能讲了一下,更多的功能可能后面会接着更新,也欢迎在评论区提出问题,看到了会尽快解答