文章来源:面试官:说说Git常用的命令有哪些? (opens new window)
# 前言
git的操作可以通过命令的形式执行,日常使用就如下6个命令即可

- pull
- fetch/clone
- checkout
- push
- commit
- add
实际上,如果想要熟练使用,超过60多个命令需要了解,下面则介绍下常见的的git命令
# 有哪些
大致分成了以下几个类别
- 配置
- 初始化
- 日常基本操作
- 分支操作
- 远程同步
- 撤销
- 存储
# 配置
Git自带一个git config的工具来帮助设置控制Git外观和行为的配置变量,在我们安装完git之后,第一件事就是设置你的用户名和邮件地址
,后续每一个提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改
设置提交代码时的用户信息命令如下:
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"
2
# 启动
一个git项目的初始有两个途径,分别是:
git init [project-name]:创建或在当前目录初始化一个git代码库。git clone url:下载一个项目和它的整个代码历史。
# 常用命令
在日常工作中,代码常用的基本操作如下:
git init:初始化仓库,默认为master分支。git add .:提交全部文件修改到缓存区。git add <具体某个文件路径+全名>:提交某些文件到缓存区。git diff:查看当前代码add后,会add哪些内容。git diff --staged:查看现在commit提交后,会提交哪些内容。git status查看当前分支状态。git pull <远程仓库名> <远程分支名>:拉取远程仓库的分支与本地当前分支合并。git pull <远程仓库名> <远程分支名>:<本地分支名>:拉取远程仓库的分支与本地某个分支合并。git commit -m "<注释>":提交代码到本地仓库,并写提交注释。git commit -v:提交时显示所有diff信息。git commit --amend [file1] [file2]:重做上一次commit,并包括指定文件的新变化。
关于提交信息的格式,可以遵循以下的规则:
- feat:新特性,添加功能
- fix:修改bug
- refactor:代码重构
- docs:文档修改
- style:代码格式修改,注意不是css修改
- test:测试用例修改
- chore:其他修改,比如构建流程,依赖管理
# 分支操作
git branch:查看本地所有分支。git branch -r:查看远程所有分支。git branch -a:查看本地和远程所有分支。git merge <分支名>:合并分支到当前分支。git merge --abort:合并分支出现冲突时,取消合并,一切回到合并前的状态。git branch <新分支名>:基于当前分支,新建一个分支。git branch -d <分支名>:删除本地某个分支(会在删除前检查merge状态(其与上游分支或者与head))。git branch -D <分支名>:删除本地某个分支(git branch --delete --force的简写)。git branch <新分支名称> <提交ID>:从提交历史恢复某个删掉的某个分支。git branch -m <原分支名> <新分支名>:分支更名。git checkout --orphan <新分支名>:新建一个空分支(会保留之前分支的所有文件)。git checkout <分支名>:切换到本地某个分支。git checkout <远程库名>/<分支名>:切换到线上某个分支。git checkout -b <新分支名>:基于当前分支新建分支,并切换到该分支。git push <远程库名> --delete <分支名>:删除远程某个分支。
# tag同步
git tag:列出所有tag。git tag [tag名]:创建轻量tag(无-m标注信息)。git tag -a [tag名]:创建含注解的tag。git tag -l | xargs git tag -d:删除所有本地tag。git fetch origin --prune:从远程拉取所有信息。git ls-remote --tags origin:查询远程tags。git push origin --tags:推送所有本地tag到远程。git push origin [本地tag名]:推送指定本地tag到远程。git tag -d [本地tag名]:删除本地指定tag。git push origin :refs/tags/[远程tag名]:删除远程指定tag。git fetch origin [远程tag名]:拉取远程指定tag。git show [tag名]:显示指定tag详细信息。
在远程仓库删除了某个tag,在本地拉取,此时被删除的tag在本地还是存在,再次push的时候又会推到远程。也有那种在远程把某个tag删了,然后又打了一个名字一样的,导致后续推送出问题。解决方法:
首先删除所有本地tag,然后在从远程拉
git tag -l | xargs git tag -d
# git tag -l #列出所有本地tag
# git tag -d xxx #删除制定tag
# xargs 前面一个指令(git tag -l)的输出,作为后面一个指令(git tag -d)的传参
git fetch origin --prune
2
3
4
5
# 远程同步
远程操作常见的命令:
git fetch [remote]:下载远程仓库的所有变动。git remote -v:显示所有远程仓库。git pull [remote] [branch]:拉取远程仓库的分支与本地当前分支合并。git fetch:获取线上最新版信息记录,不合并。git push [remote] [branch]:上传本地指定分支到远程仓库。git push [remote] --force:强行推送当前分支到远程仓库,即使有冲突。git push [remote] --all:推送所有分支到远程仓库。
远程仓库删除了分支,通过命令git branch -r查看还在,使用命令git remote show origin,可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息。可以看到有些分支是标记为tracked,即该分支是被跟踪的,有些则标记为stale(use 'git remote prune'),意为不新鲜的旧的,就是已经被删除了的分支,按照提示使用git remote prune origin即可删除。
# 撤销
git checkout -- [file]:恢复暂存区的指定文件到工作区。git checkout [commit] [file]:恢复某个commit的指定文件到暂存区和工作区。git checkout .:恢复暂存区的所有文件到工作区。git reset [commit]:重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变。git reset --hard:重置暂存区与工作区,与上一次commit保持一致。git reset [file]:重置暂存区的指定文件,与上一次commit保持一致,但工作区不变。git revert [commit]:后者的所有变化都将被前者抵消,并且应用到当前分支。reset:真实硬性回滚,目标版本后面的提交记录全部丢失了。
revert:同样回滚,这个回滚操作相当于一个提交,目标版本后面的提交记录也全部都有。
| 特性 | reset | revert |
|---|---|---|
| 作用 | 移动 HEAD 指针,撤销提交 | 创建新的提交,撤销指定提交的更改 |
| 修改历史 | 是 | 否 |
| 适用场景 | 本地提交撤销 | 远程提交撤销 |
| 工作目录影响 | 可选(--soft、--mixed、--hard) | 不影响工作目录 |
| 团队协作影响 | 不适合已推送的提交 | 适合已推送的提交 |
| 冲突处理 | 无冲突 | 可能需要解决冲突 |
--soft:移动HEAD指针,不修改暂存区和工作目录。适合撤销提交但保留更改。--mixed(默认模式):移动HEAD指针,并重置暂存区,但不修改工作目录。适合撤销提交并将更改放回工作目录。--hard:移动HEAD指针,并重置暂存区和工作目录。适合彻底撤销提交和所有更改。
存储操作
你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作,但又不想提交这些杂乱的代码,这时候可以将代码进行存储:
git stash:暂时将未提交的变化移除。git stash pop:取出储藏中最后存入的工作状态进行恢复,会删除储藏。git stash list:查看所有储藏中的工作。git stash apply <储藏的名称>:取出储藏中对应的工作状态进行恢复,不会删除储藏。git stash clear:清空所有储藏中的工作。git stash drop <储藏的名称>:删除对应的某个储藏。
# 总结
git常用命令速查表如下所示:
