git基础

94 阅读16分钟

开始准备

1. 首先需要前往git官方网站安装git环境: Git (git-scm.com)

然后我们需要去创建一个仓库,一般国内仓库是码云(速度快但资源少),国外仓库是github(速度慢,但资源多,有时都进不去,最好是有梯子)

2. 紧接着自行创建一个项目

image.png

3. 通过shift+鼠标右键点击项目文件夹中空白区域,然后打开powershell控制台,输入git init来初始化一个.git文件夹

image.png image.png

只要我们的项目文件目录中有一个.git的隐藏文件夹,那么就代表我们的项目文件已经被git所管理,可以通过git命令来控制项目文件

配置身份及公钥

如果我们是第一次使用电脑进行git,那么需要配置一下自己电脑中git的身份及SSH密钥

可以通过git config --list检查配置信息,查看一下user.nameuser.email是否配置

如果没有配置,那么需要配置全局账号与邮箱,同样是在powershell中:

1. 配置user name 与email

git config --global user.name "名字"

git config --global user.email "邮箱"

注意:名字和邮箱只是一个别名,没有什么要求

2. 生成SSH密钥

在终端执行ssh-keygen -t rsa -C "邮箱"命令,就会在C盘中本机用户的根目录下生成一个ssh文件夹

,进去打开id_rsa.pub,复制里面的内容

image.png

3. 然后去自己的远程仓库中配置ssh密钥

image.png

4. 删除凭证

同时需要注意,如果这台电脑之前有人使用过了giteegithub,那么电脑会自动生成一个对应网站的windows凭证,上面记录着他的远程仓库的账号密码,如果你想要使用自己的giteegithub,则需要前往凭据管理器中删除该凭证

如果不删除该凭证的话,那么请求会被拒绝并返回403

win10直接搜索凭据管理器打开即可

建立远程仓库与本地仓库的连接

既然我们要上传文件到远程仓库中,那么必须建立本地仓库和远程仓库的连接

首先可以使用git remote -v查看远程仓库的信息,如果提示错误则证明还未建立连接

image.png

而建立连接的方式有两种:

第一种,git clone url,这种方式可以把远程仓库中的项目文件直接克隆到本地,并且.git文件夹中已经建立好连接了(一般是你去到新公司,负责人会把项目所在远程仓库的地址给你,直接使用该命令即可)

url是远程仓库的地址

第二种,git remote add origin url

origin是远端仓库的默认别名,你也可以通过git remote rename 旧名字 新名字来命名

远程仓库的地址一般就是这里面的链接:

image.png

git的工作流程

接下来我们将来介绍一下git的主要工作流程

image.png

Workspace工作区

就是平时进行开发改动代码的地方,即项目文件所在的文件夹,我们一般都是使用IDE打开文件夹编写代码

你可以使用git restore撤销工作区中对文件的修改,或者使用git restore .撤销工作区中对所有文件的修改

比如:当你修改了README.md文件之后,使用git restore ../README.md命令便撤销了修改,或者也可以通过git restore *.md撤销所有md文件的修改

../README.md相对于.git文件夹的路径,可以通过git status查看被修改文件的路径stage

image.png

注意这种操作很危险,是直接撤销了对文件的所有修改

Index暂存区

暂存区中标记了当前工作区中哪些内容是被 Git 管理的

当你在工作区中修改了某文件,使用git add <文件名>可以将文件添加到暂存区,或者使用git add .将所有修改过的文件添加到暂存区

如果想要撤销git add操作,可以通过git restore --staged A放弃某次add操作,或者使用git reset HEAD放弃暂存区中所有的add操作

注意先使用git status来查看被修改文件的路径

image.png

git status查看状态

通常我们需要查看一个文件的状态:git status

  • Changes not staged for commit:表示文件在工作区中被修改了,但是还未添加到暂存区
  • Changes to be committed:文件放在暂存区了,等待被提交到本地仓库
  • nothing to commit, working tree clean:暂存区中已经没有内容了

Repository本地仓库

位于自己的电脑上,通过 git commit -m "第一次提交" 提交暂存区的内容进入本地仓库,git commit要求必须要有提交的留言,所以后面得跟上-m "留言"

checkout检出本地仓库代码

本地仓库保存有我们提交(commit)过后的文件

这就代表如果我们工作区中的代码不小心被删了,或者是我们不小心使用git restore .撤销了所有的修改,那么我们就能够通过git checkout -- "文件名"来恢复

例如:git checkout -- *.vue,检出所有的vue文件并覆盖本地对应的vue文件

注意,如果想要检出代码恢复,那么要求是已经commit过了,如果没有提交过,那么本地仓库中也不会有对应的代码文件

而且最重要的一点,checkout检出文件会覆盖我们工作区的文件,所以除非是你想还原,否则轻易不要使用checkout

Remote:远程仓库

用来托管代码的服务器,本地仓库修改完代码后通过 git push 命令同步代码到远程仓库,但是在git push之前

更改别名

远程仓库都有一个默认的别名origin,我们可以通过git remote rename 旧名字 新名字来更改别名,

公司内部有不同的团队A和B在同时开发,由于一些权限问题,两个团队不能看到对方的代码

A团队只能看到远程仓库remote 1中的代码,B团队只能看到远程仓库remote 3中的代码

只有项目负责人能看到双方的代码,并且时不时将他们的代码合并,部署到远程仓库remote 2

对于管理人员,就需要用不同的远程仓库地址来管理了。而这个不同的地址,在git中就会有一个代表,有一个名字,这个默认的名字就叫做origin,当然也可以是其它的名字

克隆(clone)拉取(pull)与推送(push)

配置了远程仓库之后,可以进行代码的克隆、拉取、推送

clone

通常到拿到新项目的远程仓库链接要做的第一件事情就是使用clone

git clone url url是远程仓库中项目的链接

你还可以通过添加../文件夹名设置项目文件夹的名字和路径

使用clone拉下的项目文件夹已经建立好和仓库的链接了,以后直接git push即可,无需再像这样去推送代码:git push -u origin "master"

push

git push -u origin "master"

第一次推送时需要使用-u,这一句相当于下面的代码:

//将远程仓库origin的master分支与本地仓库master分支关联
git branch --set-upstream-to=origin/master master
//推送
git push origin master

往后我们只需执行git push。这里运行git push时候省略了一些参数,通常我们只有一个远程仓库,所以就默认推送到了远程的origin这个地方

git push test localbranch:remotebranch

test是远程仓库的名字,local是本地分支的名字,master是远程分支的名字,当本地和远程分支名称不同时,可以通过这种方法push到远程特定的分支

pull

当我们本地仓库已经有项目的代码了,而且已经做出了修改,但是我们不能直接push给远程仓库

因为远程仓库中已经被别人push了最新的修改,所以我们每次push之前必须先使用pull拉取最新的代码,并与本地仓库中的代码进行合并

如果有冲突(比如同时对某个文件进行修改)那么就解决冲突,解决好冲突之后再将代码push到仓库中

所以git pull就相当于 git fetch + git merge,将远程 repository 里最新的项目下载过来,并且与本地代码merge

clone和pull的区别:pull是合并代码,有冲突的话需要解决冲突。而clone是将项目代码直接拷贝到文件夹中

git pull origin remotebranch:localbranch

将远程指定分支 拉取到 本地指定分支上

git pull origin remotebranch

将远程指定分支 拉取到 本地当前分支上,可以省略冒号后的内容

git pull

这里运行git pull时候省略了一些参数,通常我们只有一个远程仓库,所以就默认拉取origin

分支的作用

一般项目中常见的几个分支有:

master主分支

用于部署生产环境的分支,我们不能直接修改master主分支中的代码

develop分支

开发人员进行开发时的分支应该都是基于develop分支,而不应该去动master分支上的代码,比如推送最新的完成和bug修复后的代码

future分支

开发新功能时用到,以develop分支为基础创建future分支,比如future/userCenterfuture/dataCenter

release分支

这是发布测试阶段的分支

不管是本地仓库还是远程仓库中都有分支的存在,下面是一些常见的应用场景

首先分支是由指针所管理的,不管是合并还是删除改动之类的操作都很快

其次在团队中,项目的不同版本可以在不同的分支上进行开发,这样互不干扰,效率和容错率都很高

比如你的项目在版本1.3的时候已经发布了(1.3版本位于master分支),

然后项目负责人要求你开发新功能,你可以在版本1.3的基础上新建一个future分支,在future分支上开发新功能

当你新功能开发得差不多的时候,这时1.3的版本出现bug,项目负责人要求你先解决bug后再继续迭代新的功能

你就可以在版本1.3(处于master分支)的基础上新建一个develop分支,在develop分支中修改bug

当bug解决了,将develop分支上的代码合并到版本1.3(位于master分支)上直接发布1.3.1版本

紧接着将develop分支上的代码合并到future分支上,继续迭代新功能,新功能开发完成后就将future分支合并到master分支上发布1.4版本

以上便是分支在团队合作中的作用

git常见的命令

主要命令

  • git restore

    撤销工作区中对文件的修改

  • git add

    将工作区中修改的文件添加到暂存区

  • git restore --staged XXX

    放弃某次add操作

  • git reset HEAD

    放弃暂存区中所有的add操作

  • git checkout -- "文件名"

    检出本地仓库中的文件覆盖工作区中的文件(慎用)

  • git commit -m "第一次提交"

    提交代码修改到本地仓库

  • git clone url ../test

    克隆远端仓库中的项目到当前目录的上一层test文件夹中

  • git push -u origin "master"

    链接当前分支与远端分支,然后push本地仓库中的代码待远程仓库中

  • git push

    如果分支链接成功了,直接使用push即可

  • git push test localbranch:remotebranch

    推送代码到不同的分支

  • git pull origin remotebranch:localbranch

    拉取指定的远程分支中代码到本地指定的分支中

  • git pull origin remotebranch

    拉取指定的远程分支中的代码到当前分支

  • git pull

    如果分支链接成功了,直接使用pull即可

  • git remote rename 旧名字 新名字

    给远端仓库重设别名

查看命令

  • git status

    查看工作区和暂存区中的修改记录

  • 列出当前配置

    git config --list

  • 列出Repository配置

    git config --local --list

  • 列出全局配置

    git config --global --list

  • 列出系统配置

    git config --system --list

  • 查看远端仓库信息

    git remote -v

配置命令

  • 配置用户名

    git config --global user.name "你的名字"

  • 配置用户邮箱

    git config --global user.email "你的邮箱"

  • 配置公钥

    ssh-keygen -t rsa -C "你的邮箱"

分支命令

  • 新建本地分支,但不切换

    git branch <branch-name>

  • 查看本地和远程分支

    git branch -a

  • 查看本地分支

    git branch

  • 查看远程分支

    git branch -r

  • 查看本地和远程分支

    git branch -a

  • 从当前分支,切换到其他分支

    git checkout <branch-name>

  • 新建一个分支,并切换到该分支

    git checkout -b [branch]

  • 删除本地分支

    git branch -D <branch-nane>

  • 重新命名分支

    git branch -m <old-branch-name> <new-branch-name>

  • 合并branch分支到当前分支

    git merge [branch]

  • 查看哪些分支已经合并到当前分支

    git branch --merged

  • 拉取远程分支并创建本地分支

    git checkout -b 本地分支名 origin/远程分支名

  • 删除远程分支

    git push origin --delete [branch-name]

分支的命名规范

master主分支

用于部署生产环境的分支,我们不能直接修改master主分支中的代码

develop分支

开发人员开发时是基于该分支来创建的,比如推送最新的完成和bug修复后的代码

future分支

开发新功能时用到,以develop分支为基础创建future分支,比如future/userCenterfuture/dataCenter

release分支

这是发布测试阶段的分支

git commit日志规范

一般我们提交代码的时候都会记录一下该次提交所做的更改:

在控制台输入git commit -m "记录"

但有时我们需要输入更多信息,这时只需要输入git commit,git会自动打开我们的IDE工具,然后就可以在里面记录更为详细的提交日志

image.png

如果希望设置一个模板,那么需要找到.gitconfig文件,一般是位于用户根目录下

image.png

复制下面的代码到该文件中

[commit]
    template=~/.gitmessage  //  “~/” 指的就是系统用户的根目录路径下

image.png

我们在.gitconfig的同级目录下创建一个.gitmessage文件,便可以在里面设置自己的commit模板

当我们提交git commit但是没有输入提交消息的时候就会弹出该模板

image.png

提交规范

Angular 团队的规范

<type>(<scope>): <subject>   //标题行: 必须, 描述主要修改类型和内容

<body>       //修改内容: 描述为什么修改, 怎么修改

<footer>     //一些备注
  • type: 提交的类型

    feat新特性,fix修改问题,refactor代码重构,docs文档修改

    style代码格式修改, 注意不是 css 修改,test测试用例修改

    chore其他修改, 比如构建流程, 依赖管理

  • **scope: **commit 影响的范围,比如: route,,component等等

  • subject: commit 的概述

例子: fix(index.html): 删除第56行多余的div标签

git log命令

git log的作用就是查询git commit的日志

image.png

  • git log --author=xxx

    查询某个作者的commit日志

  • git shortlog

    查询所有的commit日志,但是按照作者来归类

  • git show commitID

    查看某次commit的修改

所以我们规范了提交日消息的格式,当查询日志的时候便会一目了然,比如下图:

image.png

.gitignore文件

.gitignore文件的作用是忽略文件,让某些文件不受git所管理,比如说node_modules中的文件

# 忽略 .a 文件 不管是当前目录下还是子目录下的 .a 文件都忽略
*.a

# 但否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件
!lib.a

# "?"表示匹配单个字符,如忽略 x.b 文件,不忽略 xx.b
?.b

# 忽略 node_modules/ 目录下所有的文件
node_modules

# 前面添加正斜杠/避免递归,同时忽略当前目录下 node_modules文件夹,但不包括子目录下的 subdir/node_modules
/node_modules

#忽略 build/ 目录下的所有文件 不管是当前目录下的 build/ 还是子目录下的 build/ 都忽略
build/

#忽略当前目录下的 now/ 目录
/now/

# 匹配a、b、c
[abc]

# 匹配0至9的数
[0-9] 

#忽略 test/c.p, 不包括 server/test/c.p
test/*.p

#忽略所有的 .pdf 文件 在 doc/ directory 下
doc/*/*.pdf

例子:在项目根目录中新建 .gitignore 忽略文件,并配置如下:

# 忽略 node_modules 和 dist目录
node_modules
unpackage/dist

注意:如果 unpackage 目录中仅有一个dist 目录,因此默认情况下, unpackage 目录不会被 Git 追踪

此时,为了让 Git 能够正常追踪 unpackage 目录,我们可以在 unpackage 目录下创建一个叫做 .gitkeep 的文件进行占位

关于.gitignore注意事项

  1. 配置文件的完整文件名就是".gitignore",注意最前面有个“.”;
  2. 配置文件是按行从上到下进行规则匹配的,如果前面的规则匹配的范围更大,则后面的规则将不会生效
  3. 该文件只能作用于Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件);如果想要忽略已经被git记录过的文件,那么得先把本地缓存删除(改变成未track状态),然后再提交该文件
//首先查询被忽略的文件及文件夹,然后检查要忽略的文件是不是没被忽略
git status --ignored
//清除git中相应的缓存
git rm -r --cached .  //.代表清除全部缓存
git rm -r --cached unpackage/dist/   //清除特定的目录地址
//修改.gitignored文件之后,提交相应的代码
git add .(或filename)

需要注意,倘若清除了全部缓存,那么重新提交本地文件到仓库时,那么必须使用git add .来添加所有的本地文件,否则如果仅仅git add xxx文件,那么远程仓库中的所有文件就会被删掉,然后只剩下xxx文件

强制提交被git忽略过的文件

$ git add App.class
//The following paths are ignored by one of your .gitignore files: App.class
//Use -f if you really want to add them.
如果你确实想添加该文件,可以用-f强制添加到Git:
$ git add -f App.class

VSCode中git显示不同颜色块的含义

红色,未加入版本控制; (刚clone到本地)

绿色,已经加入版本控制暂未提交; (新增部分)

蓝色,加入版本控制,已提交,有改动; (修改部分)

白色,加入版本控制,已提交,无改动;

灰色:版本控制已忽略文件。

VSCode中git文件标识

A: 增加的文件.

C: 文件的一个新拷贝.

D: 删除的一个文件.

M: 文件的内容或者mode被修改了.

R: 文件名被修改了。

T: 文件的类型被修改了。

U: 文件没有被合并(你需要完成合并才能进行提交)

X: 未知状态