Git是我们工作中遇到的最常用的版本管理系统(Version Control System,简称VCS)。 本文旨在整理一些最常用的git命令以方便日后温故。而关于git的一些原理或者更详细的用法,掘金上有很多很好的文章以供参考。
推荐几个好文章:
juejin.cn/post/1#head…
本文也参考了以上文章。
------------------------------------分割线--------------------------------------
正文开始,想象你刚入职一家公司,头一个星期都是在环境配置和代码熟悉中度过,现在你拿到了你的新电脑,下载好了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 来完成合并的提交工作
更多详细内容请参考开头文章!