Git工作流

Github科研项目用法

常见问题

如果修改了github仓库名,需要重新绑定仓库才能正常推送吗?

不需要重新绑定,大部分情况 无需重新配置远程仓库即可正常推送。

GitHub 在你修改仓库名后,会自动保持一个 永久重定向(301 redirect),指向新的仓库 URL。

需要手动更新 remote URL的情况:

希望 remote 显示新的仓库名

例如现在 remote 显示:origin https://github.com/you/oldname.git,想把它改成:origin https://github.com/you/newname.git,执行

bash 复制代码
git remote set-url origin https://github.com/你的用户名/新仓库名.git

无法切换分支

bash 复制代码
error: The following untracked working tree files would be overwritten by checkout:

当前目录下有未提交的修改,如果切换分支会导致它们被覆盖,Git 会自动阻止分支切换。

步骤 1:把文件夹加入 .gitignore

步骤 2:清理 Git index(不会删本地文件)

bash 复制代码
git rm -r --cached .
git add .
git commit -m "Clean index and ignore local folders"

Git 全局配置方式

分别配置 用户名 和 邮箱

bash 复制代码
git config --global user.name "用户名"
git config --global user.email "邮箱"

验证是否配置成功

bash 复制代码
git config --global --list

当前Git 仓库绑定GitHub仓库

初始化

切换到当前目录

bash 复制代码
cd /当前目录

当前目录还不是 Git 仓库,需要先初始化

bash 复制代码
git init

绑定 GitHub

bash 复制代码
git remote add origin git@github.com:你的用户名/你的仓库名.git

验证远程仓库是否真正可用

bash 复制代码
git fetch origin

没有报错,远程仓库连接正常

检查

bash 复制代码
git remote -v

SSH Key 添加到 GitHub 账户

检查你本机是否已有 SSH Key

bash 复制代码
ls ~/.ssh

生成新的 SSH Key(如上一步没有key)

bash 复制代码
ssh-keygen -t ed25519 -C "邮箱"

复制公钥

bash 复制代码
cat ~/.ssh/id_ed25519.pub

复制输出的 整一行内容

添加到 GitHub

GitHub------Settings------SSH and GPG keys------New SSH key

测试 SSH 是否已打通

bash 复制代码
ssh -T git@github.com

重新拉取远程仓库

bash 复制代码
git fetch origin

重新绑定仓库

一、确认当前本地仓库状态

bash 复制代码
git status
git remote -v

二、场景 1:本地已有 Git 仓库,只是要换一个 GitHub 仓库

bash 复制代码
# 删除原有远程仓库绑定
git remote remove origin
# 验证
git remote -v
# 若无输出,说明已成功解绑
bash 复制代码
# 添加新的 GitHub 仓库地址(SSH方式)
git remote add origin git@github.com:用户名/新仓库名.git

.gitignore 模板(深度学习项目专用)

方法一 Git bash命令行创建

bash 复制代码
# 在项目根目录执行
touch .gitignore
# 编辑
nano .gitignore

方法二 资源管理器创建

注:.gitignore 不是 .txt 文件,它是一个没有后缀名的纯文本文件

步骤一:在项目根目录创建文件

bash 复制代码
.gitignore

步骤二:复制以下内容

bash 复制代码
# ===================================
# Python 缓存文件
# ===================================
__pycache__/
*.py[cod]
*$py.class

# ===================================
# 虚拟环境 (venv/conda/env)
# ===================================
env/
venv/
.venv/
ENV/
env.bak/
.conda/

# ===================================
# IDE 配置 (PyCharm, VSCode)
# ===================================
.idea/
.vscode/
*.code-workspace

# ===================================
# Jupyter Notebook 检查点
# ===================================
.ipynb_checkpoints/

# ===================================
# 日志文件
# ===================================
*.log
logs/
tensorboard/
runs/        # PyTorch TensorBoard 默认输出目录

# ===================================
# 数据集 / 原始 wav / 图像文件
# 请不要把真实数据推到 GitHub
# ===================================
datasets/
data/
*.wav
*.mp3
*.flac
*.png
*.jpg
*.jpeg
*.bmp
*.tiff

# ===================================
# 特征图像(Mel、GAF、GASF、GADF)
# ===================================
datasets_mel*/
features/
spectrogram/
mel_spectrogram/
gasf/
gadf/
gaf/

# ===================================
# 模型权重、大文件
# ===================================
*.pth
*.pt
*.ckpt
*.weights

# ===================================
# 训练中产生的中间文件
# ===================================
*.npy
*.npz
*.pkl
*.pickle
*.h5

# ===================================
# 压缩包 / 临时文件
# ===================================
*.zip
*.tar.gz
*.rar
*.7z
*.bak
*.tmp
*.temp

# ===================================
# 输出结果
# ===================================
output/
results/
figures/

# ===================================
# 本地配置文件
# ===================================
config.yaml
config.json
*.local
.env
*.ini

# ===================================
# 系统文件
# ===================================
.DS_Store
Thumbs.db

步骤三:推送到github(必须)

bash 复制代码
git add .gitignore
git commit -m "chore: add .gitignore to define ignore rules"
git push origin main
# 如果主分支不是 main,而是 dev
# git push origin dev
bash 复制代码
# 清除 Git 之前跟踪的无用文件,按新的 `.gitignore` 规则重新跟踪文件。
git rm -r --cached .
git add .
git commit -m "apply gitignore"
git push

创建分支

注:Git 终端显示的分支是"本地当前检出分支",无论你是否连接 GitHub,Git Bash 的提示符 永远只显示当前检出的本地分支。

对于:项目唯一开发者、项目结构简单、希望直接修改 main 分支、每次改动影响较小,不需要创建分支

科研项目推荐 Git 分支结构

bash 复制代码
main
│
├── dev
│   │
│   ├── feature/mvdr_beamforming
│   ├── feature/noise_reduction_enhancement
│   ├── feature/stft_mel_extractor
│   ├── feature/gasf_gadf_extractor
│   ├── feature/pinn_model
│   ├── feature/pcnn_module
│   ├── feature/tensorboard_logger
│   ├── feature/phys_field_feedback
│   └── feature/evaluation_metrics
│
└── experiment/
    ├── experiment/1-array-design
    ├── experiment/2-mvdr-denoise
    ├── experiment/3-feature-mel
    ├── experiment/4-feature-gasf
    ├── experiment/5-feature-gadf
    ├── experiment/6-model-vggse
    ├── experiment/7-model-resnet18
    ├── experiment/8-model-lenet
    ├── experiment/9-model-pcnn_pinn
    └── experiment/10-phys-feedback

分支下创建子分支

bash 复制代码
# main下创建dev分支
git checkout -b dev 
git push -u origin dev
# dev下创建feature分支
git checkout dev
git checkout -b feature/mvdr_beamforming
git push -u origin feature/mvdr_beamforming
# master下创建experiment分支
git checkout master
git checkout -b experiment/3-feature-mel
git push -u origin experiment/3-feature-mel

科研项目分支

main(主分支):保存最稳定、能复现论文结果的版本;能正常运行、无报错;用于最终提交、论文复现代码

dev(开发分支):所有新功能优先合并到 dev,是 main 的"候选版本"

feature 分支(按模块拆分):开发独立功能,不影响 dev 和 main

experiment 分支(特别适合科研):保存每个实验组的配置;方便多次回溯;执行 A/B 对照时非常方便;图像分类任务不同实验不会互相影响

查看分支

查看本地所有分支

bash 复制代码
git branch

(带*的是当前分支)

查看所有远程分支

bash 复制代码
git branch -r

查看本地 + 远程所有分支

bash 复制代码
git branch -a

如何判断该本地分支是否与 GitHub 的远程分支关联

bash 复制代码
git branch -vv

左边是本地分支,中括号内是它的 remote tracking branch(远程跟踪分支)。如果没有中括号,则代表:本地分支与远程分支暂时没有 tracking 关系

切换分支

切换到已存在的本地分支

bash 复制代码
git checkout 目标分支名

切换到远程分支

bash 复制代码
git switch -c 本地分支名 origin/远程分支名

删除分支

删除 Git 分支

删除 Git 分支分为两类:删除本地分支 和 删除远程分支(GitHub上的)

一、删除本地分支

bash 复制代码
# 如果分支已经被合并
git branch -d 分支名
# 强制删除
git branch -D 分支名

二、删除远程分支

bash 复制代码
git push origin --delete 分支名

将文件或文件夹上传到 GitHub 的 指定分支

一、检查当前所处的分支

bash 复制代码
# 带 * 的就是当前分支
git branch
# 如果你不在目标分支,请切换
git checkout 分支名

二、把文件或文件夹放到项目目录中

将你的文件/文件夹直接复制进本地项目目录即可

三、添加文件到暂存区

bash 复制代码
git add 文件名
# 添加所有更改
git add .

四、提交 commit

bash 复制代码
git commit -m "feat: add new_data folder"

五、推送到指定分支

bash 复制代码
git push origin 分支名

注:分支之间互不影响,除非你主动 merge 或开 PR

本地和github分支是否一致

创建分支后,本地和 GitHub 分支不用一直一致。但在推送、删除文件、修改历史时,本地分支必须要和github上的分支保持一致。

bash 复制代码
# 先 pull → 拉取远程文件夹 → 本地出现这个目录 → 才能 执行 rm 删除,push 到远程、切换分支等操作
git pull origin feature/mvdr_beamforming

规范 Git 提交习惯

一次提交 = 一件独立的事

  • 一次只改 一个功能点
  • 一次只完成 一个实验改动
  • 一次只完成 一个模块

提交必须写清楚"你做了什么"

restore 恢复到某一版本

delete

feat: add PCNN feature extractor

model: replace AlexNet with ResNet18 backbone

train: add Laplacian regularization to PINN loss

data: fix class order in MelSpectrogramDataset

viz: add t-SNE visualization for test features

exp: add experiment group paper3-4 vs paper4-4

fix: fix dimension mismatch in GAF input

doc: update README with dataset structure

不要把垃圾提交到仓库

  • .pt .pth 大模型权重
  • pycache/
  • .idea/
  • 临时测试文件

标准科研 Git 工作流

每次改代码,固定 4 步:

  1. git status
  2. git add .
  3. git commit -m "类型: 一句话说明"
  4. git push

git add .

git add .表示:把当前目录以及所有子目录中的所有修改(新增、修改、删除)全部加入暂存区。

也就是说你修改过的文件、你新增的文件、你删除的文件,全部被 Git 标记为"将要提交的内容"。

它不会提交、推送、清空任何文件、改变历史记录,仅仅是把修改暂存起来,准备提交。

Commits提交规范

bash 复制代码
git add .

git commit -m "feat(training): add Laplacian physics regularization" \
-m "- 为了提升模型对物理一致性的约束,需要在训练阶段加入拉普拉斯正则项" \
-m "- 在 train.py 中集成 physics_loss,并添加对应的 config 参数选项" \
-m "- 改进后训练曲线更稳定,模型在测试集的 G-Mean 与 F1-score 均有提升"

在 PyCharm 中手动指定 Git 路径

bash 复制代码
File → Settings → Version Control → Git

Git可执行文件路径E:\software_install\Git\Git\cmd\git.exe,点击右侧test

PyCharm 中的 Git 行为逻辑

注:在 PyCharm 中指定了 Git(设置好 VCS = Git)之后,你在 PyCharm 中所做的所有代码操作都只作用于本地仓库,不会自动影响远程 GitHub。这是所有 Git 客户端(PyCharm、VSCode、Git Bash)的标准行为。只有执行 Pull / Fetch 时才与 GitHub 通信

通过Git更改pycharm中的文件后,.wav文件和.png文件可能会被损坏

  1. 你在 PyCharm 修改代码 → 只影响本地工作区(Working Directory)
  2. 你在 PyCharm 使用 commit → 只产生本地 commit
  3. 你在 PyCharm 使用 push → 才会上传到 GitHub
  4. 你在 PyCharm 切换分支 → 只切换本地分支

服务器拉取仓库

测试SSH连接

bash 复制代码
ssh -T git@github.com

克隆仓库

git clone git@github.com:用户名/仓库名.git

在 Git 中更新代码/提交本地修改/推送到github

拉取仓库更新

bash 复制代码
# 进入仓库目录
cd 仓库名
# 拉取主分支
git pull
# 拉取指定分支
git pull origin dev

提交本地修改(仓库目录内执行)

bash 复制代码
# 进入仓库目录
cd 仓库名
# 查看哪些文件被修改/新增
git status
# 查看具体修改内容
git diff
# 提交所有修改
git add .
# 仅提交指定文件
git add 文件名1 文件名2
# 提交到本地仓库
git commit -m "类型: 一句话说明"

推送到Github远程仓库

bash 复制代码
# 推送到默认主分支
git push orign main

git推送指定的文件

将指定文件加入暂存区

bash 复制代码
# 推送某一个文件
git add path/to/your_file.m

# 添加多个文件
git add file1.m file2.m file3.m

# 添加某个目录
git add src/

# 添加全部改动
git add .

提交(只会提交刚才 add 的文件)

bash 复制代码
git commit -m "feat: update only selected files"

推送到远程仓库

bash 复制代码
# 默认分支
git push
# 指定分支
git push -u origin 分支名

删除文件

将某个目录加入 .gitignore,并确保 GitHub 不再跟踪它(同时本地不删除)

一、在 .gitignore 中加入目录

bash 复制代码
# 如果这些目录之前已经被 Git 跟踪,必须取消对它们的跟踪
git rm -r --cached others signal_analysis old_code

# 假设目录名是 others/, 编辑 .gitignore
others/

二、提交变更

bash 复制代码
git commit -m "chore: untrack ignored directories"

三、推送到 GitHub

bash 复制代码
git push

推送后,这些目录会从 GitHub 消失,但本地仍然存在

四、验证是否生效

bash 复制代码
git status

如果 .gitignore 设置正确且取消跟踪成功,这些目录不会再显示在变更列表中。

删除 GitHub 上和本地文件

步骤 1:在本地仓库中删除 GitHub 版本的文件

进入你的本地 Git 仓库文件夹,在里面删掉目标文件

bash 复制代码
rm data.txt

或使用资源管理器直接删除

步骤 3:更新 Git 状态

bash 复制代码
git add .

步骤 4:提交删除记录

bash 复制代码
git commit -m "delete file from repository only"

步骤 5:推送到 GitHub

bash 复制代码
git push

只删除远程,不动本地

保持本地文件仍然留在项目目录里,但 GitHub 删除它(并停止跟踪)

步骤1:使用缓存删除文件(不删除本地)

bash 复制代码
# 删除文件
git rm --cached filename
# 删除文件夹
git rm -r --cached filename

本地文件不会被删除,只是退出 Git 版本控制

步骤2:提交

bash 复制代码
git commit -m "remove file from GitHub repo but keep local file"

步骤 3:推送到 GitHub

bash 复制代码
git push

删除多个文件夹

同上,用 git rm --cached 取消跟踪(不删除本地文件)

bash 复制代码
git rm -r --cached array MVDRBeamformerHDLOptimizedExample SMIR-Generator Signal-Generator
git commit -m "chore: untrack folders (array, MVDRBeamformerHDLOptimizedExample, SMIR-Generator, Signal-Generator)"
git push

GitHub 上文件消失,但本地文件保留

Git 恢复版本方法

包括恢复单个文件、恢复整个项目、回退 commit、撤销 push 等

一、查看历史版本

bash 复制代码
git log --oneline

记住你想恢复的 版本号前 7 位

二、恢复"单个文件"到某个版本(常用)

bash 复制代码
git checkout 7b8d123 -- matlab/mvdr_main.m
git add .
git commit -m "restore mvdr_main.m to version 7b8d123"
git push

三、恢复整个项目到某一版本.

bash 复制代码
# 1. 软回退(保留修改)只是把 HEAD 指针指回去,但你写的代码还留着
git reset --soft 7b8d123
# 2. 混合回退(默认)
git reset 7b8d123
# 3. 硬回退(彻底恢复,丢弃本地修改)
git reset --hard 7b8d123
推送强制同步
git push -f

四、恢复某一 commit 然后继续向前(推荐科研项目)

bash 复制代码
# 撤销某次修改,但保留历史。会生成一个新的 commit,把该版本的更改"反做"
git revert 7b8d123
git push

恢复文件夹

注:要恢复文件夹,需要使用删除"之前"的那个 commit

bash 复制代码
git checkout d6fe0a3 -- others
git commit -m "restore 'others'"
git push origin HEAD:master
# 使用"git pull"来更新你的本地分支
git pull

对文件进行移动、重命名、修改

你在本地项目根目录对文件进行移动、重命名、修改、删除,只要 Commit + Push 到 GitHub,GitHub 上的仓库就会同步发生相同的变化。

移动/重命名文件

bash 复制代码
# 重命名文件
git mv old_name.py new_name.py
# 移动文件到某个文件夹
git mv mvdr/main.m matlab/mvdr_main.m
# 移动整个目录
git mv matlab_scripts matlab/
# 确认所有更改
git status
# 推送到 GitHub
git add .
git commit -m "refactor: reorganize project structure"
git push
相关推荐
yuanyuan2o23 小时前
Git merge 的几种不同模式
git·github
视觉小萌新3 小时前
关于Vscode配置企业Git
git
zh_xuan4 小时前
使用命令行把安装包上传到github
c++·git·libcurl·c++工程打包
AI周红伟4 小时前
三年狂赚1.75亿!卖课,才是中国AI最容易赚钱的生意
人工智能·深度学习·学习·机器学习·copilot·openclaw
zhangfeng11335 小时前
适合 5人以内小团队的Git 工作流 + Code Review + 自动化部署方案 FastAdmin +linunx服务器宝塔系统 外包项目 —
服务器·git·自动化·php·代码复审
沪漂阿龙5 小时前
从买菜做饭到大模型:一份真正看懂深度学习的硬核指南
人工智能·深度学习
2zcode6 小时前
基于深度学习的肺部听诊音疾病智能诊断方法研究
人工智能·深度学习
YBAdvanceFu7 小时前
开源音乐生成新王炸!ACE-Step用Qwen3+扩散模型实现音色克隆,代码深度解析
人工智能·深度学习·机器学习·llm·数据科学·ace·ai时代
2zcode7 小时前
基于MATLAB深度学习的非酒精性脂肪性肝病超声图像分类研究( GUI界面+数据集+训练代码)
深度学习·matlab·分类