常用的git命令

git 是一种分布式版本管理工具,他有着强大的开源社区github,结合smartgit能够快速、高效、准确的对分支进行切换。
但是如果仅仅只是使用 smartgit 图形界面有时候也很不方便,至少在服务器上就没招了,因此了解一些 git bash 的基本命令是十分必要的。
接下来会介绍一些常用的基本的git bash命令。

一、git基本操作

配置git用户名和邮箱

1
2
git config user.username "用户名" 
git config user.email "邮箱"

生成ssh-key

1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

参数详解:

1
2
3
4
5
6
7
8
9
-e: 读取 openssh 的私钥或者公钥文件
-C: 添加注释
-f: 指定用来保存密钥的文件名
-i: 读取未加密的 ssh-v2 兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥
-l: 显示公钥文件的指纹数据
-N: 提供一个新密语
-P: 提供(旧)密语
-q: 静默模式
-t: 指定要创建的密钥类型。

可以使用其默认的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
zsr :: ~ ‹master*› % ssh-keygen                                                                 
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa): ~/.ssh/githubsshkey # 填写路径,可以指定文件名,可以缺省(缺省默认为 id_rsa)
Enter passphrase (empty for no passphrase): # 密码可为空
Enter same passphrase again: # 密码可为空
Your identification has been saved in ~/.ssh/githubsshkey.
Your public key has been saved in ~/.ssh/githubsshkey.pub.
The key fingerprint is:
SHA256:Va57YAfyxN86cD5a1ejR6imhQiJuM/2IeTyK5FI+W+4 zsr@zsr.local
The key's randomart image is:
+---[RSA 2048]----+
| . |
| . o |
| . = . |
| = + . + |
| S * + = o|
| . . . .. B.+ o |
| o...+ o ..B.o |
|.oo+=o=.. .+.+ . |
| .+=E=.o... .o |
+----[SHA256]-----+

然后根据提示连续回车即可在~/.ssh 目录下得到 githubsshkey 和 githubsshkey.pub
其中 githubsshkey.pub 文件里面存放的就是我们要使用的 public key。

生成多个ssh-key

要生成多个key重复上面操作即可,生成之后再.ssh目录下创建一个config文件,并配置私钥(没有.pub的那个文件)的相对路径

1
2
3
Host github.com
User zhoushirong
IdentityFile ~/.ssh/githubsshkey

git 常用命令

1
2
3
4
5
6
7
8
git clone git仓库地址 # 从git仓库拉取git代码到本地
git branch # 列出本地分支
git branch -r # 列出远程分支
git branch -a # 列出本地和远程分支
git branch 分支名 # 创建一个分支(*只是创建,不切换)
git branch -d | -D 分支名 # 删除本地分支
git branch -d | -D -r 分支名 # 删除远程分支
git checkout 分支名 # 拉取远程分支

git commit && push

1
2
3
4
5
git commit # 提交缓存区里面的文件
git commit -m "提交描述信息"
git push # 将本地仓库修改推送到服务器上的仓库
git push origin develop#— 将新分支push到远程分支
git push --set-upstream origin develop#— 将新分支push到远程分支并与之关联起来

git 合并a 分支到 b分支

step1:

1
git checkout b

step2:

1
git merge a

git 暂存

1
2
3
4
5
6
7
git stash # 将在当前分支修改的内容放到缓存区中,并会自动建立一个缓存的 list 集合。
git stash save "test-cmd-stash" # 同 git stash,区别在于可以自定义 stash 描述信息
git stash list # 查看 stash list 集合
git stash apply # 将当前分支的最后一次缓存的内容释放出来,但是刚才的记录还存在list中
git stash apply stash@{0} # git stash apply @{x} ,可以将编号x的缓存释放出来,但是该缓存还存在于list中
git stash pop # 将当前分支的最后一次缓存的内容释放出来,但是刚才的记录不存在list中
git stash clear # 清空所有 stash

git查看log

step1:

1
2
3
4
5
git log —— 按提交时间列出所有的更新
git log --pretty # pretty确定输出格式
git log --pretty=oneline # 日志简化版,只有commit message 和 hash
git log --pretty=oneline 文件名 # 显示某一个文件的git日志
git log -p -2 # -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新:

git标签相关

1
2
3
4
5
6
7
8
9
git tag #查看所有标签
git tag -a v0.0.1 -m '标签的描述信息' # 创建标签,并增加描述信息
git tag -d v0.0.1 # 删除本地标签

git push origin v0.0.1 # 将指定标签push到服务器(git push默认不会提交标签信息)
git push origin --delete v0.0.1 # 删除远程的标签

git checkout v0.0.1 # 将 git 指针指向该标签位置
git checkout -b dev/base-tag # 基于上一步的版本创建一个新的分支

gitignore

有时候会遇到加入.gitignore文件的时候无效的问题,这个是因为某些文件已经被纳入了版本库

解决办法:

1
2
3
4
git rm -r --cached .
git add .
git commit -m 'clean commit messages'
git push

git撤销修改

git有四个区:工作区(Working Area)、暂存区(Stage)、本地仓库(Local Repository)、远程仓库(Remote Repository)
git有五种状态:未修改(Orgin)、已修改(Modified)、已暂存(Staged)、已提交(Committed)、已推送(Pushed)

1.已修改,未暂存

1
2
3
4
5
6
git diff # 查看修改
git checkout . # 撤销所有修改(方法一)
git checkout -- xx.js # 撤销单个文件
git clean -df # 清除文件夹和文件
git clean -dfn # 显示清除文件夹和文件的文件列表
git clean -dfx # x 命令会将 .gitignore 的文件和文件夹也干掉,慎用。

2.已暂存

1
2
3
4
5
6
git diff --cached #  查看修改

git reset # 把修改退回到git add .之前
git checkcout . # 撤回已修改,未缓存状态

git reset --hard # 等同于上面两个命令的组合

3.已提交,未推送

1
2
3
git diff master orgin/master # 查看修改
git reset --hard orgin/master # 撤回修改(orgin/master代表远程仓库,相当于从远程仓库把代码取回来)
git reset xxid # 回滚到目标 commit

4.已推送的代码撤销

1
2
git reset --hard HEAD^ # 恢复本地仓库
git push -f # 强制push到远程仓库

git push提示没有权限

1
2
3
4
5
6
git push
git@g.hz.netease.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

解决办法

1
2
3
ssh-add -l
# Then, if you don't see your key listed, add it with:
ssh-add ~/.ssh/identity # 生成的私钥

提示DNS欺骗检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: POSSIBLE DNS SPOOFING DETECTED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The ECDSA host key for [g.hz.netease.com]:22222 has changed,
and the key for the corresponding IP address [59.111.178.110]:22222
is unknown. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:iktCbxKzaP13xO9iY/5B9tkuIYE9BZfC31uW1Z6F4YQ.
Please contact your system administrator.
Add correct host key in ~/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in ~/.ssh/known_hosts:20
ECDSA host key for [g.hz.netease.com]:22222 has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

出错原因:

1
2
3
know_hosts 
# ssh登录的时候,当远程主机的公钥被接受以后,就会保存远程主机的公钥到此文件
# 出错的原因可能是公钥和对应的主机对应不上了。

解决办法

1
2
# 删除~/.ssh/known_hosts里面对应的公钥条目、或者直接删除此文件
rm -rf ~/.ssh/known_hosts

VSCode编辑器的 git 实用插件

1
gitLens

增强VSCode内置的Git功能,可在编辑界面显示某行代码最近修改的作者身份,修改时间,git提交描述信息。
无缝导航和连接Git存储库,通过强大的比较命令获得有价值的信息。

相关链接

https://git-scm.com/book/zh/v2