第二弹:Git 的基本操作

121 阅读11分钟

前言

11.gif

Git 是一个免费开源分布式版本控制系统,旨在快速高效地处理从小型项目到大型项目的所有项目。

使用 Git 进行代码版本管理,也是现在开发工程师的必备技能。虽然在工作中有许多形如 SourcetreeGitHub Desktop 等图形化客户端工具供我们使用,非常方便地为我们管理代码。但是了解和学习 Git 操作命令,并且在掌握足够的 Git 命令后,对于日后找工作、面试等场景,也是有一定的用处。同时,在多人协作的大项目中,了解一些 Git 常用的指令,也有助于理解相关的代码规范

下载 & 安装

u=3772057299,1250071366&fm=253&fmt=auto&app=138&f=JPEG.webp

首先需要下载安装 git ,官网下载地址git-scm.com/

安装完 git 后,如果是 windows 系统,可以通过打开 git bash 控制台来使用 git 指令,如果是 macOS 的系统,可以直接按 command + 空格,通过搜索 terminal 来打开控制台,

然后输入git --version 可以看到刚刚安装的git版本

git 基本概念

44.webp

官方文档

git 使用一般有两种方式

  • git gui,即图形化界面的方式
  • git bash,即命令行的方式(推荐

git 仓库会分成三个区

  • 工作区:输入代码的地方,工作的目录就叫工作区。
  • 暂存区:暂时存储的区域,在 git 中,代码无法直接从工作区提交到仓库区,需要先从工作区添加到暂存区,然后从暂存区提交到仓库区。暂存区的目的是避免误操作
  • 仓库区:将保存在暂存区的内容永久转储到 Git 仓库中,生成版本号。生成版本号后,就可以对内容进行版本控制管理。

git 基础命令

33.webp

git 配置

下载安装好 git 后,在我们第一次使用的时候,一般需要给 git 全局配置用户名和邮箱,推荐配置 github 的用户名和密码,命令如下:

# 配置用户名
git config --global user.name "用户名"
# 配置邮箱
git config --global user.email "邮箱地址"

当配置完以后,可以通过如下命令来展示我们的所有的配置信息,包括刚刚配置的 user.name 和 user.email 是否正确

# 展示所有配置项
git config -l
# 等同于上述命令
git config --list

除此之外,也可以对常用的一些命令进行别名配置,从而提升工作效率

git config --global alias.st status                 git status ==> git st
git config --global alias.ci commit                 git commit ==> git ci
git config --global alias.co checkout               git checkout ==> git co
git config --global alias.br branch                 git barnch ==> git br
git config --global alias.sh stash                  git stash ==> git sh
git config --global alias.pop "stash pop"           git stash pop ==> git pop

git init

当使用 git 对某个项目进行管理,首先需要 git init 命令对当前目录进行初始化

# 当前路径创建仓库
git init
# 指定目录创建仓库
git init '项目名'

同时,需要注意:在使用 git init 命令初始化 git 仓库后,会在当前目录生成一个 .git 隐藏文件夹,切记不要修改或删除此文件夹下的任意东西。

git add

作用:将文件由 工作区 添加到 暂存区原因:文件无法直接从工作区直接添加到仓库区,必须先从工作区添加到暂存区,再从暂存区添加到仓库区

# 将文件 filename 添加到暂存区
git add 'filename'
# 将目录 dirname 下所有文件添加到暂存区
git add 'dirname'
# 将当前目录下所有文件添加到暂存区
git add .
git add -A
git add -all

git status

作用:查看当前工作区的状态,红色表示工作区中的有文件需要跟踪,绿色表示暂存区中的有文件需要提交

# 查看当前工作区的状态
git status
# 查看当前工作区的简化状态
git status -s

git commit

作用:将文件由 暂存区 添加到 仓库区,同时生成 版本号

# 将文件从暂存区提交到仓库
git commit -m '提交说明'
# 不带提交说明,则会进入 vim 编辑器中填写提交说明,如果没有提交说明,则无法提交成功
git commit 
# 用于修改最近一次提交说明
git commit --amend -m '提交说明'

git log

作用:查看提交日志

# 查看提交日志
git log
# 查看信息日志
git log -p
# 查看简要日志
git log --stat
# 一行展示提交日志
git log --oneline
显示过去 n 次提交日志
git log -n --pretty --oneline
# 显示该仓库所有提交过代码的用户,并按提交次数排名
git shortlog -sn
# 显示当前`HEAD`上的最近一次的提交(commit)=== git show === git log -
git log -n1 -p

git diff

作用:查看每次提交内容的不同

# 查看每次提交内容的不同
git diff
# 查看工作区与暂存区的不同
git diff --cached
# 查看工作区与仓库区的不同,HEAD表示最新的那次提交
git diff HEAD
# 查看两个版本之间的不同
git diff a2e72c2 d4c836b
# 显示 n 天前提交的代码变动的行数
git diff --shortstat "@{n day ago}"

git reset

作用:版本回退,将版本恢复到已经提交的某一个版本中

注意:当使用了git reset命令后,使用git log只能看到当前版本之前的信息,但是使用git reflog可以查看所有的版本信息

# 回退到上个版本(未提交的内容会被擦掉)
git reset --hard HEAD^
# 回退到上个版本(未提交的内容不会被擦掉)
git reset --soft HEAD^
# 将代码回退到某个指定的版本(版本号只要有前几位即可)
git reset --hard '版本号'
# 将版本回退到前 n 次提交
git reset --hard 'HEAD~n'

git branch

作用:分支相关操作,在创建仓库或者项目pull下来后,一般需要创建开发分支(用于提交代码

# 查看目前所有的分支
git branch -a
# 创建分支
git branch '分支名'
# 删除分支(不能删除当前分支,不能删除没有合并到 master 上的分支)
git branch -d '分支名'
# 删除分支(可以删除没有合并到 master 上的分支)
git branch -D '分支名'

git checkout

作用:切换分支

# 切换分支
git checkout '分支名'
# 创建并切换到新分支
git checkout -b '分支名'
# 切换到指定tag
git checkout 'tag名'

git push

作用:推送代码到远程仓库

# 将代码推送到远程仓库指定分支
git push origin '分支名'
# 删除远程仓库指定分支
git push -d origin '分支名'
# 强行推送当前分支到远程仓库,即使有冲突
git push origin '分支名' --force
# 将tag名推送到远程仓库
git push origin 'tag名'
# 推送本地所有tag到远程仓库
git push origin --tags
# 删除远程仓库tag
git push orgin ':refs/tag/tag名'

git clone

作用:克隆操作

# 克隆代码到本地
git clone '仓库地址‘

clone操作完成后,本地仓库与远程仓库就进行了连接,然后自己可以进行代码的开发和提交。

git pull

作用:从远程仓库拉取代码

# 拉取远程仓库代码并与本地分支合并
git pull

git remote

作用:远程操作

# 显示所有远程仓库
git remote -v

git fetch

作用:获取远程仓库的变动

# 获取远程仓库的变动
git fetch origin '分支名'

git merge

作用:合并代码

# 将指定分支的内容合并到当前分支
git merge '分支名'

git rebase

作用:重新设置基础点

# 合并数个提交
git rebase i 'main'
# 解冲突后,跳过 rebase
git rebase --skip
# 解冲突后,继续 rebase
git rebase --continue
# 结束 rebase,返回之前分支状态
git rebase --abort

git revert

作用:回撤代码,同时会生成 revert 记录

# 回到某个commit
git revert HEAD^  

git stash

作用:暂存工作区代码

# 暂存当前未 commit 的代码
git stash
# 暂存工作区除了 file 的所有改动
git stash -u 'file'
# 暂存指定文件
git stash push 'file'
# 暂存多个文件
git stash push 'file1' 'file2'
# 暂存时添加备注
git stash push -m 'message'
# 查看暂存记录
git stash list
# 使用某个暂存,n 表示指定位置,默认 0
git stash apply 'stash@{n}'
# 使用某个暂存,1.minute.ago 表示时间
git stash apply 'stash@{1.minute.ago}'
# 创建暂存提交
git stash create
# 保存为暂存内容
git stash store -m 'message'
# 使用最近一次记录,随后删除该记录
git stash pop
#删除最近的一次记录
git stash drop
# 删除暂存所有记录
git stash clear

git tag

作用:tag 会记录版本的 commit 号,方便后期回溯

# 列出所有tag
git tag
# 创建tag
git tag 'tag名'
# 创建一个带有备注的tag
git tag -a 'tag名' -m '备注信息'
# 删除指定tag
git tag -d 'tag名'

git show

作用:显示当前HEAD上的最近一次的提交(commit)

git cherry-pick

作用:把指定分支提交放入当前分支

# 把指定提交放入当前分支
git cherry-pick a2e432c

git rm

作用:删除文件

# 删除文件
git rm 'file'
# 删除 git 中文件,保留该文件
git rm --cached 'file'

git mv

作用:文件重命名

# 文件重命名
git mv --force 'old' 'new'

.gitignore

作用:用于忽略指定文件

在仓库中,通常会有某些文件是不需要被git管理的,比如数据的配置密码。这种情况下,可以在仓库的根目录下创建一个.gitignore文件(文件名是固定的),然后,把不需要被git管理的文件路径添加到.gitignore中可以忽视掉这些文件。例如

# 忽视 xxx.txt 文件
xxx.txt
# 忽视 .gitignore 文件
.gitignore
# 忽视 xxx.js 文件
xxx.js
# 忽视 test 下的所有文件
test/*.*

git 进阶使用

55.webp

GitHub

GitHub 是一个面向开源及私有软件项目的托管平台,只支持Git作为唯一的版本库格式进行托管。

# GitHub 特点
- GitHub '使用免费',公有代码所有人都能看到,但是只自己可以修改
- 使用 GitHub 托管项目时,不能有中文
- Git 和 GitHub 没有直接关系,git 是一个'版本控制工具',GitHub 是一个'代码托管平台',是一个远程仓库

在 GitHub 上 clone 代码时,通常有两种方式:

  1. 通过 https 传输协议:github.com/xxxx/test.g…
  2. 通过 ssh 传输协议:git@github.com:xxxx/test.git

注意:

  • 如果使用 https 协议,则当每次进行 push 或者 pull 代码时,都需要使用者输入用户名密码进行身份验证后才能进行操作,使用起来非常麻烦(因为 GitHub 为了账户的安全,需要对使用者进行合法性验证)
  • 如果使用 ssh 协议,经过配置 SSH Key 后,可以在每次 push 代码时不需要输入账户和密码
  • SSH 免密码登录配置步骤如下:
1. 创建 SSH Key:ssh-keygen -t rsa
2. 在文件路径 C:\用户\当前用户名\ 找到 .ssh 文件夹
3. 可以看到文件夹中有两个文件:'id_rsa'(私钥) 和 'id_rsa.pub'(公钥)
4. 在 'GitHub' -> 'Settings' -> 'SSH and GPG keys' 页面中,点击 'New SSH key'
5. 复制 'id_rsa.pub' 内容到对应文本框中,保存后就配置好了

git clone 失败

错误提示

'Could not read from remote repository.
Please make sure you have the correct access rights'

错误原因

  • 权限不足
  • ssh key 失效

解决办法

  1. 使用 http 的地址进行克隆
  • 使用这种方式的话需要输入自己的账号以及密码,有点麻烦,不建议使用

  1. 重新添加 SSH Key,
  • 使用如下命令重新生成 key 后,添加到 git 上
ssh-keygen -t rsa -C "username"

git pull 失败

错误提示1

'fatal: Could not read from remote repository.
Please make sure you have the correct access rights' 

错误原因

  1. 权限不足
  2. 网络原因

解决方法

  1. 检查 github SSH Key 是否配置正确
  2. 检查网络连接是否正常

错误提示2

'Your local changes to the following files would be overwritten by merge'

错误原因

代码冲突:本地代码与远程仓库代码冲突

解决办法

# 暂存代码
git stash
# 拉取代码
git pull
# 弹出最近暂存代码
git stash pop
# 添加到暂存区
git add 'file'
# 提交到工作区
git commit -m 'message'
# 推送到远程仓库
git push origin 'branch'

多账号绑定

解决方法

可以让 git 绑定多个不同的 SSH Key,每个 SSH Key 对应一个不同的 git 服务器

# 生成第一个 ssh key
ssh-keygen -t rsa -C "xxx@xxx.xx"
# 生成第二个 ssh key
# 参数 -f 表示指定生成的文件名, path/to/file 表示文件路径
ssh-keygen -t rsa -f path/to/file  -C "xxx@xxx.xx"

SSH Key 生成后,在当前目录新建 config 文件用于配置私钥文件所在位置

# github 服务器
'Host' github.com 
'HostName' github.com 
'User' xxx
'IdentityFile' ~/.ssh/id_rsa_github 

# gitlab 服务器                                                             
'Host' gitlab.com 
'HostName' gitlab.com 
'User' xxx 
'IdentityFile' ~/.ssh/id_rsa 

# gitee 服务器
'Host' gitee.com 
'HostName' gitee.com 
'User' xxx 
'IdentityFile' ~/.ssh/id_rsa_gitee

最后,通过在项目中通过 git config 命令配置用户名和邮箱,同时需要把 SSH Key 添加到 github 或者 gitee 等其他代码托管平台

git config user.name "xxx" 
git config user.email "xxx@xxx.xx"

99.webp

温馨提示

今天的分享就到这里,有需要的小伙伴按需取用(😬)。

PS:个人技术有限,难免会有遗漏或错误之处,如有不妥或补充,望诸君指教(🤡🤡🤡)。

999.gif