Git常用命令|博客系列
# 配置
首先是配置帐号信息 ssh -T git@github.com 测试。
# 修改项目中的个人信息
git help config # 获取帮助信息,查看修改个人信息的参数
git config --global user.name "小弟调调" # 修改全局名字
git config --global user.email "wowohoo@qq.com" # 修改全局邮箱
git config --list # 查看配置的信息
# 常见使用场景
# 创建SSH密钥
这个密钥用来跟 github 通信,在本地终端里生成然后上传到 github
ssh-keygen -t rsa -C 'wowohoo@qq.com' # 生成密钥
ssh-keygen -t rsa -C "wowohoo@qq.com" -f ~/.ssh/ww_rsa # 指定生成目录文件名字
ssh -T git@github.com # 测试是否成功
# 多账号ssh配置
1.生成指定名字的密钥
ssh-keygen -t rsa -C "邮箱地址" -f ~/.ssh/jslite_rsa
会生成 jslite_rsa 和 jslite_rsa.pub 这两个文件
2.密钥复制到托管平台上
vim ~/.ssh/jslite_rsa.pub
打开公钥文件 jslite_rsa.pub ,并把内容复制至代码托管平台上
3.修改config文件
vim ~/.ssh/config #修改config文件,如果没有创建 config
Host jslite.github.com
HostName github.com
User git
IdentityFile ~/.ssh/jslite_rsa
Host work.github.com
HostName github.com
# Port 服务器open-ssh端口(默认:22,默认时一般不写此行)
# PreferredAuthentications 配置登录时用什么权限认证
# publickey|password publickey|keyboard-interactive等
User git
IdentityFile ~/.ssh/work_rsa
Host这里是个别名可以随便命名HostName一般是网站如:git@ss.github.com:username/repo.git填写github.comUser通常填写gitIdentityFile使用的公钥文件地址
4.测试
ssh -T git@jslite.github.com # `@`后面跟上定义的Host
ssh -T work.github.com # 通过别名测试
ssh -i ~/公钥文件地址 Host别名 # 如 ssh -i ~/.ssh/work_rsa work.github.com
5.注意
如果你修改了id_rsa的名字,你需要将ssh key添加到SSH agent中,如:
ssh-add ~/.ssh/jslite_rsa
ssh-add -l # 查看所有的key
ssh-add -D # 删除所有的key
ssh-add -d ~/.ssh/jslite_rsa # 删除指定的key
# 免密码登录远程服务器
$ ssh-keygen -t rsa -P '' -f ~/.ssh/aliyunserver.key
$ ssh-copy-id -i ~/.ssh/aliyunserver.key.pub root@192.168.182.112 # 这里需要输入密码一次
编辑 ~/.ssh/config
Host aliyun1
HostName 192.168.182.112
User root
PreferredAuthentications publickey
IdentityFile ~/.ssh/aliyunserver.key
上面配置完了,可以通过命令登录,不需要输入IP地址和密码 ssh aliyun1
# 文件推向3个git库
1. 增加3个远程库地址
git remote add origin https://github.com/JSLite/JSLite.git
git remote set-url --add origin https://gitlab.com/wang/JSLite.js.git
git remote set-url --add origin https://oschina.net/wang/JSLite.js.git
2. 删除其中一个 set-url 地址
usage: git remote set-url [--push] <name> <newurl> [<oldurl>]
or: git remote set-url --add <name> <newurl>
or: git remote set-url --delete <name> <url>
git remote set-url --delete origin https://oschina.net/wang/JSLite.js.git
3.推送代码
git push origin master
git push -f origin master # 强制推送
4.拉代码
只能拉取 origin 里的一个url地址,这个fetch-url
默认为你添加的到 origin的第一个地址
git pull origin master
git pull --all # 获取远程所有内容包括tag
git pull origin next:master # 取回origin主机的next分支,与本地的master分支合并
git pull origin next # 远程分支是与当前分支合并
# 上面一条命令等同于下面两条命令
git fetch origin
git merge origin/next
如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。
但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。
$ git pull -p
# 等同于下面的命令
$ git fetch --prune origin
$ git fetch -p
5.更改pull
只需要更改config文件里,那三个url的顺序即可,fetch-url会直接对应排行第一的那个utl连接。
# 修改远程仓库地址
git remote remove origin # 删除该远程路径
git remote add origin git@jslite.github.com:JSLite/JSLite.git # 添加远程路径
# 撤销远程记录
git reset --hard HEAD~1 # 撤销一条记录
git push -f origin HEAD:master # 同步到远程仓库
# 放弃本地的文件修改
git reset --hard FETCH_HEAD # FETCH_HEAD表示上一次成功git pull之后形成的commit点。然后git pull
git reset --hard FETCH_HEAD 出现错误
git pull
You are not currently on a branch, so I cannot use any
'branch.<branchname>.merge' in your configuration file.
Please specify which remote branch you want to use on the command
line and try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) FOR details.
解决方法:
git checkout -b temp # 新建+切换到temp分支
git checkout master
# 最简单放弃本地修改内容
# 如果有的修改以及加入暂存区的话
git reset --hard
# 还原所有修改,不会删除新增的文件
git checkout .
# 下面命令会删除新增的文件
git clean -xdf
通过存储暂存区stash,在删除暂存区的方法放弃本地修改。
git stash && git stash drop
# 回滚到某个commit提交
git revert HEAD~1 # 撤销一条记录 会弹出 commit 编辑
git push # 提交回滚
# 回退到某一个版本
git reset --hard <hash>
# 例如 git reset --hard a3hd73r
# --hard代表丢弃工作区的修改,让工作区与版本代码一模一样,与之对应,
# --soft参数代表保留工作区的修改。
# 去掉某个commit
# 实质是新建了一个与原来完全相反的commit,抵消了原来commit的效果
git revert <commit-hash>
# 合并多个commit
# 这个命令,将最近4个commit合并为1个,HEAD代表当前版本。
# 将进入VIM界面,你可以修改提交信息。
git rebase -i HEAD~4
# 可以看到其中分为两个部分,上方未注释的部分是填写要执行的指令,
# 而下方注释的部分则是指令的提示说明。指令部分中由前方的命令名称、commit hash 和 commit message 组成
# 当前我们只要知道 pick 和 squash 这两个命令即可。
# --> pick 的意思是要会执行这个 commit
# --> squash 的意思是这个 commit 会被合并到前一个commit
# 我们将 需要保留的 这个 commit 前方的命令改成 squash 或 s,然后输入:wq以保存并退出
# 这是我们会看到 commit message 的编辑界面
# 其中, 非注释部分就是两次的 commit message, 你要做的就是将这两个修改成新的 commit message。
#
# 输入wq保存并推出, 再次输入git log查看 commit 历史信息,你会发现这两个 commit 已经合并了。
# 将修改强制推送到前端
git push -f origin master
