git 常用命令

725 阅读5分钟

注:本文不适合新手,只是方便查阅。新手可以参考 廖雪峰的教程 ,一学就会。

方便起见,本文举例文件名为text.txt。若实际中文件名中有空格,请用引号包围。

首先了解下git维护的三块内容:工作区-->缓存区stage-->当前版本HEAD。

本地向常用命令(一个大致的分类):

  • 修改全局名称:git config --global user.name "cm"
  • 修改全局邮箱:git config --global user.email "@example.com"
  • 创建本地仓库:git init
  • 提交单个修改至缓存区(新增也算修改):git add text.txt,强制添加(ignore的也行):git add -f text.txt
  • 提交所有修改至缓存区:git add .
  • 从缓存区提交到HEAD:git commit -m "一些些说明",每次提交都有commit.id
  • 删除文件:提交删除文件至缓存区git rm text.txt-->提交到HEADgit commit -m "一些些说明"
  • 查看缓存区状态:git status
  • 查看提交日志:git log(版本回退之后,这里的提交日志也会减少哦),精简版内容:git log --pretty=online,带分支合并图内容--graph
  • 显示最后一次提交:git log -1
  • 把提交历史整理成一条线:git rebase
  • 查看所有历史命令:git reflog(要是遇到什么奇奇怪怪的东西,按Q就退出了)
  • 撤销工作区的修改或删除:git checkout -- text.txt(本质是从HEAD拷贝了一份新的text.txt替换。不影响缓存区内容),撤销全部git checkout .
  • 从缓存区放回工作区(回到git add text.txt命令前):git reset HEAD text.txt
  • 版本回退或前进(commit了没办法呀),同时更新工作区:
    • git reset --hard HEAD^HEAD^表示上个版本,HEAD^^表示上上个版本,以此类推。也可可以简写:HEAD~100表示100个^
    • git reset --hard <commit.id> 根据commit.id选择想到达的版本
    • 一些些提示:回退前可以git log查看版本。回退完后悔了想前进,可以用git reflog查看commit.id再前进;操作完,因为工作区和HEAD同步了嘛,所以缓存区很“干净
  • 查看当前工作区和HEAD中的区别:git diff HEAD -- text.txt

分支相关命令:

  • 创建分支名为dev:git branch dev
  • 切换分支到dev:git switch dev或者git checkout dev
  • 创建+切换当前分支为dev:git switch -c dev或者git checkout -b dev
  • 以远程分支dev为副本创建+切换分支:git checkout -b dev origin/dev
  • 查看分支:git branch(列出了所有分支,标记*为当前分支),添加-vv参数能看到关联的远程分支
  • 把dev分支的内容合并到当前分支:git merge dev
  • 禁用fast forward合并:git merge --no-off dev,因为要进行一次commit,所以一般加上-m参数。
  • 解决冲突相关:可以git status中看到冲突了。手动修改后提交至HEAD。提交后可以用git log --graph看到分支合并图。结合上条例子,dev不变。
  • 删除dev分支:git branch -d dev,强行删除没被合并的分支,把小d换成大D
  • 保存工作现场(多用于切换分支前):git stash
  • 查看保存的工作现场:git stash list
  • 恢复工作现场:
    • git stash apply:恢复工作现场,但不删除stash内容不删除,需要通过git stash drop删除stash。可以查看git stash list后逐条恢复,如git stash apply stash@{0}
    • git stash pop:恢复并删除stash
  • 复制特定的提交到当前分支再提交一遍:git cherry-pick <commit.id>

远程仓库相关命令:

  • 本地仓库关联远程仓库:git remote add <远程仓库名> <远程仓库地址>(一般远程仓库名取为origin)
  • 推送到远程仓库origin对应的分支:git push origin master, master是本地分支名,push时git会把远程同名分支关联起来,所以远程分支名也是master。 第一次带上-u参数,以后操作就方便了,只需要在当前分支下git push就行了,可用git branch -vv查看默认推送情况。(可能会出现SSH警告,输入yes就好了)
  • 从远程仓库克隆仓库到本地:git clone <远程仓库地址>(不需要本地额外建仓库,直接推就行了)
  • 查看远程仓库信息:git remote,带上-v参数显示更详细的信息
  • 以远程分支dev为副本创建+切换分支:git checkout -b dev origin/dev
  • 从远程仓库获取最新提交:git pull origin master,相当于git fetch origin/master+git merge origin/mastergit pull是拉取所有分支。 (如果出现no track information提示,可以先用git branch --set-upstream-to <branch-name> origin/<branch-name>建议本地与远程分支的链接)。
  • 删除远程仓库关联:git remote rm origin

标签相关命令(标签总是和commit挂钩):

  • 新建默认标签:git tag <标签名>,默认标签是打在最新一次的提交上的
  • 新建指定提交的标签:git tag <标签名> <commit.id>
  • 查看所有标签:git tag,标签是按字母排序的
  • 查看单个标签具体信息:git show <标签名>
  • 新建带说明的标签:git tag -a <标签名> -m "一些些说明" <commit.id>
  • 删除本地标签:git tag -d <标签名>
  • 推送标签到远程:git push origin <标签名>
  • 推送所有标签到远程:git push origin --tags
  • 删除已经推送到远程的标签:先删本地git tag -d <标签名>-->再删远程git push origin :refs/tags/<标签名>

自定义git相关命令:

忽略特殊文件

  • 配置.gitignore模板:[github.com/github/giti…]
  • 查看被忽略文件在.gitignore文件哪一项:git check-ignore -v <文件名>

配置别名(偷懒必备)

  • 配置别名:git config --global alias.<别名> <现名>
  • 不多说了,上来先配置一个:git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

最后写给自己的注意事项:

HEAD改变后会直接导致其它两块内容的改变。 工作区改变后需要一步步保存到HEAD。

master是主分支;HEAD指向的是当前分支。注意这两者的关系。所有的操作默认在当前分支下进行。

push时本地和远程分支默认需要同名,git也会自动追踪远程同名分支。特地改成不同名会很麻烦,不建议。