整理常用的一些git命令
基础命令
# 查看当前提交状态 git status # 添加文件到暂存区 git add [file1] [file2] # 添加指定文件夹到暂存区 git add [folder] # 添加所有文件到暂存区 git add -A # 提交代码到本地仓库 git commit -m [message] # 提交指定文件到本地仓库 git commit [file1] [file2] -m [message] # 提交时显示所有diff信息 git commit -v # 显示暂存区和工作区的差异 git diff # 查看提交日志 git log
初始化代码库
# 在当前目录下初始化代码库 git init # 在指定目录下初始化代码库 git init [project-name] # 远程拉取代码库 git clone [url] # 远程拉取代码库并指定目录 git clone [url] [project-name]
远程同步仓库
# 显示所有的远程仓库 git remote -v # 添加远程仓库 git remote add [shortname] [url] # 删除远程仓库 git remote rm [shortname] # 重命名远程仓库 git remote rename [old-name] [new-name] # 多远程仓库同步 git remote set-url --add [remote-name] [new-url] # 拉取远程仓库所有变动 git fetch [remote] # 拉取远程仓库指定分支所有变动 git fetch [remote] [branch] git remote set-url origin [地址] # 拉取当前绑定的远程分支的代码 git pull # 拉取指定远程分支的代码 git pull [remote] [branch] # 推送当前分支到远程仓库 git push [remote] [branch] # 推送所有分支到远程仓库 git push --all [remote] # 强制推送当前分支到远程仓库 git push --force [remote] [branch] # 强制推送所有分支到远程仓库 git push --force --all [remote]
分支管理
# 显示所有分支 git branch -a # 显示本地分支 git branch # 显示远程分支 git branch -r # 创建分支 git branch [name] # 新建一个分支并关联远程分支 git branch --track [branch] [remote-branch] # 本地分支推送到远程仓库 git push origin [branch] # 创建并切换到分支 git checkout -b [name] # 切换并创建分支 git switch -c [name] # 切换分支 git checkout [name] # 切换分支 git switch [name] # 删除本地分支 git branch -d [name] # 删除远程分支 git push origin --delete [name] # OR git branch -dr [remote/branch] # 修改分支名 git branch -m [old-name] [new-name] # 修改当前分支名 git branch -m [new-name] # 创建本地分支和远程分支的关联关系 git branch --set-upstream-to=[remote]/[branch] [local] # OR git branch --set-upstream [branch] [remote-branch] # 通过push创建本地分支和远程分支的关联关系 git push -u [remote] [branch]
代码合并和回退
# 合并指定分支到当前分支 git merge [branch] # 选择一个commit合并到当前分支 git cherry-pick [commitHash] # 回退到指定版本 git reset --hard [commitHash] # 回退当前修改未提交到暂存区的文件 git checkout -- [file] # 回退当前修改未提交到暂存区的所有文件 git checkout -- . # 回退当前修改未提交到暂存区的指定文件夹 git checkout -- [folder] # 已经提交到暂存区的代码退到未提交状态 git reset HEAD [file] # 删除已经提交到暂存区的文件 git rm [file1] [file2]
保存到栈
功能应用场景:
当你在开发一个新功能的时候,突然有一个bug需要修复,这个时候你可以把当前的工作保存到栈中,然后切换到bug分支进行修复,修复完成后再切换回来继续开发新功能。
shell
# 保存当前工作到栈中 git stash # 给当前工作保存到栈中并添加备注 git stash save "message" # 查看栈中的工作 git stash list # 恢复栈中的工作 git stash pop # 恢复栈中的指定工作 git stash pop stash@{0} # 0表示栈中的第一个工作 # 将堆栈中的内容恢复到当前分支,与pop不同的是,它不会删除栈中的内容,你能够多次恢复到当前工作的目录 git stash apply # 恢复栈中指定的工作 git stash apply stash@{0} # 0表示栈中的第一个工作 # 删除栈中的工作 git stash drop # 删除栈中指定的工作 git stash drop stash@{0} # 0表示栈中的第一个工作 # 清空栈中的工作 git stash clear # 查看堆栈中最新保存的工作和当前目录的差异,show默认显示第一个存储 git stash show
标记
shell
# 列出所有标记 git tag # 创建标记 git tag [name] # 创建带备注的标记 git tag -a [name] -m "message" # 删除标记 git tag -d [name] # 删除远程标记 git push origin :refs/tags/[name] # 查看标记日志 git show [name]
配置ssh
生成ssh key
bash
ssh-keygen -t rsa -C "你得git邮箱"
查看public key
bash
cat ~/.ssh/id_rsa.pub
复制key到对应的git平台
github#
通过仓库主页 「Setting」->「SSH and GPG keys」->「New SSH key」 ,将public key添加至仓库中
gitee#
通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,添加生成的 public key 添加到仓库中。
测试ssh
# 如果配置的是github中的ssh ssh -T git@github.com # 如果配置的是gitee中的ssh ssh -T git@gitee.com
首次使用ssh连接git,会提示是否继续连接,输入yes即可。
报错处理
如果在push
的时候遇到如下的错误信息:
kex_exchange_identification: Connection closed by remote host Connection closed by 20.205.243.166 port 22
解决办法:
在~/.ssh
下创建一个config
文件,内容如下:
Host github.com hostName ssh.github.com User git Port 443 ProxyCommand nc -v -x 127.0.0.1:7890 %h %p
git flow工作流
git flow是一种用于管理git分支的策略,也是一种工作流程模式。
使用git flow工作流,可以很好的管理项目的版本迭代,也可以很好的管理多人协作开发。
分支类型
-
feature分支: 用于功能开发
-
develop分支: 用于聚合feature分支开发的功能
-
release分支: 用于测试发版
-
main(master) 分支: 打上版本TAG长期稳定支持,任何一个tag都可以稳定发布
-
bugfix分支: bugfix 用于修复不紧急的bug 一般基于release创建,测试过程中出现的bug
-
hotfix 分支: 用于修复线上BUG
分支关系
-
feature分支: 从develop分支分出,合并到develop分支
-
develop分支: 从main分支分出,合并到main分支
-
release分支: 从develop分支分出,合并到develop分支和main分支
-
main(master) 分支: 从release分支分出,合并到release分支
-
hotfix 分支: 从main分支分出,合并到main分支和develop分支
代理配置
在某些情况下需要进行代理配置才能正常pull
和push
ssh代理
bash
# 进入ssh配置文件 cd ~/.ssh # 创建config文件 touch config # 编辑config文件 vim config
在config
文件中添加如下内容
bash
Host github.com ProxyCommand connect -S 127.0.0.1:1080 %h %p
其中Host
可以跟多个域名以空格进行分割即可:
Host github.com gitlab.com
-S
代表的是socks
代理。
http代理配置
全局全部代理配置
git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890
根据域名配置代理
git config --global http.https://github.com.proxy http://127.0.0.1:7890 git config --global https.https://github.com.proxy http://127.0.0.1:7890
取消代理配置
# 单个取消 git config --global --unset http.https://github.com.proxy # 全部取消 git config --global --unset http.proxy
自建内网穿透服务器
介绍
几种通过自己服务器实现内网穿透的教程
基于Docker的FRP内网穿透部署
服务器搭建(FRPS)
创建配置文件
# 创建存放目录 sudo mkdir /etc/frp # 创建frps.ini文件 nano /etc/frp/frps.ini
frps.ini内容如下:
[common] # 监听端口 bind_port = 7000 # 面板端口 dashboard_port = 7500 # 登录面板账号设置 dashboard_user = admin dashboard_pwd = spoto1234 # 设置http及https协议下代理端口(非重要) vhost_http_port = 7080 vhost_https_port = 7081 # 身份验证 token = 12345678
#服务器镜像:snowdreamtech/frps #重启:always #网络模式:host #文件映射:/etc/frp/frps.ini:/etc/frp/frps.ini docker run --restart=always --network host -d -v /etc/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps
中转客户端配置(FRPC)
服务器镜像:snowdreamtech/frpc 重启:always 网络模式:host 文件映射:/路径/frp/:/etc/frp/
配置文件示例:
[common] # server_addr为FRPS服务器IP地址 server_addr = x.x.x.x # server_port为服务端监听端口,bind_port server_port = 7000 # 身份验证 token = 12345678 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 2288 # [ssh] 为服务名称,下方此处设置为,访问frp服务段的2288端口时,等同于通过中转服务器访问127.0.0.1的22端口。 # type 为连接的类型,此处为tcp # local_ip 为中转客户端实际访问的IP # local_port 为目标端口 # remote_port 为远程端口 [ssh] type = tcp local_ip = 192.168.1.229 local_port = 80 remote_port = 18022 [unRAID web] type = tcp local_ip = 192.168.1.229 local_port = 80 remote_port = 18088 [Truenas web] type = tcp local_ip = 192.168.1.235 local_port = 80 remote_port = 18188 [speedtest] type = tcp local_ip = 192.168.1.229 local_port = 6580 remote_port = 18190 [webdav] type = tcp local_ip = 192.168.1.235 local_port = 18080 remote_port = 18189 [RDP PC1] type = tcp local_ip = 192.168.1.235 local_port = 3389 remote_port = 18389
-
如果监听服务可以有IP限制的设置,需要允许的访问IP为中转内网设备的内网IP;
-
FRP由于端口会暴露在互联网上,虽然说使用方便但安全性较差;
基于Zerotier根服务器的内网穿透部署
创建(伪)根服务器 | 项目地址:GitHub - Jonnyan404/zerotier-planet: 一分钟自建zerotier-planet
docker run --restart=on-failure:3 -d --name ztncui -e HTTP_PORT=4000 -e HTTP_ALL_INTERFACES=yes -e ZTNCUI_PASSWD=mrdoc.fun -p 4000:4000 keynetworks/ztncui
创建 moon 服务器 | 项目地址:GitHub - Jonnyan404/docker-zerotier-moon: 🐳 A docker image to create zerotier moon in one step.
#创建容器 docker run --name zerotier-moon -d -p 9993:9993 -p 9993:9993/udp -v /etc/ztconf/:/var/lib/zerotier-one jonnyan404/zerotier-moon -4 [公网ipx.x.x.x] #查看moon ID docker logs zerotier-moon
群晖 DSM 7.x 安装Zerotier客户端
登录SSH并创建虚拟网络设备TUN
#获取权限 sudo -i #创建“创建虚拟网络设备TUN”的脚本,并设为开机自动运行 echo -e '#!/bin/sh -e \ninsmod /lib/modules/tun.ko' > /usr/local/etc/rc.d/tun.sh #给予脚本运行权限 chmod a+x /usr/local/etc/rc.d/tun.sh #运行脚本创建TUN /usr/local/etc/rc.d/tun.sh #确认TUN是否创建成功 ls /dev/net/tun
创建存放配置文件的目录
mkdir /var/lib/zerotier-one
创建Zerotier应用容器:
docker run -d \ --name zt \ --restart=always \ --device=/dev/net/tun \ --net=host \ --cap-add=NET_ADMIN \ --cap-add=SYS_ADMIN \ -v /var/lib/zerotier-one:/var/lib/zerotier-one zerotier/zerotier-synology:latest
常用命令:
#查看zerotier状态 docker exec -it zt zerotier-cli status #加入网络 docker exec -it zt zerotier-cli join [xxxxxxxxxxxx]
#加入moon服务器 docker exec zt zerotier-cli orbit [moon_ID] [moon_ID] #确认是否加入 docker exec zt zerotier-cli listpeers
Windows 客户端加入moon服务器
cd C:\ProgramData\ZeroTier\One zerotier-cli orbit [moon_id] [moon_id]
常见问题
每次克隆代码都要输入用户名和密码怎么处理
1.第一种方式使用SSH免登陆配置。
2.第二种方式可以使用git config --global credential.helper store
,会在本地生成一个文件,记录账号和密码 同时这么api可以指定文件的存放位置,默认是~/.git-credentials
,可以通过--file [file-path]
来指定目录。