git常用命令

前言

现在的大多数公司都在使用git作为版本控制系统,相比于其它版本控制系统如svn来说,git有很多优点:

  1. 分布式

分布式意味着协作开发的每个小伙伴计算机中的仓库都是一份完整的项目代码,大家不依赖于某个中央仓库,减少中央服务器出问题带来的风险。

  1. 离线工作

不必连接中央仓库便可很好地工作,在本地完成暂存,提交及分支创建合并。

  1. 版本的前进后退

通过git可以很好地实现版本的前进后退,并且基本上的版本都能在日志中找到,而不会真正的删除,以便于随时切换。

工作区和暂存区的概念

  • 工作区:当前编辑修改的空间

  • 暂存区:git add 后的存储空间

  • 版本库:git commit 后的版本空间(网上有说版本库包含了暂存区,这点我没有细纠)

常用命令

强烈建议慎用 git clean,写这篇博客的时候的不小心使用导致以前的博客都删了

状态查看

git status // 查看工作区修改及暂存区状态

git log // 查看历史版本

git log --stat // 查看历史版本并显示差异文件

git diff // 比较工作区与暂存区差异(忽略Untracked文件)

git diff --stat // 显示工作区与暂存区差异文件

git diff <commitId> // 比较工作区与指定版本的差异

git diff <commitId> <commitId> // 比较两个版本的差异

git reflog // 查看版本变动历史(仅指在本地操作),包括了版本切换切换(前进后退),分支切换(分支即版本)

保存提交

git stash // 保存工作区和暂存区状态,使工作区和暂存区干净

git stash pop // 恢复工作区和暂存区状态,git stash / git stash pop 将当前状态保存在数组中,对应数组的 push pop,所以可以连续 stash/ stash pop

git add ./-A/--all // 工作区 -> 暂存区

git commit -m // 暂存区 -> 当前分支

git commit --amend // 暂存区 -> 当前分支 不添加新版本

拉取推送

git fetch <remote> // 同步远程仓库

git merge <branch> // 合并分支

git pull <remote> <branch> // git fetch + git merge 拉取并合并远程分支

git push <remote> <branch> // 推送分支

git push <remote> <localBranch>:<remoteBranch> // 推送并新建远程分支

git push --set-upstream <remote> <branch> // 推送并建立关联

git checkout -b <newBranch> <remote> <remoteBranch> // 从远程拉取并创建新分支

换分支

git checkout <name> // 切换分支

变基

git rebase <branch> // 改变相联系的祖先commitID,可以达到简洁提交图谱的作用

撤销回退

git checkout <path> // 清空工作区,不能清除Untracked文件

git reset <path> // 暂存区 -> 工作区

git clean -n // 显示将被清除的文件

git clean -f <path> // 清除当前目录下Untracked文件,没有<path>则clean全部,非ignore

git clean -df <path> // 清除当前目录下Untracked文件/文件夹,没有<path>则clean全部,非ignore

git clean -xf <path> // 清除当前目录下Untracked文件/文件夹,没有<path>则clean全部,无视是否ignore

git reset commitID --mixed(默认) // 回退到某个版本,保留工作区状态,将暂存区修改退回工作区 && 上一个commit修改移入工作区

git reset commitID --hard // 回退到某个版本,清空工作区和暂存区

git reset commitID --soft // 回退到某个版本,保留工作区和暂存区 && 上一个commit修改移入工作区

远程

git remote // 显示所有远程仓库

git remote -v/--verbose // 显示所有远程仓库及地址

git remote add <name> <url> // 添加远程仓库

git remote rm <name> // 删除远程仓库

解决问题

  1. 想看看当前修改了哪些文件?
git status // 注意区分工作区,暂存区,Untracked
  1. 更新部分文件,有些已经add到暂存区,有些还在工作区,想撤销所有修改?
git reset HEAD --hard // 撤销工作区和暂存区的所有修改

git clean . -df // 如果有新添加的文件/文件夹(Untracked状态),则再执行此条命令删除
  1. 更新部分文件,有些已经add到暂存区,有些还在工作区,想撤销部分修改?
git reset <path> // 暂存区 -> 工作区

git checkout <path> // 撤销未添加到工作区的修改

git clean -df <path> // 如果有新添加的文件/文件夹(Untracked状态),则再执行此条命令删除
  1. 想回退至某个历史版本?
git log // 查看想回退的版本ID

git reset <commitID> --hard // 回退(hard可获得干净的工作区和暂存区)
  1. 想前进至某个版本,比如回退版本之后又想再回到新版本?
git reflog // 版本记录中可以看到之前版本

git reset <commitID> --hard // 回退(hard可获得干净的工作区和暂存区)
  1. 更新当前分支?
git fetch // 获取所有远程分支的最新状态(只是更新本地的远程分支状态,这样你就可以知道远程是否有修改,是否需要更新本地仓库)

git fetch <remote> <branch> // 获取某一远程分支的最新状态

git merge <reomte> <branch> // 合并远程分支代码

git pull // 等于前面两条操作,更新当前分支对应的远程分支并合并至当前分支
  1. 查看当前工作区的具体修改(和暂存区比较)?
git diff // 所有修改(非Untracked文件)

git diff <path> // 某文件的修改
  1. 拒绝背锅之是谁改的代码?(开发工具上推荐git blame 插件
git blame <path> // 查看某个文件的每行修改信息(commitId,user, Date)

git blame <path> -L <start,end> // 查看某个文件的某段修改信息(commitId,user, Date)
  1. 好奇之某个版本的修改?
git log // 先获取想要看的版本ID

git show <commitId> // 显示版本具体修改

git show <commitId> --stat // 只显示版本修改的文件,不显示修改细节
  1. 好奇之文件的版本历史?
git log -p // 显示每次版本差异(相当于多个git show)

git log --stat // 显示每次版本差异统计(相当于多个git show --stat)

git log <path> -p // 某文件的修改历史信息

git log <path> --stat // 某文件的修改历史信息统计
  1. 保存当前分支修改,在当前分支进行其他紧急开发任务?
git stash // 将当前所有工作区和暂存区修改缓存(非Untracked如果也要缓存,可先添加到暂存区再缓存)

git stash pop // 恢复缓存修改

结尾

以上就是我们经常使用到的一些简单的命令,在这里梳理也是方便自己后面遗忘时候查阅,后面如果有自己比较多使用的将更新。