git基本命令

2025-04-18

引言

本博文记录一些常用的git命令

本博文仅供本人学习记录用~

首先需要电脑配置安装了git

  • 对于windows,可到官网下载

安装完成后,在桌面上点击右键,出现下图所示的图标,则表示安装成功:

下载GitHub仓库

git clone --recursive https://github.com/{仓库名}

重新初始化

rm -rf .git

拉取远程新的分支

git pull origin <分支名>:<分支名>

推送GitHub仓库

push到已有仓库并创新新分支

  1. 初始化 Git 仓库(如果尚未初始化)
git init
  1. 添加远程仓库
git remote add origin https://github.com/{仓库名}.git
  1. 创建并切换到新分支(如分支名a100)
git checkout -b a100
  1. 添加并提交更改
git add .
git commit -m "Initial commit on branch a100"
  1. 推送到远程仓库
git push -u origin a100

更改默认分支

如下图所示

更改push的链接

仓库重命名后导致原本的本地代码无法push,这是因为本地 Git 配置中记录的远程仓库地址(Remote URL)失效了。可以直接在 VS Code 的集成终端里通过简单的 Git 命令来更新这个映射地址,完全不需要重新 clone 代码。

# 远程主机名称
git remote -v

# 输入以下命令修改远程映射链接,将 <new_url> 替换为新链接:
git remote set-url origin <new_url>

注意对于电脑1是强制推送(force push)了一个全新的 git 历史,而电脑2保留的是旧的 R-C-Group/VGGT-SLAM 的历史,两者的提交历史不兼容:

# 1. 先确认 remote 已经指向新地址
git remote -v

# 2. 拉取远端新历史(允许不相关历史合并)
git fetch origin

# 3. 强制重置本地到远端状态(直接放弃旧历史,以远端为准)
git reset --hard origin/main   # 如果分支是 master 就换成 origin/master

同时推送两个github仓库

# 查看当前的 remote 配置
git remote -v

# 添加一个新的 remote(指向仓库 2)
git remote add second-repo git@github.com:yourName/repo2.git

接下来验证配置应该是有两个不同的remote的

git remote -v
# origin      git@github.com:yourName/repo1.git (fetch)
# origin      git@github.com:yourName/repo1.git (push)
# second-repo git@github.com:yourName/repo2.git (fetch)
# second-repo git@github.com:yourName/repo2.git (push)

日常分别push两个仓库:

git push origin main
git push second-repo main
  • 如果想要一键同时更新,则应该为一个 Remote 配置多个 Push URL(请注意,拉取永远只有一个,因此实际上仓库2是备份用的):
git remote -v
# 原本默认显示如下:
# origin  git@github.com:yourName/repo1.git (fetch)
# origin  git@github.com:yourName/repo1.git (push)

# 添加第二个仓库的 Push URL
git remote set-url --add --push origin git@github.com:yourName/repo2.git
# 注意:一旦手动设置了 push URL,Git 就会覆盖默认的 push 行为,所以需要把第一个仓库的地址也显式地加回来。
# 重新添加第一个仓库的 Push URL:
git remote set-url --add --push origin git@github.com:yourName/repo1.git

# 再次运行 git remote -v,你应该能看到一个 fetch 地址和两个 push
# origin  git@github.com:yourName/repo1.git (fetch)
# origin  git@github.com:yourName/repo2.git (push)
# origin  git@github.com:yourName/repo1.git (push)

重新生成并配置 ssh key

ssh-keygen
  • 对于windows:进去我的电脑,C盘,自己用户名那个文件夹,找到.ssh文件夹。
  • 对于ubuntu:根据运行后输出的结果,一般在.ssh/***.pub
  • 对于mac:在终端运行cat /Users/电脑用户名/.ssh/id_rsa.pub

然后找到.pub结尾的,也就是id_rsa.pub,就是公钥。在进入自己的github,个人设置界面,找到SSH key那栏,new ssh key。添加好再push。

下面输入命令,验证是否配置成功

ssh -T git@github.com 

注意,如果重新配置了ssh key会导致远程服务器每次打开都需要输入密码。因此操作如下:

  • 将id_rsa.pub上传到服务器上;在本地电脑上运行:
ssh-copy-id -i "SSH公钥的文件地址" -p <port> <username>@<server_ip>
# 注意要用git bash
 
# 该操作会在服务器~/.ssh中生成authorized_keys文件,并将本地电脑id_rsa.pub中的内容复制到该文件中。
# ⭐因此你也可以先ssh登录自己的账户,再手动创建~/.ssh/authorized_keys文件(没有后缀),并复制公钥到该文件中,实现同样的效果。
  • PS: 除了ssh链接服务器有时还可以通过远程电脑桌面,配置如下,注意链接时用户名要确保输入正确(可能是域名\用户名,注意是\):
# 在目标电脑上启用远程桌面
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name "fDenyTSConnections" -Value 0

# 配置防火墙允许 RDP
Enable-NetFirewallRule -DisplayGroup "远程桌面"

DNS解析失败

报错: Could not resolve hostname github.com: No address associated with hostname 然后重新生成并配置 ssh key也还是不行。

下面看看ping会发现ping github.com发现是链接不上的,但是用HKU-VPN却是可以的

应该就是DNS问题,接下来先试试刷新DNS缓存

ipconfig /flushdns

把github ip加入到系统的hosts文件就行

通过链接查看到最新的ip是140.82.112.4

在文件C:\Windows\System32\drivers\etc\hosts中加入(先用管理者模式打开记事本,然后文件选择打开hosts文件)

140.82.112.4	github.com

然后再次测试

ssh -T git@github.com

ssh防火墙

有时会出现明明已经在github添加了ssh key但还是连不上。 或者每次都要重新添加才可以连上一段时间又断掉。则可能是防火墙的问题。

先查看细节,运行下面链接命令

ssh -vT git@github.com

若出现防火墙或网络中间设备干扰SSH连接的情况,可以通过编辑SSH配置文件来解决。 通过vscode或者记事本打开C:\Users\Kwan_\.ssh\config:

Host github.com
    Hostname ssh.github.com
    Port 443
    User git
    IdentityFile "C:\Users\Kwan_\.ssh\id_ed25519"  # 根据你的密钥文件调整
    IdentitiesOnly yes

添加用户及邮箱

对于新服务器或者电脑的vscode配置,在提交代码的时候可能报没有邮箱或用户名,用下面命令更新即可

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

Github误删仓库恢复

对于不小心删错的仓库,在90天内有恢复的功能。在github主页设置内,如下图所示。

PS:刚刚删除的仓库似乎要隔段时间才会显示~

清除Git 代理设置

有时出现能ping通,但是仍然没法pull,有可能是因为本地终端开启了代理,导致它尝试通过代理去访问IP,结果代理服务器找不到这个某个地址(如内网情况),就会返回 502。

可通过下面清除代理:

unset http_proxy
unset https_proxy