写在前面
整理一下我记得住和记不住的实用git命令,更多学习了解请查看官网
安装
通常,Mac OS 中都已经安装了Git。但是,Git的版本未必是最新的。所以建议你安装使用最新版本的Git。下面来检查一下你的Mac电脑上是否已经安装了Git
如图,如果git命令可以被系统识别,那么就表示你的电脑上已经安装了Git,系统会列出Git的一些使用方法
如果你发现你的系统上没有安装Git,那么你要到Git的网站下载并安装最新版本的Git
实用操作
git 的配置
git config
命令用于获取并设置存储库或全局选项。这些变量可以控制 Git 的外观和操作的各个方面。
1 | # 获取帮助信息 |
查看全局配置的信息
1 | # --local:局部(当前目录)配置信息 (默认值) |
设置自己的用户名和 email,这是非常重要的,因为每次 Git 提交都会使用该信息,它被永远的嵌入到了你的提交中
在命令行输入:
1 | # 全局配置(所有项目) |
添加配置项
1 | # entry-name 为配置项名称 |
删除配置项
1 | # 当前目录 |
简化命令
1 | # 将冗长的命令简化 |
其他配置项
1 | # 不再将文件的权限变化视作改动 |
创建SSH密钥
这个密钥用来跟 github 通信,在本地终端里生成然后上传到 github
1 | ssh-keygen -t rsa -C 'wowohoo@qq.com' # 生成密钥 |
多账号ssh配置
1.生成指定名字的密钥
1 | ssh-keygen -t rsa -C "邮箱地址" -f ~/.ssh/jslite_rsa |
会生成 jslite_rsa 和 jslite_rsa.pub 这两个文件
2.密钥复制到托管平台上
1 | vim ~/.ssh/jslite_rsa.pub |
打开公钥文件 jslite_rsa.pub ,并把内容复制至代码托管平台上
3.修改config文件
1 | # 修改config文件,如果没有创建 config |
1 | # config 配置 |
- Host 这里是个别名可以随便命名
- HostName 一般是网站如:git@ss.github.com:username/repo.git 填写 github.com
- User 通常填写git
- IdentityFile 使用的公钥文件地址
4.测试
1 | ssh -T git@jslite.github.com # `@`后面跟上定义的Host |
5.使用1
git clone git@jslite.github.com:<jslite的用户名>/learngit.git
初始化版本仓库
1 | # 该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件 |
git 和目录绑定
在一个目录里可以通过 git init 命令把这个目录变成 Git 可以管理的仓库, 然后通过以下命令绑定提交的地址:1
git remote add origin https://github.com/gitname.github.io
或者直接 git clone 地址 就会创建目录和地址绑定
列出每个远程库的简短名字
1 | git remote -v |
添加远程仓库
1 | # gitName:自定义名字,一般upstream指上游仓库的名字,origin 一般指自己仓库的名字 |
git 分支修改名字
1 | git branch -m 原名 新名 |
本地修改暂时储藏
1 | git stash |
git合并多个commit
1 | # 首先你要先通过log查看一下历史 |
1 | # 推荐使用hash操作: |
rebase 命令执行后,会弹出一个界面:
pick 是用commit; squash 是合并前一个
注意这时候是vim界面,如果需要修改键盘敲 i (insert) 进行输入
将 pick 修改为 squash 或者 s
然后 按esc 退出vim界面, 输入 :wq 保存退出
会再弹出界面,这时候可以修改提交的描述,同样操作vim进行修改,:wq保存退出
这时候再 git log 查看一下 证明我们已经合并了
最后将我们的rebase修改push到我们的想要提交的库就行了
如果是团队合作:应该有两个远程
- 一个是 upstream 团队库的远程
- 一个是 origin 你fork的团队库
在本地提交的分支上 进行完rebase修改之后
在该分支上继续提交:可以 push -f 强制推送到我们的origin
1 | git push -f (默认是origin) |
也可以1
git push origin 当前分支名
如果我们团队开发,一定注意使用 -f 这些命令,force它代表强制执行,比较危险的命令,不要push到远程的upstream项目
回退到某一个版本
在 Git 中,用 HEAD 表示当前版本, 上一个版本就是 HEAD^, 上上一个版本就是 HEAD^^, 当然往上 100 个版本写 100 个 ^ 比较容易数不过来,所以写成 HEAD~100。
1 | # 回滚到上一个版本: |
–hard代表丢弃工作区的修改,让工作区与版本代码一模一样,与之对应,–soft参数代表保留工作区的修改
如果 git 回滚到历史版本后, git log 只能看历史版本再以前的版本号, 不到未来的版本号怎么办?
git 提供了一个命令 git reflog
用来记录你的每一次命令
利用 commit 关闭一个 issue
如果主管给我们开了一个任务issue,当我们完成并提交代码的时候 在描述中可以这样写:
1 | fix: <issue的地址> |
放弃工作区的修改
1 | git checkout <文件路径> |
展示工作区和暂存区的不同
1 | # 输出工作区和暂存区的 different (不同): |
展示暂存区、工作区和最近版本的不同
1 | # 输出工作区、暂存区 和本地最近的版本 (commit) 的 different (不同): |
创建并切换到本分支
1 | git checkout -b newBranch |
快速切换到上一个分支
1 | git checkout - |
可筛选的删除本地无用分支
1 | git branch|grep <需要删除分支名字或名称的一部分>|xargs git branch -d |
回到远程仓库的状态
1 | # 抛弃本地所有的修改,回到远程仓库的状态: |
展示本地分支关联远程仓库的情况
1 | git branch -vv |
列出所有远程分支
1 | # -r 参数相当于:remote |
回退到某一个版本
通过 git log
查看历史记录
如果你想回退到 edit readme
复制这个commit的上一个commit的hash值 70aebb3912208
1 | # 通过 reset 命令(将当前HEAD重置为指定状态)回退到该版本 |
这里介绍一下: git reset [
此形式将当前分支头重置为
如果省略
git reset [–hard|soft|mixed|merge|keep] 参数区别:
参数 | 描述 |
---|---|
–mixed | 默认(即不带任何参数的git reset),它回退到某个版本,只保留源码,回退commit和index信息 |
–soft | 回退到某个版本,不修改索引文件和工作树 |
–hard | 重置索引和工作树。丢弃自 |
–merge | 重置索引并更新工作树中 |
–keep | 重置索引条目,并更新工作树中 |
恢复 git reset -hard 的误操作, 可以通过 git reflog
查看hard记录
reflog命令:它会记录所有HEAD的历史,也就是说当你做 reset,checkout 等操作的时候,这些操作会被记录在reflog中
比如我们想恢复到 edit about
, 复制这个操作的hash值 e14f255
,然后执行以下操作:
1 | git reset --hard e14f255 |
git log
加上 -g
参数也能看见reflog信息
- 注意:当通过reset等操作丢失一个提交的时候,可以把它找回来。除非你的操作已经被git当做垃圾处理掉了,一般是30天以后
撤销一个 还未 push 的 commit
通过 git log
查看提交的commit历史
如果我们想撤回hash值为 9a98bc022f8b53a08
的 commit: git reset