Git常用命令整理

149 阅读9分钟

Git是我们工作中遇到的最常用的版本管理系统(Version Control System,简称VCS)。 本文旨在整理一些最常用的git命令以方便日后温故。而关于git的一些原理或者更详细的用法,掘金上有很多很好的文章以供参考。

推荐几个好文章:
juejin.cn/post/1#head…

juejin.cn/post/684490…

本文也参考了以上文章。

------------------------------------分割线--------------------------------------

正文开始,想象你刚入职一家公司,头一个星期都是在环境配置和代码熟悉中度过,现在你拿到了你的新电脑,下载好了Idea(有关idea的配置可以看我的另一篇文章),下载好了各个版本的JDK,配置好了一切,现在打开了git bash(Mac用户请忽略),

git config -- 配置

首先要配置你的用户名和邮箱,这样在代码提交的时候别人才能找到你让你背锅。

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

# 查看配置
git config --global user.name       # 查看配置的用户名
git config --global user.email      # 查看配置的邮箱

# 查看所有配置列表
git config --list               # 查看所有Git的配置(全局+本地+系统)

git help -- 帮助

当你不知道这个命令改怎么敲时,可以寻求git的帮助。

git help            # 所有命令简介都会列举出来
git help 命令       # 查看某个git命令的介绍,用法

git clone/pull/push/fetch -- 和远端交互

熟悉代码首先要从远端把代码下载到本地。

git clone 代码地址    #下载代码到本地

为了本地和远端同步,最常用的两个命令,

git pull         #远端同步到本地
git push         #本地上传到远端
git fetch origin master # 从远程仓库拉取master分支状态的变化信息(工作区文件不会更新)
git fetch #从远程仓库拉取所有分支和tag状态的变化信息(工作区文件不会更新)
git fetch -p # 从远程仓库拉取所有分支和tag状态的变化信息,并清除已被删除的远程分支和tag在本地的缓存(工作区文件不会更新)

git add/commit --添加文件

当你开始写代码时,本地改动完成,需要提交到远端,首先

git add 文件名  # 将工作区的某个文件添加到暂存区。
git add -u .    # 添加所有追踪的文件信息到暂存区。
git add .      # 将当前工作区的所有文件都加入暂存区

等文件都在暂存区之后,需要提交到本地仓库

git commit -m "desc"            # 将暂存区内容提交到本地仓库
git commit '文件名' -m "desc"   # 添加注释并将暂存区中的某个文件的修改提交到本地仓库
git commit -a -m "desc"         # 添加注释并将工作区和暂存区中的所有修改提交到本地仓库
git commit --amend -m "desc"    # 添加注释使用当前提交覆盖上一次的提交。若没有提交内容,则用来改写上一次提交的日志信息。

git reset/checkout -- 文件撤销与修改

git reset -- README.md  # 丢弃暂存区中的README.md文件的修改
git reset README.md     # 功能如上 丢弃暂存区中的README.md文件的修改
git reset b5cad94 README.md # 使用本地版本库b5cad94提交处的README.md版本覆盖暂存区中的README.md
git reset               # 丢弃暂存区中的所有文件的修改(工作区不受影响)
git reset --mixed # --mixed为缺省参数,命令与上面git reset一样
git reset --hard       # 丢弃暂存区和工作区中的所有文件的修改(工作区中未追踪的文件不受影响)
git reset --soft b5cad94d229e72bd7aff5fe2c6f022b29c30e7a8 # 仅将当前分支的HEAD指向372aa8e425b57ca30e2974b8e7737133caaa0b7f提交(暂存区和工作区中的所有文件的修改都不丢弃)
git reset --soft HEAD~ # 仅将当前分支的HEAD指向上一次提交(暂存区和工作区中的所有文件的修改都不丢弃)
git reset --soft HEAD~2 # 仅将当前分支的HEAD指向上两次提交(暂存区和工作区中的所有文件的修改都不丢弃)

git checkout -- README.md  # -- 符号非常重,否则就变成了切换到README.md分支了.当README.md在暂存区中有修改时,使用暂存区中的修改覆盖工作区中的README.md; 当README.md不在暂存区中时,使用本地版本库中的HEAD指针处的修改覆盖工作区中的README.md
git checkout -- .  # 使用暂存区和本地版本库来恢复当前目录(递归子目录)下的所有文件  注:若暂存区中有修改,优先使用暂存区
git checkout HEAD README.md  # 使用本地版本库中的HEAD处提交覆盖暂存区和工作区中的README.md
git checkout 9a387f22ff949fa16336508adc2284384bd6a890 README.md  # 使用本地版本库中的9a387f22ff949fa16336508adc2284384bd6a890修改覆盖暂存区和工作区中的README.md

git status --查看状态

git status      # 查看工作区与暂存区的当前情况
git status -s   # 让结果以更简短的形式输出

git diff --比较差异

git diff 文件               # 某文件在工作区与缓存区的差异
git diff HEAD               # 工作区与HEAD指针指向的内容差异

git log --查看提交记录

背锅必备

git log                 # 查看所有commit记录(SHA-A校验和,作者名称,邮箱,提交时间,提交说明)
git log -p -次数                # 查看最近多少次的提交记录
git log --stat                  # 简略显示每次提交的内容更改
git log --name-only             # 仅显示已修改的文件清单
git log --name-status           # 显示新增,修改,删除的文件清单
git log --oneline               # 让提交记录以精简的一行输出
git log –graph –all --online    # 图形展示分支的合并历史
git log --author=作者           # 查询作者的提交记录(和grep同时使用要加一个--all--match参数)
git log --grep=过滤信息         # 列出提交信息中包含过滤信息的提交记录
git log -S查询内容              # 和--grep类似,S和查询内容间没有空格
git log fileName              # 查看某文件的修改记录,找背锅专用
git blame 文件名              # 显示文件最近一次的修改信息

git branch --分支的操作

开发过程中不会只有一个分支,我们也会频繁的切换分支,

git branch  # 列出所有本地分支
git branch -r # 列出所有远程分支
git branch -a # 列出所有本地分支和远程分支
git branch -av # 列出所有本地分支和远程分支e(含简单说明)
git branch -vv # 查看所有本地分支和远程分支cache之间的追踪关系
git branch v1.0  # 在当前分支的HAED指针下创建名为v1.0的分支(创建完不会切到v1.0分支上)
git branch v2.0 372aa8e425b57ca30e2974b8e7737133caaa0b7f # 在372aa8e425b57ca30e2974b8e7737133caaa0b7f提交处创建名为v2.0的分支(创建完不会切到v2.0分支上)
git branch -m v1.0 x1.0   # 将分支v1.0重命名为x1.0
git checkout v1.0   # 切换到v1.0分支上(v1.0分支不存在则命令执行失败)
git checkout -b v1.0  # 创建并切换到v1.0分支上(v1.0分支存在则命令执行失败)
git checkout -B v1.0  # 不存在则创建,并切换到v1.0分支上
git checkout -f v1.0 # 强制切换到v1.0分支上,丢弃暂存区和工作区中的所有文件的修改(工作区中未追踪的文件不受影响)
git checkout -  # 切换到上一次分支
git branch -d v2.0  # 删除名为v2.0的分支(必须先切到其他分支上才能执行删除操作)
git branch -D v2.0  # 强制删除名为v2.0的分支(必须先切到其他分支上才能执行删除操作)
git branch -dr origin/v2.0 # 删除远程分支origin/v2.0 cache

注1:切换分支前,必须处理工作区(未追踪的文件不用处理)和暂存区的修改才能切换成功
注2:切换成功后,工作区会被设置成分支的内容
注3:不允许在远程分支上提交,需要创建对应关联的本地分支,然后在本地分支上进行提交

git merge VS git rebase -- 分支合并

git merge-base Master Feature  # 查看Master和Feature分支的最优共同commit父节点
git merge Feature # 将Feature分支merge合并到当前分支Master(无冲突时会直接提交)
git merge -m "merge test" Feature # 将Feature分支merge合并到当前分支Master(无冲突时使用merge test注释直接提交)
git merge --no-commit Feature # 将Feature分支merge合并到当前分支Master(不自动提交)
git rebase Feature # 将Feature分支rebase合并到当前分支Master

git stash -- 储藏区

git stash  # 将工作区中所有文件的修改备份压栈到储藏区,然后丢弃工作区与暂存区的所有文件的修改
git stash pop # 使用储藏区的栈顶处备份(stash@{0})来恢复当前分支的工作区,并将栈顶备份移除
git stash apply stash@{1} # 使用储藏区的栈顶下面一个备份(stash@{1})来恢复当前分支的工作区,但不移除储藏区中任何备份
git stash list  # 查看储藏区栈列表
git stash show -p stash@{0}  # 查看储藏区的栈顶处备份中各个文件的内容
git stash drop  # 直接移除储藏区的栈顶处备份(不用于恢复当前分支的工作区)
git stash clear # 清除储藏区栈列表

git cherry-pick -- 骚操作

git cherry-pick 9a341e      # 将9a341e提交合入当前分支。若不冲突,则直接使用9a341e的提交信息进行commit,否则要先进行冲突处理,然后继续执行git cherry-pick --continue来完成合并的提交工作
git cherry-pick 371c2…971209 # 将(371c2, 971209]提交合入当前分支(每个提交都会在当前分支上创建一个commit)
git cherry-pick 371c2~…971209 # 将 [371c2, 971209] 提交合入当前分支(每个提交都会在当前分支上创建一个commit)
git cherry-pick -n 9a341e d2f99e # 将9a341e和d2f99e提交合入当前分支(不提交),后续需要手动commit
git cherry-pick --abort    # 撤销当前cherry-pick操作
git cherry-pick --quit     # 清理当前操作状态,不撤销修改强制退出cherry-pick操作过程
git cherry-pick --continue # 手动处理完冲突后,最后继续执行git cherry-pick --continue 来完成合并的提交工作

更多详细内容请参考开头文章!