前言
Git 是一个
免费和开源的分布式版本控制系统,旨在快速高效地处理从小型项目到大型项目的所有项目。使用 Git 进行代码版本管理,也是现在开发工程师的
必备技能。虽然在工作中有许多形如Sourcetree、GitHub Desktop等图形化客户端工具供我们使用,非常方便地为我们管理代码。但是了解和学习 Git 操作命令,并且在掌握足够的 Git 命令后,对于日后找工作、面试等场景,也是有一定的用处。同时,在多人协作的大项目中,了解一些 Git 常用的指令,也有助于理解相关的代码规范。
下载 & 安装
首先需要下载安装 git ,
官网下载地址:git-scm.com/安装完 git 后,如果是
windows系统,可以通过打开git bash控制台来使用 git 指令,如果是macOS的系统,可以直接按command + 空格,通过搜索terminal来打开控制台,然后输入
git --version可以看到刚刚安装的git版本。
git 基本概念
git 使用一般有两种方式
git gui,即图形化界面的方式git bash,即命令行的方式(推荐)git 仓库会分成三个区
工作区:输入代码的地方,工作的目录就叫工作区。暂存区:暂时存储的区域,在 git 中,代码无法直接从工作区提交到仓库区,需要先从工作区添加到暂存区,然后从暂存区提交到仓库区。暂存区的目的是避免误操作。仓库区:将保存在暂存区的内容永久转储到 Git 仓库中,生成版本号。生成版本号后,就可以对内容进行版本控制管理。
git 基础命令
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 进阶使用
GitHub
GitHub是一个面向开源及私有软件项目的托管平台,只支持Git作为唯一的版本库格式进行托管。# GitHub 特点 - GitHub '使用免费',公有代码所有人都能看到,但是只自己可以修改 - 使用 GitHub 托管项目时,不能有中文 - Git 和 GitHub 没有直接关系,git 是一个'版本控制工具',GitHub 是一个'代码托管平台',是一个远程仓库在 GitHub 上 clone 代码时,通常有两种方式:
- 通过
https传输协议:github.com/xxxx/test.g…- 通过
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 失效
解决办法
- 使用 http 的地址进行克隆
使用这种方式的话需要输入自己的账号以及密码,有点麻烦,不建议使用
- 重新添加 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'错误原因
- 权限不足
- 网络原因
解决方法
- 检查 github SSH Key 是否配置正确
- 检查网络连接是否正常
错误提示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"
温馨提示
今天的分享就到这里,有需要的小伙伴按需取用(😬)。
PS:个人技术有限,难免会有遗漏或错误之处,如有不妥或补充,望诸君指教(🤡🤡🤡)。