
1. 为什么选择纯命令行操作GitHub在图形化界面大行其道的今天很多开发者可能会疑惑为什么还要学习命令行操作GitHub作为一个在Linux环境下工作多年的老码农我可以很负责任地告诉你命令行操作GitHub至少有三大不可替代的优势首先命令行操作效率极高。想象一下你正在通过SSH远程连接服务器进行开发或者在WSL环境下工作图形界面要么不存在要么响应缓慢。这时候几行简单的git命令就能完成代码提交、分支切换等操作而不用折腾远程桌面或者图形界面转发。其次命令行操作可脚本化。当你需要批量处理多个仓库或者将git操作集成到CI/CD流程中时命令行是唯一的选择。比如我经常用这样的脚本自动备份所有项目for repo in ~/projects/*; do cd $repo git push done最后命令行操作更稳定可靠。图形界面工具如GitHub Desktop可能会更新、崩溃或者出现兼容性问题而git命令行工具从2005年诞生至今保持着极高的向后兼容性。我十年前写的git脚本现在依然可以完美运行。2. Ubuntu 24.04.3 LTS环境准备2.1 安装Git核心工具链虽然Ubuntu预装了git但为了获得最新功能和安全性更新我建议通过官方PPA安装sudo add-apt-repository ppa:git-core/ppa -y sudo apt update sudo apt install git -y安装完成后运行以下命令检查版本24.04.3默认应该已经是较新版本git --version # 输出示例git version 2.40.1注意如果你在代理环境下可能需要先配置代理才能成功添加PPAsudo apt-get -o Acquire::http::proxyhttp://your.proxy:port update2.2 配置Git全局信息在开始使用Git前需要设置你的身份信息这些信息会出现在每次提交记录中git config --global user.name Your Name git config --global user.email your.emailexample.com我强烈建议同时设置默认分支名称避免旧版的master和行尾符处理git config --global init.defaultBranch main git config --global core.autocrlf input检查当前配置git config --list3. SSH密钥生成与管理3.1 生成ED25519密钥对相比传统的RSA算法ED25519更安全且性能更好。执行以下命令生成密钥ssh-keygen -t ed25519 -C your_emailexample.com当提示Enter file in which to save the key时直接回车使用默认路径~/.ssh/id_ed25519。然后设置一个强密码建议使用密码管理器生成。3.2 密钥文件权限管理正确的文件权限对SSH安全至关重要chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub3.3 将公钥添加到GitHub首先查看并复制公钥内容cat ~/.ssh/id_ed25519.pub然后登录GitHub点击右上角头像 → Settings左侧菜单选择SSH and GPG keys点击New SSH key标题可以写Ubuntu 24.04 Workstation粘贴公钥内容点击Add SSH key3.4 测试SSH连接运行以下命令测试连接ssh -T gitgithub.com如果看到Hi username! Youve successfully authenticated...的提示说明配置成功。如果遇到问题可以添加-v参数查看详细日志ssh -vT gitgithub.com4. Git仓库基础操作4.1 克隆现有仓库使用SSH协议克隆推荐git clone gitgithub.com:username/repository.git或者使用HTTPS适合临时访问git clone https://github.com/username/repository.git4.2 初始化新仓库创建一个新项目并初始化为Git仓库mkdir my-project cd my-project git init添加远程仓库先确保在GitHub上创建了空仓库git remote add origin gitgithub.com:username/repository.git4.3 典型工作流程创建或修改文件查看变更状态git status添加变更到暂存区git add . # 或者添加特定文件 git add file1.txt file2.js提交变更git commit -m 描述性的提交信息推送到远程git push -u origin main5. 高级配置与技巧5.1 提高SSH连接稳定性在~/.ssh/config中添加以下配置Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519 TCPKeepAlive yes ServerAliveInterval 605.2 Git别名提高效率添加一些实用别名到~/.gitconfig[alias] co checkout br branch ci commit st status last log -1 HEAD unstage reset HEAD -- lg log --color --graph --prettyformat:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset --abbrev-commit5.3 处理大文件如果需要管理大文件超过100MB建议安装git-lfssudo apt install git-lfs git lfs install然后跟踪大文件类型git lfs track *.psd git lfs track *.zip5.4 解决常见SSH问题如果遇到Too many authentication failures错误在~/.ssh/config中添加Host github.com IdentitiesOnly yes如果使用较旧的系统可能需要明确指定算法Host github.com HostkeyAlgorithms ssh-ed25519-cert-v01openssh.com,ssh-rsa-cert-v01openssh.com,ssh-ed25519,ssh-rsa6. 实战完整项目上传示例让我们通过一个实际例子演示完整流程。假设我们要创建一个Python项目并推送到GitHub。6.1 本地项目初始化mkdir python-demo cd python-demo echo # My Python Project README.md echo print(Hello World) main.py创建.gitignore文件排除不需要跟踪的文件cat .gitignore EOL __pycache__/ *.py[cod] *$py.class *.so .Python env/ venv/ EOL6.2 初始提交git init git add . git commit -m Initial commit with basic Python script6.3 创建远程仓库在GitHub上创建新仓库不要初始化README等文件然后添加远程git remote add origin gitgithub.com:username/python-demo.git6.4 推送代码git push -u origin main6.5 后续开发流程修改代码后查看变更git diff选择性暂存变更git add -p提交并推送git commit -m Implement new feature git push7. 疑难问题排查7.1 SSH连接超时如果ssh连接GitHub经常超时可以尝试测试网络连通性ping github.com使用HTTPS端口测试ssh -T -p 443 gitssh.github.com如果可行修改~/.ssh/configHost github.com Hostname ssh.github.com Port 4437.2 认证失败如果遇到认证问题检查密钥是否加载ssh-add -l如果没有列出密钥添加它ssh-add ~/.ssh/id_ed25519验证代理是否运行eval $(ssh-agent -s)7.3 文件权限问题Git有时会因文件权限变更而显示虚假修改忽略文件权限变更git config core.fileMode false或者明确设置项目权限find . -type d -exec chmod 755 {} \; find . -type f -exec chmod 644 {} \;8. 效率提升技巧8.1 交互式暂存使用交互式模式选择要暂存的变更git add -i或者更精细地选择git add -p8.2 修改最近提交如果刚提交完发现漏了文件或写错了信息git add forgotten_file.py git commit --amend8.3 暂存当前工作临时切换分支前保存当前工作git stash恢复暂存的工作git stash pop8.4 查看历史记录图形化查看分支历史git log --graph --oneline --all搜索历史提交git log -S search_term9. 安全最佳实践9.1 定期轮换SSH密钥建议每6-12个月更换一次SSH密钥生成新密钥对添加到GitHub测试新密钥从GitHub删除旧密钥更新本地所有仓库的remote urlgit remote set-url origin gitgithub.com:username/repo.git9.2 使用GPG签名提交安装GPGsudo apt install gnupg生成密钥gpg --full-generate-key配置Git使用GPGgit config --global user.signingkey key-id git config --global commit.gpgsign true9.3 双因素认证强烈建议在GitHub账户启用2FA进入Settings → Security启用Two-factor authentication使用TOTP应用如Google Authenticator或安全密钥10. 跨平台协作注意事项10.1 行尾符处理Windows和Unix系统使用不同的行尾符可能导致问题。统一配置git config --global core.autocrlf input10.2 文件名大小写Git默认不区分文件名大小写。如果需要区分git config core.ignorecase false10.3 共享配置团队可以共享.gitattributes文件统一配置* textauto *.sh text eollf *.bat text eolcrlf11. 扩展应用场景11.1 自动化部署结合GitHub Actions实现CI/CD在项目根目录创建.github/workflows目录添加YAML格式的工作流文件示例内容name: Python CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv4 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Run tests run: | python -m pytest11.2 多远程仓库一个本地仓库可以关联多个远程git remote add upstream gitgithub.com:original/repo.git定期同步fork的仓库git fetch upstream git merge upstream/main11.3 子模块管理添加子模块git submodule add gitgithub.com:other/repo.git lib/other初始化已有仓库的子模块git submodule update --init --recursive12. 性能优化12.1 仓库瘦身删除历史中的大文件git filter-branch --tree-filter rm -f large_file.zip HEAD或者使用BFG工具java -jar bfg.jar --delete-files large_file.zip repo.git12.2 浅克隆只需要最新代码时git clone --depth 1 gitgithub.com:user/repo.git12.3 稀疏检出只需要特定目录时git init repo cd repo git remote add origin gitgithub.com:user/repo.git git config core.sparsecheckout true echo some/dir/ .git/info/sparse-checkout git pull origin main13. 备份策略13.1 镜像备份创建完整的镜像仓库git clone --mirror gitgithub.com:user/repo.git cd repo.git git remote update13.2 多平台备份同时推送到多个远程git remote set-url --add --push origin gitgithub.com:user/repo.git git remote set-url --add --push origin gitbackup-server:repo.git13.3 打包快照创建完整的打包快照git bundle create repo.bundle --all可以从打包文件恢复git clone repo.bundle repo14. 终端美化与提示14.1 Git提示符在~/.bashrc中添加parse_git_branch() { git branch 2 /dev/null | sed -e /^[^*]/d -e s/* \(.*\)/(\1)/ } export PS1\u\h \[\033[32m\]\w \[\033[33m\]\$(parse_git_branch)\[\033[00m\]$ 14.2 彩色输出启用Git彩色输出git config --global color.ui auto14.3 交互式变基美化提交历史git rebase -i HEAD~515. 企业级扩展15.1 Git钩子在.git/hooks/中添加自定义脚本例如pre-commit#!/bin/sh # 检查TODO注释 if git diff --cached --name-only | xargs grep -n TODO; then echo 发现TODO注释 exit 1 fi15.2 多SSH配置为不同账户配置不同密钥Host github-work HostName github.com User git IdentityFile ~/.ssh/id_work IdentitiesOnly yes Host github-personal HostName github.com User git IdentityFile ~/.ssh/id_personal IdentitiesOnly yes使用时git clone gitgithub-work:company/repo.git15.3 审计与追溯查看文件修改历史git log -p -- path/to/file查找引入某行代码的提交git blame -L 10,15 path/to/file