• [技术干货] 11月技术干货合集
    Python、Git技术干货合集:1、Python中实现JSON数据读写的编程实战指南cid:link_02、Python在类中强制规定编码的高级开发指南cid:link_13、Python-pywin32库的使用高级操作方法cid:link_24、从Git历史中删除误提交文件并保留本地文件的解决方案cid:link_85、 Git撤回合并提交的多种方法cid:link_96、清理Git分支从查看到批量删除无效分支的全流程cid:link_37、Git推送代码遭遇403 Forbidden错误的原因和解决方法cid:link_48、 在Git中撤回最近的commit的多种方式小结cid:link_59、 Git用户名与邮箱的配置指南cid:link_610、 Git推送代码遭遇403 Forbidden错误的原因和解决方法cid:link_1011、 在Git中撤回最近的commit的多种方式小结cid:link_1112、Pandas DataFrame进行数据拼接方法详解cid:link_1213、 Python+FastAPI构建一个企业级AI Agent微服务的完整指南cid:link_1314、Python中获取13位和10位时间戳的方法cid:link_715、Python Playwright 语法知识详解(推荐)https://bbs.huaweicloud.com/forum/thread-0282197791923244005-1-1.html
  • [技术干货] Git用户名与邮箱的配置指南【转载】
    前言在使用 Git 进行版本控制时,每一次代码提交(commit)都会记录提交者的身份信息。这些信息不仅用于追踪代码变更历史,还在团队协作、代码审查和开源贡献中发挥着重要作用。Git 通过 用户名(user.name) 和 邮箱(user.email) 来标识开发者身份。正确配置这两项信息,是使用 Git 的第一步,也是确保提交记录清晰、可追溯的关键。一、为什么需要设置用户名和邮箱?Git 是一个分布式版本控制系统,它不依赖中央服务器来管理用户身份。因此,每个开发者必须在本地明确声明自己的身份。Git 会在每次执行 git commit 时,自动将 user.name 和 user.email 写入提交记录。如果没有正确设置,可能会导致:提交记录显示为 unknown 或默认系统用户名;无法与 GitHub/GitLab 等平台账号关联;团队协作中难以追溯代码来源;开源项目贡献不被认可。因此,首次安装 Git 后,首要任务就是配置用户名和邮箱。二、配置 Git 用户名和邮箱Git 提供了两种配置级别:全局配置 和 本地(仓库级)配置。1. 全局配置(推荐)全局配置适用于当前用户在本机上的所有 Git 仓库。这是最常用、最推荐的方式,尤其适合个人开发者或统一身份的场景。设置命令:12345# 设置用户名git config --global user.name "xiaoli" # 设置邮箱git config --global user.email "3339059430@qq.com"说明:--global 参数表示“全局配置”,配置信息将保存在用户主目录下的 .gitconfig 文件中(路径通常为 ~/.gitconfig)。用户名建议使用真实姓名或统一昵称,便于识别。邮箱建议使用你注册代码托管平台(如 GitHub、GitLab、Gitee)的邮箱,确保提交记录能正确关联到你的账号。2. 本地配置(按项目设置)如果你需要为某个特定项目使用不同的身份(例如:工作项目使用公司邮箱,个人项目使用个人邮箱),可以在该项目目录下进行本地配置。操作步骤:12345678# 进入目标 Git 仓库目录cd /path/to/your/project # 设置该项目的用户名(不加 --global)git config user.name "Work User" # 设置该项目的邮箱git config user.email "work@company.com"特点:该配置仅对当前仓库生效。配置信息保存在仓库目录下的 .git/config 文件中。本地配置优先级高于全局配置。三、查看当前配置配置完成后,建议验证设置是否生效。1. 查看所有配置1git config --list输出示例:1234user.name=xiaoliuser.email=3339059430@qq.comcore.editor=vim...2. 查看特定配置12345# 查看用户名git config user.name # 查看邮箱git config user.email如果输出为你设置的值(如 xiaoli 和 3339059430@qq.com),则说明配置成功。四、配置文件存储位置了解配置文件的存储位置有助于手动编辑或排查问题。配置类型配置文件路径说明系统级/etc/gitconfig所有用户共享,使用 --system 参数全局级~/.gitconfig 或 ~/.config/git/config当前用户所有仓库,使用 --global 参数本地级.git/config(在仓库根目录)当前仓库专用,使用无参数的 git config提示:你可以直接用文本编辑器打开这些文件进行查看或修改。五、最佳实践推荐做法首次安装 Git 后立即配置全局用户名和邮箱建议在安装 Git 后第一时间执行以下命令:12git config --global user.name "xiaoli"git config --global user.email "3339059430@qq.com"邮箱一致性使用你在 GitHub、GitLab、Gitee 等平台注册的邮箱,确保提交记录能正确显示在你的个人主页。使用统一身份除非有特殊需求(如工作/个人分离),否则建议全局配置一个统一的身份,避免混淆。定期检查配置尤其是在新设备或新环境上,使用 git config --list 确认身份信息正确。常见问题与避坑指南问题1:提交后发现邮箱写错了怎么办?可以使用 git commit --amend 修改最后一次提交的作者信息,或重新配置后后续提交会自动使用新信息。问题2:如何修改已配置的信息?直接重新执行 git config --global user.name "新名字" 即可覆盖原值。问题3:是否必须使用真实邮箱?不强制,但建议使用真实邮箱。GitHub 支持使用 隐私邮箱(如 id+github@users.noreply.github.com),既保护隐私又能关联账号。
  • [技术干货] 在Git中撤回最近的commit的多种方式小结【转载】
    1. 撤回 commit 但保留修改(保留工作目录文件)适用于:需要修改 commit 内容后重新提交1git reset --soft HEAD^效果:撤销最后一次 commit代码改动保留在暂存区(git status 显示已 add 状态)2. 撤回 commit 并放弃修改(彻底删除改动)适用于:放弃最后一次 commit 的所有修改(谨慎使用!)1git reset --hard HEAD^效果:撤销 commit代码改动完全消失(不可逆操作!)3. 撤回 commit 但保留修改在工作目录适用于:重新选择部分文件提交123git reset HEAD^# 或git reset --mixed HEAD^  # (默认选项)效果:撤销 commit代码改动保留在工作目录(git status 显示未 add 状态)4. 撤回多个 commit撤回最近 2 次 commit(保留修改):1git reset --soft HEAD~25. 已推送到远程仓库的撤回如果 commit 已推送到远程分支(如 origin/main),需要强制推送:12git reset --hard HEAD^    # 本地撤回git push --force origin 分支名  # 强制覆盖远程警告:强制推送会覆盖远程历史,确保团队其他成员知晓!替代方案:创建反向 commit(推荐用于公共分支)用新 commit 抵消旧 commit 的改动(不修改历史):1git revert HEAD效果:生成一个新 commit 来撤销上一次 commit 的改动安全适用于已推送的 commit总结场景选择:需求命令修改 commit 内容重新提交git reset --soft HEAD^完全放弃最后一次 commitgit reset --hard HEAD^保留改动并重新选择文件提交git reset HEAD^安全撤销已推送的 commitgit revert HEAD注意:所有 HEAD^ 可替换为具体 commit hash(如 a1b2c3d)以撤销更早提交。
  • [技术干货] Git推送代码遭遇403 Forbidden错误的原因和解决方法【转载】
    前言:一次典型的推送失败想象这样一个场景:你刚刚完成了一项功能开发,信心满满地执行 git add .、git commit -m "feat: implement user login",然后输入 git push origin main 准备将代码推送到远程仓库。然而,终端却返回了令人沮丧的错误信息:12remote: You are not allowed to push code to this project.fatal: unable to access 'http://git-server.example.com/group/project-name.git/': The requested URL returned error: 403这个 403 Forbidden 错误就像一道无形的墙,阻止了你的代码进入共享仓库。它究竟意味着什么?我们又该如何解决?本文将为你一一解答。一、什么是 403 Forbidden 错误?1.1 HTTP 状态码的含义403 Forbidden 是一个标准的 HTTP 状态码,表示服务器理解请求,但拒绝执行。与 401 Unauthorized(未授权,通常需要登录)不同,403 意味着“我知道你是谁,但我不会让你做这件事”。在 Git 的上下文中,当你尝试通过 HTTPS 或 SSH 向远程仓库推送代码时,Git 服务器(如 GitLab、Gitea、GitHub 等)会验证你的身份和权限。如果服务器确认你的账户存在,但不具备推送权限,就会返回 403 错误。1.2 常见触发场景你是一个新加入项目的成员,尚未被授予写入权限。项目设置了分支保护规则,禁止直接推送至主分支(如 main 或 master)。你使用的凭据(用户名/密码、访问令牌或 SSH 密钥)不正确或已失效。项目为只读模式,或你被明确从协作者列表中移除。二、问题诊断:为什么我无法推送?在寻求解决方案之前,我们必须先准确诊断问题根源。以下是几个关键的排查步骤:2.1 确认远程仓库地址首先,检查你当前配置的远程仓库地址是否正确:1git remote -v输出示例:12origin  http://git-server.example.com/group/project-name.git (fetch)origin  http://git-server.example.com/group/project-name.git (push)确保 URL 无误,特别是域名、端口号和项目路径。2.2 验证认证方式Git 支持多种认证方式,最常见的是 HTTPS 和 SSH。HTTPS 方式如果使用 HTTPS,Git 通常会提示你输入用户名和密码。在现代 Git 服务中,密码已被个人访问令牌(Personal Access Token, PAT)取代。你需要在 Git 服务器的用户设置中生成一个 PAT,并用它作为密码。可以使用 Git 凭据管理器(Credential Manager)来缓存凭据,避免重复输入。SSH 方式SSH 更安全且无需每次输入密码。你需要在本地生成 SSH 密钥对(ssh-keygen),并将公钥(.pub 文件内容)添加到 Git 服务器的账户设置中。测试 SSH 连接:1ssh -T git@git-server.example.com如果配置正确,服务器会返回欢迎信息。2.3 检查本地 Git 配置确保你的 Git 用户信息正确:12git config user.namegit config user.email这些信息应与你在 Git 服务器上的注册邮箱一致,以便正确关联提交记录。三、核心解决方案:如何获得推送权限?经过排查,如果你确认是权限不足导致的问题(这也是最常见的原因),那么唯一的解决途径就是申请权限。3.1 联系项目管理员识别负责人:找到项目的创建者、维护者或团队领导。他们通常拥有仓库的管理权限。提出权限申请:礼貌地说明你的需求,例如:“您好,我是新加入项目的开发人员 [你的姓名],我的 Git 账号是 [your-username]。目前我在尝试推送代码时遇到了 403 错误,能否请您将我在 project-name 项目中的权限提升至 Developer 级别?谢谢!”3.2 管理员操作指南(供参考)管理员可以在 Git 服务器后台进行如下操作(以 GitLab/Gitea 为例):进入项目页面 → Settings → Members。搜索你的用户名。选择角色为 Developer(允许推送代码)或更高。设置有效期(可选),然后点击 Add to project。一旦权限生效,你就可以正常执行 git push 了。四、替代方案:无权限时如何贡献代码?如果你暂时无法获得直接推送权限,仍然可以通过以下方式参与协作:4.1 Fork + Merge Request 流程这是开源项目和许多企业内部项目的标准协作模式。步骤如下:Fork 项目:在 Git 服务器上点击 “Fork” 按钮,将项目复制到你的个人空间。克隆你的 Fork:1git clone http://git-server.example.com/[your-username]/project-name.git开发并推送:在你的 Fork 中完成开发,此时你可以自由推送。发起 Merge Request (MR):在 Git 服务器上,从你的分支创建一个 MR,请求合并到原始仓库的指定分支。代码审查:管理员或其他开发者会审查你的代码,讨论修改,最终决定是否合并。这种方式不仅解决了权限问题,还引入了代码审查机制,有助于提高代码质量。五、Git 权限模型简介了解常见的权限级别有助于你更好地理解协作流程:角色权限说明Guest仅能查看项目、提交议题(Issue)Reporter在 Guest 基础上,可查看代码、下载、创建分支Developer可推送代码、创建 Merge Request、管理议题Maintainer完全控制代码库,可管理分支保护、合并 MR、管理成员Owner/Admin项目所有者,拥有最高权限通常,普通开发者需要 Developer 级别才能推送代码。六、预防措施为了避免未来再次遇到类似问题,建议遵循以下最佳实践:✅ 入职即申请权限:加入新项目后,第一时间确认并申请必要的 Git 权限。✅ 使用 Personal Access Token (PAT):避免使用账号密码,生成具有特定作用域的 PAT 更安全。✅ 配置 SSH Key:长期项目推荐使用 SSH,免密且安全。✅ 定期检查权限:项目结构调整后,及时确认自己的权限是否仍适用。✅ 遵守分支策略:遵循团队的 Git 工作流(如 Git Flow、GitHub Flow),避免直接推送至主干分支。
  • [技术干货] 清理Git分支从查看到批量删除无效分支的全流程【转载】
    一、查看本地分支首先查看当前仓库中有哪些本地分支:1git branch输出结果类似:123* main  feature/login  fix/typo* 表示当前所在分支。二、查看本地分支与远程分支的状态要想知道哪些本地分支仍对应远程、哪些已经失效,可以使用:1git branch -vv示例输出:123* main               8b2c34a [origin/main] Merge pull request #42 from dev  feature/login      12d5a90 [origin/feature/login: gone] Add login form  fix/typo           77ff0ab [origin/fix/typo] fix typo in readme说明:[origin/main]:表示该分支仍然对应远程分支。[origin/feature/login: gone]:表示远程分支已经被删除,本地分支仍保留。三、删除本地分支如果确认某个本地分支不再需要,可以手动删除:1git branch -d branch-name如果分支未被合并,Git 会阻止删除。若确定要强制删除,可使用:1git branch -D branch-name四、删除远程分支远程分支删除需要使用以下命令:123git push origin --delete branch-name# 等价git push origin :branch-name此命令会从远程仓库(如 GitHub、GitLab)中移除指定分支。五、清理已被远程删除的追踪引用有时远程分支被删除后,本地仍会显示对应的追踪引用(如 origin/feature/xxx),可以通过以下命令清理:1git fetch -p选项 -p 等价于 --prune,表示“修剪”掉所有在远程已不存在的引用。六、批量删除所有已被远程删除的本地分支想一键清理所有 [gone] 状态的分支?可以使用以下命令组合:1git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D🧩 命令拆解说明:命令片段作用git branch -vv显示分支及其远程状态grep ': gone]'筛选出远程已删除的分支awk '{print $1}'取出分支名称(第1列)xargs git branch -D将这些分支传给 git branch -D 批量删除执行后,所有远程已删除但本地仍存在的分支将被清理干净。七、总结操作命令查看本地分支git branch查看分支与远程状态git branch -vv删除本地分支git branch -d <name> / git branch -D <name>删除远程分支git push origin --delete <name>清理远程已删除引用git fetch -p批量清理“已失效”本地分支git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D小结建议建议定期执行 git fetch -p 保持远程状态同步。大型团队中,定期清理无效分支可显著减少混乱与误操作。若不确定分支是否需要,可先用 git branch -vv 检查再删除。
  • [技术干货] Git撤回合并提交的多种方法【转载】
    场景描述在开发过程中,我完成了以下操作:从 master 分支合并了另一个分支的代码。合并后发现存在问题,需要撤回合并。此时合并提交尚未推送到远程仓库。以下是当时的 git log 信息:123456789101112131415161718**commit e3fd459398f88c9d0188db0838becd859d8bbfa0 (HEAD -> master)**Merge: 541820a60 9fb8c4009Author:  李四 <lisi@china.com>Date:   Sun Apr 27 09:03:08 2025 +0800     Merge commit '9fb8c4009425f4269450de08665e5ebef2ad53bc' commit 541820a609fa4a9198e9bb25fb961c741237711c (origin/master, origin/HEAD)Author: 张三 <liuyl@china.com>Date:   Fri Apr 25 18:51:53 2025 +0800     feat:新增驾驶舱 commit 9fb8c4009425f4269450de08665e5ebef2ad53bcAuthor: 李四 <jiangfy@china.com>Date:   Thu Apr 24 16:24:01 2025 +0800     fix:修复bug目标是撤回合并提交 e3fd459398f88c9d0188db0838becd859d8bbfa0。解决方案方法 1:使用 git reset 撤回合并找到合并前的提交哈希值:从 git log 中可以看到,合并提交的上一个提交是 541820a609fa4a9198e9bb25fb961c741237711c。使用 git reset 回退到合并前的状态:1git reset --hard 541820a609fa4a9198e9bb25fb961c741237711c确认回退成功:1git log确保合并提交已被移除。方法 2:使用 git reflog 和 git reset 撤回合并如果不知道合并前的提交哈希值,可以使用 git reflog 查看操作记录:查看操作记录:1git reflog找到合并前的提交哈希值(例如 541820a609fa4a9198e9bb25fb961c741237711c)。使用 git reset 回退到合并前的状态:1git reset --hard 541820a609fa4a9198e9bb25fb961c741237711c方法 3:使用 git revert 撤销合并如果不想修改提交历史,可以使用 git revert 创建一个新的提交来撤销合并:找到合并提交的哈希值1git log使用 git revert 撤销合并:1git revert -m 1 e3fd459398f88c9d0188db0838becd859d8bbfa0确认撤销成功:1git log确保生成了一个新的撤销提交。注意事项未推送的合并:以上方法适用于尚未推送到远程仓库的合并。如果已经推送到远程仓库,撤回合并会修改历史记录,可能需要强制推送(git push --force),但这可能会影响其他开发者。备份当前分支:在撤回合并之前,可以创建一个备份分支以防万一:1git branch backup-branch总结撤回未推送的合并提交有多种方法:使用 git reset 完全撤回合并并修改历史记录。使用 git revert 保留合并记录并创建一个撤销提交。根据实际需求选择合适的方法即可。
  • [技术干货] 从Git历史中删除误提交文件并保留本地文件的解决方案【转载】
    场景在 Git 项目中,我们可能会不小心提交了本应忽略的文件(如 node_modules/、.env、*.log 等),导致仓库体积膨胀或敏感信息泄露。本文介绍如何从 Git 历史中彻底删除这些文件,同时保留本地文件。解决方案1. 确认误提交的文件12# 查看 Git 仓库中的文件(包括已忽略的)git ls-files如果发现误提交的文件(如 config.ini),可以进一步检查其 Git 历史:1git log -- config.ini2. 从 Git 中移除文件(但保留本地)使用 git rm --cached 命令:12345# 从 Git 索引中移除文件,但不删除本地文件git rm --cached config.ini # 如果误提交的是整个目录(如 node_modules/)git rm --cached -r node_modules/注意:-cached 确保本地文件不会被删除如果文件已在 .gitignore 中,仍需手动从 Git 中移除3. 更新 .gitignore(防止再次提交)12345# 确保 .gitignore 已包含该文件echo "config.ini" >> .gitignoreecho "node_modules/" >> .gitignore # 检查 .gitignore 是否生效git check-ignore -v config.ini4. 提交更改123git add .gitignoregit commit -m "Remove accidentally committed files"git push警告:此时文件仍存在于 Git 历史中,可能被他人拉取到本地!如需彻底清除,继续下一步。到这里基本就可以了,下方作为了解,酌情参考。进阶:彻底清理 Git 历史中的文件如果误提交的文件包含敏感信息(如密码、密钥),必须从 Git 历史中完全删除,可使用 git filter-repo(推荐)或 BFG Repo-Cleaner。方法 1:使用 git filter-repo(推荐)12345678# 安装 git-filter-repopip install git-filter-repo # 从所有提交历史中删除文件git filter-repo --path config.ini --invert-paths # 强制推送清理后的仓库(⚠️ 会重写历史)git push origin --force --all方法 2:使用 BFG Repo-Cleaner(适合大文件)123456789# 下载 BFGjava -jar bfg.jar --delete-files config.ini .git # 清理 Git 垃圾数据git reflog expire --expire=now --allgit gc --prune=now --aggressive # 强制推送git push --force最佳实践提交前检查变更:12git statusgit diff --cached使用预提交钩子(pre-commit):在 .git/hooks/pre-commit 中添加检查脚本,阻止提交忽略文件。敏感信息处理:如果误提交了密码,立即轮换密钥,即使已从 Git 中删除。总结操作类型命令示例适用场景从暂存区移除git rm --cached file简单清理,保留本地文件彻底删除历史记录git filter-repo --path file敏感信息泄露,需完全清除防止未来提交更新 .gitignore避免重复错误
  • [技术干货] Visual Studio中Git 提交缺少用户名的问题解决【转载】
    1. 设置全局 Git 用户信息(推荐)在 Visual Studio 的终端中运行以下命令:12git config --global user.name "您的用户名"git config --global user.email "您的邮箱@example.com"例如:12git config --global user.name "John Doe"git config --global user.email "john.doe@example.com"2. 设置项目特定的用户信息(可选)如果您想为特定项目使用不同的身份:123cd path/to/your/solidity/projectgit config user.name "项目专用用户名"git config user.email "project@example.com"3. 在 Visual Studio 中设置打开 Visual Studio转到 "Git" > "设置" > "Git 全局设置"填写用户名和邮箱地址:​​用户名​​:您的姓名或昵称​​邮箱​​:与 GitHub 账户关联的邮箱点击 "确定" 保存4. 验证配置在终端中运行:12345# 查看全局配置git config --global --list  # 查看当前项目配置git config --list应该显示:12user.name=您的用户名user.email=您的邮箱@example.com为什么需要设置用户信息?Git 要求每次提交都包含作者信息,因为:记录谁做了更改在 GitHub 上显示贡献者用于审计和追踪关联 GitHub 账户高级配置技巧1. 多账户管理如果您有多个 GitHub 账户,可以创建条件配置:编辑 ~/.gitconfig 文件:12345[includeIf "gitdir:~/work/"]  path = .gitconfig-work   [includeIf "gitdir:~/personal/"]  path = .gitconfig-personal创建 ~/.gitconfig-work:123[user]  name = 工作用户名  email = work@company.com创建 ~/.gitconfig-personal:123[user]  name = 个人用户名  email = personal@example.com2. 使用 GitHub 关联邮箱确保使用 GitHub 验证过的邮箱:登录 GitHub访问 Settings > Emails使用列出的邮箱之一3. 配置提交签名(高级)123456789# 生成 GPG 密钥gpg --full-generate-key  # 列出密钥gpg --list-secret-keys --keyid-format LONG  # 配置 Git 使用签名git config --global user.signingkey YOUR_KEY_IDgit config --global commit.gpgsign trueVisual Studio 特定设置1. 检查 Git 集成转到 "工具" > "选项" > "源代码管理" > "Git 全局设置"确保 "启用 Git 源代码管理提供程序" 已勾选2. 设置默认用户界面转到 "Git" > "设置" > "Git 存储库设置"在 "远程" 部分,确保已设置正确的远程 URL在 "用户信息" 部分填写用户名和邮箱3. 重置 Git 凭据打开 Windows 凭据管理器转到 "Windows 凭据"删除所有 git 相关的凭据下次操作时重新输入常见问题解决1. 配置未生效1234567# 检查配置优先级git config --show-origin --get user.namegit config --show-origin --get user.email  # 删除错误配置git config --global --unset user.namegit config --global --unset user.email2. 邮箱不匹配 GitHub 账户登录 GitHub访问 Settings > Emails添加您使用的邮箱验证邮箱3. Visual Studio 未识别配置关闭并重新打开 Visual Studio重启电脑更新 Visual Studio 到最新版本验证提交信息提交后检查:1git log -1应该显示:12Author: 您的用户名 <您的邮箱@example.com>Date: ...完整工作流程1234567891011121314graph TD    A[打开项目] --> B[进行代码修改]    B --> C[暂存更改]    C --> D[填写提交信息]    D --> E{用户信息配置}    E -- 已配置 --> F[成功提交]    E -- 未配置 --> G[设置用户信息]    G --> F    F --> H[推送到远程仓库]         subgraph 用户信息配置        G1[全局配置] --> G2[项目配置]        G2 --> G3[Visual Studio设置]    end最佳实践建议​​一致性​​:在所有设备上使用相同的用户名和邮箱​​隐私​​:使用 GitHub 提供的 noreply 邮箱访问 GitHub > Settings > Emails启用 "Keep my email address private"使用 ID+username@users.noreply.github.com 格式​​安全性​​:启用双因素认证保护 GitHub 账户​​备份​​:定期备份 Git 配置 (~/.gitconfig)
  • [技术干货] 在Git中撤回最近的commit的多种方式小结 【转载】
    在 Git 中撤回(撤销)最近的 commit 有多种方式,具体取决于你的需求。以下是常见场景和对应的命令:1. 撤回 commit 但保留修改(保留工作目录文件)适用于:需要修改 commit 内容后重新提交1git reset --soft HEAD^效果:撤销最后一次 commit代码改动保留在暂存区(git status 显示已 add 状态)2. 撤回 commit 并放弃修改(彻底删除改动)适用于:放弃最后一次 commit 的所有修改(谨慎使用!)1git reset --hard HEAD^效果:撤销 commit代码改动完全消失(不可逆操作!)3. 撤回 commit 但保留修改在工作目录适用于:重新选择部分文件提交123git reset HEAD^# 或git reset --mixed HEAD^  # (默认选项)效果:撤销 commit代码改动保留在工作目录(git status 显示未 add 状态)4. 撤回多个 commit撤回最近 2 次 commit(保留修改):1git reset --soft HEAD~25. 已推送到远程仓库的撤回如果 commit 已推送到远程分支(如 origin/main),需要强制推送:12git reset --hard HEAD^    # 本地撤回git push --force origin 分支名  # 强制覆盖远程警告:强制推送会覆盖远程历史,确保团队其他成员知晓!替代方案:创建反向 commit(推荐用于公共分支)用新 commit 抵消旧 commit 的改动(不修改历史):1git revert HEAD效果:生成一个新 commit 来撤销上一次 commit 的改动安全适用于已推送的 commit总结场景选择:需求命令修改 commit 内容重新提交git reset --soft HEAD^完全放弃最后一次 commitgit reset --hard HEAD^保留改动并重新选择文件提交git reset HEAD^安全撤销已推送的 commitgit revert HEAD注意:所有 HEAD^ 可替换为具体 commit hash(如 a1b2c3d)以撤销更早提交。
  • [技术干货] Git推送代码遭遇403 Forbidden错误的原因和解决方法 —转载
    一、什么是 403 Forbidden 错误?1.1 HTTP 状态码的含义403 Forbidden 是一个标准的 HTTP 状态码,表示服务器理解请求,但拒绝执行。与 401 Unauthorized(未授权,通常需要登录)不同,403 意味着“我知道你是谁,但我不会让你做这件事”。在 Git 的上下文中,当你尝试通过 HTTPS 或 SSH 向远程仓库推送代码时,Git 服务器(如 GitLab、Gitea、GitHub 等)会验证你的身份和权限。如果服务器确认你的账户存在,但不具备推送权限,就会返回 403 错误。1.2 常见触发场景你是一个新加入项目的成员,尚未被授予写入权限。项目设置了分支保护规则,禁止直接推送至主分支(如 main 或 master)。你使用的凭据(用户名/密码、访问令牌或 SSH 密钥)不正确或已失效。项目为只读模式,或你被明确从协作者列表中移除。二、问题诊断:为什么我无法推送?在寻求解决方案之前,我们必须先准确诊断问题根源。以下是几个关键的排查步骤:2.1 确认远程仓库地址首先,检查你当前配置的远程仓库地址是否正确:1git remote -v输出示例:12origin  http://git-server.example.com/group/project-name.git (fetch)origin  http://git-server.example.com/group/project-name.git (push)确保 URL 无误,特别是域名、端口号和项目路径。2.2 验证认证方式Git 支持多种认证方式,最常见的是 HTTPS 和 SSH。HTTPS 方式如果使用 HTTPS,Git 通常会提示你输入用户名和密码。在现代 Git 服务中,密码已被个人访问令牌(Personal Access Token, PAT)取代。你需要在 Git 服务器的用户设置中生成一个 PAT,并用它作为密码。可以使用 Git 凭据管理器(Credential Manager)来缓存凭据,避免重复输入。SSH 方式SSH 更安全且无需每次输入密码。你需要在本地生成 SSH 密钥对(ssh-keygen),并将公钥(.pub 文件内容)添加到 Git 服务器的账户设置中。测试 SSH 连接:1ssh -T git@git-server.example.com如果配置正确,服务器会返回欢迎信息。2.3 检查本地 Git 配置确保你的 Git 用户信息正确:12git config user.namegit config user.email这些信息应与你在 Git 服务器上的注册邮箱一致,以便正确关联提交记录。三、核心解决方案:如何获得推送权限?经过排查,如果你确认是权限不足导致的问题(这也是最常见的原因),那么唯一的解决途径就是申请权限。3.1 联系项目管理员识别负责人:找到项目的创建者、维护者或团队领导。他们通常拥有仓库的管理权限。提出权限申请:礼貌地说明你的需求,例如:“您好,我是新加入项目的开发人员 [你的姓名],我的 Git 账号是 [your-username]。目前我在尝试推送代码时遇到了 403 错误,能否请您将我在 project-name 项目中的权限提升至 Developer 级别?谢谢!”3.2 管理员操作指南(供参考)管理员可以在 Git 服务器后台进行如下操作(以 GitLab/Gitea 为例):进入项目页面 → Settings → Members。搜索你的用户名。选择角色为 Developer(允许推送代码)或更高。设置有效期(可选),然后点击 Add to project。一旦权限生效,你就可以正常执行 git push 了。四、替代方案:无权限时如何贡献代码?如果你暂时无法获得直接推送权限,仍然可以通过以下方式参与协作:4.1 Fork + Merge Request 流程这是开源项目和许多企业内部项目的标准协作模式。步骤如下:Fork 项目:在 Git 服务器上点击 “Fork” 按钮,将项目复制到你的个人空间。克隆你的 Fork:1git clone http://git-server.example.com/[your-username]/project-name.git开发并推送:在你的 Fork 中完成开发,此时你可以自由推送。发起 Merge Request (MR):在 Git 服务器上,从你的分支创建一个 MR,请求合并到原始仓库的指定分支。代码审查:管理员或其他开发者会审查你的代码,讨论修改,最终决定是否合并。这种方式不仅解决了权限问题,还引入了代码审查机制,有助于提高代码质量。五、Git 权限模型简介了解常见的权限级别有助于你更好地理解协作流程:角色权限说明Guest仅能查看项目、提交议题(Issue)Reporter在 Guest 基础上,可查看代码、下载、创建分支Developer可推送代码、创建 Merge Request、管理议题Maintainer完全控制代码库,可管理分支保护、合并 MR、管理成员Owner/Admin项目所有者,拥有最高权限通常,普通开发者需要 Developer 级别才能推送代码。六、预防措施为了避免未来再次遇到类似问题,建议遵循以下最佳实践:✅ 入职即申请权限:加入新项目后,第一时间确认并申请必要的 Git 权限。✅ 使用 Personal Access Token (PAT):避免使用账号密码,生成具有特定作用域的 PAT 更安全。✅ 配置 SSH Key:长期项目推荐使用 SSH,免密且安全。✅ 定期检查权限:项目结构调整后,及时确认自己的权限是否仍适用。✅ 遵守分支策略:遵循团队的 Git 工作流(如 Git Flow、GitHub Flow),避免直接推送至主干分支。
  • [技术干货] 【合集】9月技术干货汇总
    Python、GO、Git、 AJAX、TensorFlow、 Spring相关技术干货合集: 1;Git拉取代码的六种高效方式 【转载】cid:link_3 2; AJAX表单验证项目实战之实时用户名检查功能【转载】cid:link_4 3;TensorFlow 张量操作的实现【转载】cid:link_5 4; Python从Word文档中提取图片并生成PPT的操作代码【转载】cid:link_0 5; GO语言短变量声明的实现示例【转载】cid:link_6 6;GO语言中函数命名返回值的使用【转载】cid:link_7 7; Python实现固定列宽文本格式化终极指南【转载】cid:link_1 8; Python字典深度比较之如何高效寻找两个字典的相同点【转载】cid:link_8 9;Go语言结合GORM实现数据库事务处理的示例代码【转载】cid:link_9 10;PyTorch中数据加载器错误的报错与修复指南【转载】cid:link_2 11; python将word的doc另存为docx的实现方案【转载】cid:link_10 12;Git Commit生成与合入Patch指南分享【转载】cid:link_11 13; Spring通过拦截器实现多数据源切换的示例代码【转载】cid:link_12 
  • [技术干货] GIT 常用命令
    Git 是分布式版本控制系统,用于高效管理代码版本。以下是常用命令的分类总结,涵盖基础操作、分支管理、远程协作等核心场景:一、基础操作初始化仓库git init:初始化本地 Git 仓库(生成 .git 目录)。git clone <仓库URL>:克隆远程仓库到本地。检查状态git status:查看工作区状态(修改、暂存、未跟踪文件)。git log:查看提交历史(--oneline 简化显示,--graph 图形化分支)。添加文件到暂存区git add <文件>:添加指定文件。git add . 或 git add -A:添加所有修改(包括新建文件)。提交更改git commit -m "提交信息":提交暂存区更改到本地仓库。git commit --amend:修改上一次提交(如补充文件或修改信息)。忽略文件创建 .gitignore 文件,列出无需跟踪的文件或目录(如 *.log、node_modules/)。二、分支管理创建与切换分支git branch <分支名>:创建新分支。git checkout <分支名> 或 git switch <分支名>:切换分支。git checkout -b <分支名>:创建并切换到新分支。查看分支git branch:列出本地分支(* 表示当前分支)。git branch -a:列出所有分支(包括远程)。合并分支git merge <分支名>:将指定分支合并到当前分支(可能产生冲突)。git rebase <分支名>:变基合并(保持提交历史线性,需解决冲突)。删除分支git branch -d <分支名>:删除本地分支(需确保已合并)。git branch -D <分支名>:强制删除未合并的分支。git push origin --delete <分支名>:删除远程分支。三、远程仓库协作关联远程仓库git remote add origin <仓库URL>:关联远程仓库(通常命名为 origin)。推送代码git push -u origin <分支名>:首次推送本地分支到远程(-u 设置上游跟踪)。git push:推送已关联的分支到远程。拉取更新git fetch:下载远程分支更新(不自动合并)。git pull:拉取远程更新并合并到当前分支(等价于 git fetch + git merge)。查看远程信息git remote -v:显示远程仓库地址。git remote show origin:查看远程分支详情。四、冲突处理冲突场景当 git pull、git merge 或 git rebase 时,若同一文件被不同分支修改,会触发冲突。解决步骤Git 会在冲突文件中标记 <<<<<<< HEAD(当前分支)和 >>>>>>> 分支名(其他分支)的差异。手动编辑文件保留所需内容,删除冲突标记。执行 git add <文件> 标记冲突已解决。继续合并或变基操作(如 git rebase --continue)。五、撤销与回退撤销工作区修改git checkout -- <文件>:丢弃未暂存的修改(恢复为最近一次 git add 或 git commit 的状态)。撤销暂存区文件git reset HEAD <文件>:将文件从暂存区移出(保留工作区修改)。回退到历史版本git reset --hard <提交哈希>:彻底回退到指定提交(丢弃后续所有更改)。git revert <提交哈希>:生成反向提交撤销更改(保留历史记录,适合协作场景)。重置分支指针git reset --soft <提交哈希>:移动分支指针,保留工作区和暂存区更改。git reset --mixed <提交哈希>(默认):移动指针并清空暂存区,保留工作区更改。六、标签管理创建标签git tag <标签名>:创建轻量标签(指向提交的指针)。git tag -a <标签名> -m "标签信息":创建附注标签(推荐,包含更多信息)。查看标签git tag:列出所有标签。git show <标签名>:查看标签详情。推送标签git push origin <标签名>:推送单个标签。git push origin --tags:推送所有标签。七、高级命令存储临时修改git stash:将未提交的修改存入栈中(暂存工作区)。git stash pop:恢复并删除栈顶修改。git stash list:查看存储列表。查看提交差异git diff:查看工作区与暂存区的差异。git diff --cached:查看暂存区与最新提交的差异。git diff <分支1> <分支2>:比较两个分支的差异。子模块管理git submodule add <仓库URL> <路径>:添加子模块。git submodule update --init:初始化并更新子模块。八、常用配置设置用户名和邮箱git config --global user.name "Your Name"git config --global user.email "your@email.com"查看配置git config --list:显示所有配置。忽略文件权限变更git config core.fileMode false:避免因文件权限变化触发提交。九、工作流示例典型开发流程git clone <仓库URL> # 克隆项目 git checkout -b feature # 创建新分支 # 修改代码... git add . # 添加修改 git commit -m "feat: 新功能" # 提交 git push -u origin feature # 推送分支 # 发起 Pull Request(GitHub/GitLab)或合并请求 修复 Bug 流程git checkout main # 切换到主分支 git pull # 拉取最新代码 git checkout -b hotfix # 创建热修复分支 # 修复代码... git commit -m "fix: 修复问题" git push -u origin hotfix # 合并到 main 和开发分支 学习建议实践优先:通过实际项目熟悉命令,避免死记硬背。图形化工具辅助:如 GitKraken、Sourcetree 可视化操作。理解原理:掌握提交、分支、远程仓库的核心概念,而非单纯记忆命令。
  • [技术干货] Git Commit生成与合入Patch指南分享【转载】
    1. 生成 Patch 文件1.1 使用 Diff 命令生成 Patch通过 diff 命令,可以为两个目录生成差异补丁,这对于文件夹内文件的修改非常有用,可以生成一个包含所有修改操作的补丁文件。前提条件:需要对比的两个目录的顶层路径深度需一致。若不一致,建议使用软链接来满足此要求。示例:假设有两个目录:目录1:/media/data2/quectel/r12/cn_kj_r12a07/ql-ol-kernel/目录2:/tmp/sdk/cn_kj_r12a07/ql-ol-kernel/可以通过以下命令创建软链接并生成补丁:123mkdir patchln -s /media/data2/quectel/r12/cn_kj_r12a07/ql-ol-kernel/ patch/new ln -s /tmp/sdk/cn_kj_r12a07/ql-ol-kernel/ patch/old若只修改了部分目录(如 arch/arm/boot/dts/qcom,drivers,sound),则只需对比这些路径:1234cd patch diff -Naur old/arch/arm/boot/dts/qcom new/arch/arm/boot/dts/qcom > gpio-export.diffdiff -Naur old/drivers new/drivers >> gpio-export.diffdiff -Naur old/sound new/sound >> gpio-export.diff参数说明:-N: 将不存在的文件视为空文件。-a: 将所有文件视为文本文件处理。-u: 输出差异时附带差异前后三行的内容。-r: 递归比较所有子目录。注意:确保生成的补丁中,对比文件路径的顶层路径一致,以便合并时能正确找到对应文件。1.2 使用 Git Format-Patch 生成 Patch在 Git 中,可以使用 git format-patch 命令生成特定 commit 的补丁文件。步骤:确保已提交想要生成补丁的 commit。使用 git format-patch 命令生成补丁文件。示例:生成最新提交的补丁:1git format-patch -1 HEAD为特定 commit 生成补丁:1git format-patch -1 <commit-hash>为一系列 commits 生成补丁:1git format-patch <commit-hash1>..<commit-hash2>常用命令:123456$ git format-patch HEAD^ # 生成最近的1次commit的patch$ git format-patch HEAD^^ # 生成最近的2次commit的patch$ git format-patch HEAD^^^ # 生成最近的3次commit的patch$ git format-patch <r1>..<r2> # 生成两个commit间的修改的patch$ git format-patch -1 <r1> # 生成单个commit的patch$ git format-patch --root <r1> # 生成从根到r1提交的所有patch2. 合入 Patch 文件2.1 使用 Patch 命令合入将生成的 .diff 或 .patch 文件复制到目标目录,然后使用 patch 命令合入。示例:12cp gpio-export.diff /tmp/sdk/cn_kj_r12a07/ql-ol-kernel/patch -p1 < gpio-export.diff参数说明:-p1: 合入时忽略第一层目录。例如,.diff 文件中的 new/sound/soc/soc-jack.c 路径,查找时会忽略 new/ 前缀。-pn: 忽略 n 层目录。撤销补丁:1patch -p1 -RE < /media/data2/quectel/r12/patch/gpio-export.diff参数说明:-R: 还原修改,即撤销合入的补丁。-E: 删除合入补丁后的空文件。通过以上步骤,您可以轻松地生成并合入 Git commit 的 patch 文件,从而方便地进行代码的审查和合并。
  • [技术干货] Git拉取代码的六种高效方式 【转载】
    1. git pull:拉取并自动合并(最常用)作用:从当前分支跟踪的远程分支拉取最新提交,并尝试自动合并。适用场景:日常开发中快速更新本地分支。注意:可能会导致冲突,需手动解决。1git pull等价于:12git fetchgit merge origin/main示例:12git checkout maingit pull2. git pull --rebase:拉取并变基(避免多余合并提交)作用:将本地提交“移到”远程最新提交之后,保持提交历史线性。适用场景:多人协作开发时希望保持清晰的提交历史。优点:避免产生多余的合并提交。注意:如果本地有冲突,需逐个解决并继续变基。1git pull --rebase示例:12git checkout feature/logingit pull --rebase origin main3. git fetch + git merge:分步拉取与合并(更安全)作用:先拉取远程仓库内容,再手动决定是否合并。适用场景:需要查看远程更新后再决定是否合并。优点:更灵活、可控性强。12git fetchgit merge origin/main示例:12git fetch origingit merge origin/feature/login4. git fetch + git rebase:分步拉取与变基(推荐协作使用)作用:先拉取远程内容,再将本地提交变基到远程最新提交之上。适用场景:多人协作开发,希望保持提交历史整洁。优点:避免合并提交,提交历史更清晰。12git fetchgit rebase origin/main示例:12git fetch origingit rebase origin/feature/login5. git pull origin <branch>:指定远程分支拉取作用:从指定远程分支拉取代码。适用场景:本地分支未设置追踪关系或想拉取其他分支。1git pull origin dev示例:12git checkout devgit pull origin dev6. git pull --ff-only:仅允许快进合并(防止合并提交)作用:只有当本地没有新提交时才允许合并(快进),否则报错。适用场景:确保本地分支是远程分支的直接延续,避免复杂合并。1git pull --ff-only总结表格拉取方式是否自动合并是否保留提交历史是否可能冲突推荐使用场景git pull✅否✅日常开发快速更新git pull --rebase❌✅✅多人协作,保持提交历史线性git fetch + git merge✅否✅需要检查后再合并git fetch + git rebase❌✅✅协作开发,保持提交干净git pull origin <branch>✅否✅指定分支拉取git pull --ff-only❌✅❌确保无冲突,强制快进合并使用建议个人开发分支:推荐使用 git pull --rebase 或 git fetch + git rebase,保持提交历史整洁。多人协作主分支(如 main/dev):使用 git pull 或 git pull --ff-only,确保合并策略符合团队规范。不确定远程变化:优先使用 git fetch 查看差异后再决定如何处理。如需进一步了解 git rebase 和 merge 的区别,可参考 Git 分支管理相关文档。
  • [问题求助] 使用go get 拉取华为git仓库中的代码报401
    有人遇到过这个问题吗?今天之前还好好的,突然就这样了