git-常用命令
git 常用命令
目录
- 初始化仓库
- 全局配置用户名和邮箱地址
- 删除全局配置的用户名和邮箱地址
- 对当前仓库配置用户名和邮箱地址
- 查看全局配置的用户名和邮箱
- 查看当前仓库的用户名和邮箱
- 生成-SSH-公钥
- 关联远程仓库
- 把本地库的所有内容推送到远程库
- 从远程仓库克隆
- 将修改的文件提交到暂存区
- 将文件从暂存区提交到版本库
- 修改-commit-的注释信息
- 查看当前提交状态
- 查看文件具体变更内容
- 查看提交的历史版本
- 查看操作命令历史记录
- 版本回退
- 撤销修改或提交
- 删除文件
- 分支操作
- 对比两个分支差异
- 保存工作现场
- 查看已经保存工作现场
- 恢复工作现场
- 获取远程仓库最新提交到本地
- 打标签
- 查看所有标签
- 补标签
- 查看标签信息
- 删除标签
- 将标签推送到远程
- 清空缓存
初始化仓库
1 | $ git init |
全局配置用户名和邮箱地址
1 | $ git config --global user.name "Your Name" |
注意:如果一台机器需要使用多个 ssh 公钥的方式,不应使用全局配置,而是每个仓库独立配置。否则提交时,远程仓库的 commit 记录会显示是全局用户做的提交操作。
删除全局配置的用户名和邮箱地址
1 | $ git config --global --unset user.name |
对当前仓库配置用户名和邮箱地址
1 | $ git config user.name "Your Name" |
查看全局配置的用户名和邮箱
1 | $ git config --global user.name |
查看当前仓库的用户名和邮箱
1 | $ git config user.name |
生成-SSH-公钥
1、为 git@example.com
用户生成 SSH 公钥 id_rsa
文件,并保存在默认目录 ~/.ssh
下
1 | $ ssh-keygen -t rsa -C "git@example.com " -f ~/.ssh/id_rsa |
2、测试 username (默认用户名为 git)的 SSH 链接是否正常
1 | $ ssh –T <username> |
关联远程仓库
添加名称为 origin 的关联信息
1 | $ git remote add origin git@github.com:username/name.git |
或
1 | $ git remote add origin https://github.com/username/name.git |
查看全部关联的详细信息
1 | $ git remote -v |
把本地库的所有内容推送到远程库
1、通常添加参数 -u
,简化提交远程库流程。例如:把本地的 master 分支和远程的 master 分支关联:
1 | $ git push -u origin master |
2、使用参数 -u 关联后,推送最新修改命令简化为:
1 | $ git push |
从远程仓库克隆
1、默认方式,克隆全部分支,并指定本地文件夹名称为 dirName
1 | $ git clone git@github.com:username/repositoryname.git dirName |
2、克隆指定分支
1 | $ git clone -b branchname https://github.com/username/repositoryname.git |
git 支持多种协议,包括 https,但通过 ssh 支持的原生 git 协议速度最快。
将修改的文件提交到暂存区
1 | $ git add <filename.xxx> [-u][.][-A] |
-u
参数:提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
.
参数:提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
-A
参数:提交所有变化,包括新文件(new)、被修改(modified)文件、被删除(deleted)文件
将文件从暂存区提交到版本库
1 | $ git commit -m "create new file" |
修改 commit 的注释信息
1 | $ git commit --amend |
查看当前提交状态
可以查看是否存在变更,但不能查看具体变更了什么内容
1 | $ git status |
查看文件具体变更内容
1 | git diff <fileName.xxx> |
查看提交的历史版本
默认情况下显示的信息冗长,使用时通常 --pretty=oneline
参数。例子:仅显示提交的最近 3 条提交历史版本号,只能显示 head 指向的当前版本和之前的版本信息
1、本地仓库
1 | $ git log --pretty=oneline -3 |
2、远程仓库
1 | $ git log origin/master --pretty=oneline -3 |
查看操作命令历史记录
使用该命令可以某版本在执行回退后再次返回某版本,前提是不退出当前命令行窗口
1 | $ git reflog |
版本回退
1、回退到上一个版本:$ git reset --hard HEAD^
2、回退到上上一个版本:$ git reset --hard HEAD^^
3、回退到上 50 个版本:$ git reset --hard HEAD~50
4、根据版本号回退,版本号不必输入完全,可区别即可:$ git reset --hard <versionCode>
撤销修改或提交
1、修改后还没有被放到暂存区
1 | git checkout -- <fileName.xxx> |
2、修改后已经放到暂存区
1 | $ git reset HEAD <fileName.xxx> |
3、修改后已经提交到版本库。此时,使用版本回退,回退到指定版本
删除文件
1、从暂存区删除文件
1 | $ git rm <fileName.xxx> |
2、从暂存区恢复文件,只能恢复文件到最新版本,并丢失最近一次提交后修改的内容。
1 | $ git checkout -- <fileName.xxx> |
分支操作
1、本地分支
- 创建本地分支:
$ git branch feature-local
- 切换到本地分支:
$ git checkout feature-local
- 创建并同时切换到本地分支:
$ git checkout –b feature-local
2、远程分支
- 在远程开好分支 feature-branch,本地获取:
$ git checkout -b feature-local origin/feature-branch
- 本地创建名为 dev 的远程分支:
$ git checkout -b dev origin/dev
- 指定推送本地的 feature-local 分支到远程 origin 的 feature-branch 分支,若远程不存在该分支则新建:
1 | $ git push origin feature-local:feature-branch |
3、查看所有分支(本地分支和远程分支):$ git branch -a
4、合并分支
要合并 dev 分支到 master 主分支。先切换到 master 分支后,执行命令:$ git merge dev
注:通常合并分支时 git 会用 Fast forward 模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用 Fast forward 模式,git 就会在 merge 时生成一个新的 commit,这样,从分支历史上就可以看出分支信息:$ git merge --no-ff -m "merge with no-ff" dev
5、查看分支历史:$ git log --graph --pretty=oneline --abbrev-commit
,若内容过多,可仅显示前 10 条:$ git log --oneline -10
6、删除分支
1 | $ git branch -d <branchName> |
如果分支还没有合并,使用上条命令会出现提示阻止删除,此时需要强行删除
1 | $ git branch -D <branchName> |
7、合并远程分支到本地
- 在本地新建一个 temp 分支,并将远程 origin 仓库的 master 分支代码下载到本地 temp 分支:
git fetch origin master:tmp
- 比较本地代码与刚刚从远程下载下来的代码的区别:
git diff tmp
- 合并 temp 分支到本地的 master 分支:
git merge tmp
- 如果不想保留 temp 分支 可以用这步删除:
git branch -d temp
注意:若提交历史不同,无法合并,参见「合并两个不同提交历史的分支」。
8、合并两个不同提交历史的分支
- 将远程仓库的更新获取到本地分支 temp:
git fetch origin master:temp
- 此时若直接合并,因为提交历史不同,出现 fatal: refusing to merge unrelated histories 错误,需要增加参数,强制合并即可。:
git merge temp --allow-unrelated-histories
9、切换分支时出现 “error: The following untracked working tree files……”
1 | error: The following untracked working tree files would be overwritten by checkout: |
解决方式:删除上述涉及的文件即可。执行如下命令
1 | git clean -d -fx |
git clean 参数
- -n 显示将要删除的文件和目录;
- -x 删除忽略文件已经对 git 来说不识别的文件
- -d 删除未被添加到 git 的路径中的文件
- -f 强制运行
对比两个分支差异
有 2 个分支:master、dev。
1、查看 dev 有,而 master 中没有的:
1 | git log dev ^master |
2、查看 dev 中比 master 中多提交了哪些内容:
1 | git log master..dev |
3、只比较两个分支有什么不一样:
1 | git log dev...master |
在上述情况下,再显示出每个提交是在哪个分支上:git log --left-right dev...master
根据 –left-right dev…master
的顺序,左箭头 < 表示是 dev 分支提交;右箭头 > 表示 master 分支提交
保存工作现场
1 | $ git stash |
注意:要提交到暂存区才可以执行 stash,可以执行多次 stash
查看已经保存工作现场
1 | $ git stash list |
恢复工作现场
使用 git stash apply 恢复:
$ git stash apply stash@{0}
,但这种方式恢复后 stash 内容并不删除,需要用 git stash drop 来删除:$ git stash drop stash@{0}
另一种方式是用 git stash pop,恢复的同时把 stash 内容也删了:
$ git stash pop stash@{0}
获取远程仓库最新提交到本地
1 | $ git pull |
如果 git pull 提示 no tracking information,则说明本地分支和远程分支的链接关系没有创建,执行命令:
1 | git branch --set-upstream-to <branch-name> origin/<branch-name> |
抓取远程分支最新提交到本地分支
1 | git pull origin 远端分支名:本地分支名 |
打标签
切换到需要打标签的分支上执行命令:$ git tag v1.0
查看所有标签
1 | $ git tag |
补标签
查看历史提交,找到需要补标签的提交的 id,执行命令:$ git tag v0.9 <commitId>
,也可以为标签添加说明,用 -a 指定标签名,-m 指定说明文字:$ git tag -a v0.1 -m "version 0.1" <commitId>
注:标签不是按时间顺序列出,而是按字母排序的
查看标签信息
1 | $ git show <tagName> |
删除标签
- 删除本地标签
1 | $ git tag -d v0.1 |
- 删除远程标签,要先删除本地标签,再 push
1 | $ git tag -d v0.9 |
将标签推送到远程
1 | $ git push origin v1.0 |
一次性推送全部尚未推送到远程的本地标签:$ git push origin –-tags
清空缓存
1 | git rm -r --cached . |
例如,当 ignore 文件更新时,如果不清空缓存,则不生效。
命令行创建空白 .gitignore 文件
进入库目录,命令行执行 touch .gitignore
即可。