两台电脑之间用Git同步代码:从SSH免密到推送拉取全指南

发布时间:2026/10/9 3:13:13
两台电脑之间用Git同步代码:从SSH免密到推送拉取全指南 先说说我为什么会对这个场景特别有感触。前阵子在家用台式机改了一个项目的小功能改完已经凌晨顺手commit完就睡了。第二天到公司打开笔记本准备继续一摸口袋——U盘没带想想网盘上传慢、微信传压缩包又容易解压出一堆乱码整个人直接愣在工位上。后来我在公司电脑上敲了两条命令代码就整整齐齐地出现在眼前。那一刻我才真正意识到Git不仅是团队协作的工具它本身就是一台电脑到另一台电脑之间最优雅的代码传送带。这篇文章就是围绕git使用场景-在两台不同的电脑进行代码互传这个具体的应用场景展开的。不管你是刚接触Git的小白还是用过一段时间但从来没在两台设备之间同步过代码这篇文章都能给你一套可以直接照做的方案从环境准备、SSH免密配置到第一次推送、拉取、分支合并再到我踩过的那些坑一次性讲透。1. 为什么我最终选择了Git中转而不是U盘和网盘在两台电脑之间挪代码大部分人第一反应是U盘、网盘或者聊天工具传文件。这几个方案看起来都行但真用到项目开发上各有各的难受。1.1 拷贝式方案的三个痛点先说U盘。表面上是拷过去就行实际上你很快会发现项目文件夹里混着编译产物、缓存、第三方依赖库拷过去动辄几个G更麻烦的是版本冲突——你在一台电脑上改了某个文件另一台电脑上的还是旧版本等你想合并两边的改动时连谁新谁旧都说不清。最终版、最终版2、真最终版这种文件名我相信大家都见过。再说网盘。同步是能同步但上传下载速度不稳定而且网盘本质上是文件同步逻辑不是版本管理逻辑。同步到另一台电脑后你无法知道这个文件上一次改动是什么时候、改了什么、为什么改。最尴尬的是网盘会把项目里那种几万个文件的node_modules目录也同步过去光是等索引就够你喝一壶的。聊天工具传压缩包就更不用说了你甚至无法确定对方或者另一台电脑上的自己收到的到底是哪一个压缩包版本。1.2 Git中转的核心逻辑远程仓库当作事实源用Git做代码互传本质上是换了一个思路不直接在两台电脑之间传文件而是让两台电脑都和一个远程仓库同步。这个远程仓库比如GitHub、GitLab或任何你自己搭建的Git服务器就是一个事实源两台电脑都只跟它对话。你在A电脑上改完代码push上去到B电脑上pull下来继续改改完再push回去。整个过程不需要任何物理介质历史记录清清楚楚每一行改动都能追溯。而且这个方案有个额外的好处远程仓库天然就是备份。哪怕你某台电脑硬盘坏了代码也不会丢。我后来在给团队做内部培训时经常说一句话Git就是你两小时前那台电脑上的自己给现在这台电脑上的自己发的一封带完整时间线的信。这句话虽然朴素但很多完全没接触过Git的同事听完就理解了。2. 环境准备Git安装和远程仓库创建一次做完不留尾巴工欲善其事必先利其器要把两台电脑的代码串起来得先在两台电脑上都把Git环境装好并且让它们能跟远程仓库正常通信。2.1 不同操作系统下的Git安装先说Windows。最省心的方式是去Git官网下载安装包一路默认安装即可。需要注意的只有一个点安装过程中会让你选默认编辑器如果你平时用VS Code就选Use Visual Studio Code as the default editor。另外安装完成后右键菜单里会出现Git Bash Here后续操作我建议统一在Git Bash里执行因为它模拟的是Linux终端环境命令提示符风格和macOS/Linux保持一致习惯不用来回切换。macOS可以走Homebrewbrew install gitLinuxUbuntu/Debian系走APTsudo apt update sudo apt install git -y装完之后不管哪个系统先验证一下git --version看到版本号输出就说明装好了。2.2 全局身份配置这一步别漏Git记录每次提交都会带上作者信息这个信息并不自动取自操作系统必须手动配置一次每台电脑都要配git config --global user.name 你的名字 git config --global user.email 你的邮箱这里的邮箱最好和你远程仓库平台的邮箱保持一致这样提交记录上显示的头像和用户名会正常关联。如果你在两台电脑上配置的姓名不一致将来翻历史时会出现同一个人显示成两个作者的情况虽然不影响功能但观感很乱。2.3 创建远程仓库README加不加的决定到代码托管平台GitHub、GitLab等都可以流程类似上新建一个仓库。有几个细节会影响后面操作的顺畅度仓库名建议和本地项目文件夹同名避免认知混乱。创建时是否初始化README我的建议是如果你是先有本地项目、再创建远程仓库不要勾选README、不要添加.gitignore、不要选License。因为一旦远程仓库里有了这些文件你第一次本地push时就会因为两边历史不一致而报错还得先处理冲突凭空多一道手续。如果远程仓库是空的你本地怎么推都顺。等仓库创建好你会看到两个远程仓库地址一个是HTTPS形式的https://github.com/用户名/仓库名.git一个是SSH形式的gitgithub.com:用户名/仓库名.git。这里就引入了下一步的关键问题到底用哪个地址我强烈建议用SSH下面详细说。3. SSH免密配置一次配好两行命令搞定认证热搜词里有一个高频问题叫ssh认证失败 git这个坑我当年也踩过。先说结论SSH免密配置成功后你从任意一台电脑git pull或git push时Git会自动用你本地的私钥完成身份验证不再需要输密码。这是两台电脑代码互传体验顺畅的核心前提。3.1 生成密钥对ed25519还是RSA在电脑的终端里执行ssh-keygen -t ed25519 -C 你的邮箱一路回车即可不建议额外设置口令否则每次用密钥还会让你输密码反而违背了免密初衷。默认会在~/.ssh目录下生成两个文件id_ed25519是私钥自己留着绝不外传id_ed25519.pub是公钥要放到远程仓库平台上去。如果你用的Git版本或者平台对ed25519支持不好可以用传统RSA算法ssh-keygen -t rsa -b 4096 -C 你的邮箱生成的文件名会变成id_rsa和id_rsa.pub后续操作完全一样。我个人优先推荐ed25519它更安全、速度也更快。3.2 把公钥放到远程仓库平台上利用命令查看公钥内容Windows的Git Bash同样支持这条命令cat ~/.ssh/id_ed25519.pub复制完整输出进入代码托管平台的个人设置页面找到SSH and GPG keys不同平台叫法略有差异新建一个SSH key标题随便起比如A电脑或者Work Laptop这样以后你能分清这个公钥对应的是哪台设备。把公钥粘贴进去保存即可。3.3 验证免密是否生效在终端执行ssh -T gitgithub.com第一次连接会提示确认主机指纹输入yes回车。如果看到类似Hi 用户名! Youve successfully authenticated说明SSH免密已经通了。3.4 ssh认证失败的完整排查链路如果这一步报错不要慌按下面顺序排查90%的问题都能定位公钥是不是完整复制了。ssh-ed25519 AAAA...这串非常长复制时漏掉末尾字符或者多了换行都会导致认证失败。检查方法再cat一次重新复制。确认你在远程平台上粘贴的是公钥而不是私钥。很多人会把两个文件搞混私钥出现在平台上是非常危险的平台也会拒绝。检查你用的仓库地址是不是SSH格式。如果你本地git remote里配的是HTTPS地址那么SSH免密配得再好也没用因为Git走的根本不是SSH通道它只会弹窗让你输账号密码。查看方式git remote -v如果显示https://github.com/...你需要改一下git remote set-url origin gitgithub.com:用户名/仓库名.git确认你当前操作的用户目录下有正确的密钥。仔细看ls ~/.ssh如果存在多个密钥文件且名称不是默认的id_ed25519或id_rsaGit默认不会自动识别。这类场景一般是开发者给不同平台生成过不同密钥此时可以手动指定ssh -i ~/.ssh/你的密钥名称 -T gitgithub.com如果这个能通你就需要在家目录下新建/修改~/.ssh/config文件给不同域名指定各自的密钥Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519网络层面排查。如果以上都没问题但SSH还是超时或连接被拒有可能是你所处的网络环境对22端口有限制。一个绕开办法是让SSH走HTTPS端口443GitHub等平台是支持这个方式的。在~/.ssh/config里加一行Host github.com HostName ssh.github.com Port 443或者退一步直接改用HTTPS地址配合系统自带的凭据管理器虽然每次首次连接会要求输入账号密码或Token但之后Windows凭据管理器或macOS钥匙串会帮你记住体验也不差。热搜词里git免密指向的具体操作核心就是上面这些。4. 从clone到push的双向闭环两台电脑的完整互传流程准备工作都做完下面进入正题。假设你有一台主力电脑A和一台便携电脑B用Git把代码在它们之间传起来只需要掌握下面几个动作。4.1 A电脑首次推送把本地项目交到远程仓库A电脑上如果已经是一个普通项目目录但还没有用Git管理依次执行cd 你的项目目录 git init git add . git commit -m initial commit这三步的含义分别是初始化仓库、把所有文件加入暂存区、生成第一个提交记录。注意git add .会把当前目录下所有文件都纳入版本管理所以建议提前准备一个.gitignore文件后面会细说把不需要跟踪的目录比如node_modules、build、dist排除掉。接着把本地仓库和远程仓库关联起来git remote add origin gitgithub.com:用户名/仓库名.git git push -u origin main-u的意思是设置上游分支等价于在本地main分支和远程origin/main分支之间建立默认关联。之后在A电脑上再执行git push就可以不用带参数了。如果你的默认分支叫master而不是main把上面命令里的main替换成master即可。现在新版本的Git很多时候已经默认初始化为main具体分支名可以执行git branch查看。4.2 B电脑首次拉取一条clone到达现场到了B电脑什么都不用想执行git clone gitgithub.com:用户名/仓库名.gitGit会在当前目录下创建一个和仓库同名文件夹里面就是A电脑推送的全部内容以及完整的提交历史。这一条命令同时完成了下载代码和初始化仓库两步是我在所有Git命令里觉得最爽的一条。如果你用的IDE是IDEA这类集成工具新建项目时也可以选择直接从一个Git仓库拉取对应热搜词里idea创建新项目拉取git的场景本质上是把clone这一步图形化了填的地址就是你仓库的SSH地址。4.3 日常修改回传B电脑改完A电脑怎么拿到这是使用频率最高的流程在B电脑上继续开发# 先看当前状态 git status # 把改动加入暂存区 git add . # 写清楚的提交说明 git commit -m fix: 修复登录页按钮样式 # 推送出去 git push然后回到A电脑只需要git pullA电脑上的代码就同步成B电脑刚推上去的版本了。整个闭环就是B改 - push - A pull - A改 - push - B pull无限循环。这里有三个非常重要的习惯我在带人时反复强调开工先pull。坐下一台电脑开始干活前先git pull确保自己拿到的是最新版本。不然你在一份旧代码上改了半天推上去才发现和别人改冲突了就很被动了。多敲git status。每次执行add或commit前都看一眼当前状态这个习惯能避免90%的我明明改了但好像没提交上去的困惑。提交信息写清楚。比如fix: xxx、feat: xxx一个月后你翻日志能立刻知道那台电脑上的改动意图。热搜词里专门提到git commit 提交注释和git commit --amend怎么使用说明很多人提交完才发现注释写错了。补救方法是用git commit --amend -m 新的注释来修改最后一次提交的说明这个命令只适合还没推送出去的提交如果已经push了再amend会导致两台电脑的提交历史不一致反而麻烦。4.4 一台电脑上git pull遇到本地未提交的修改怎么办你可能会碰到这种情况在B电脑上改到一半突然想起A电脑上有新提交需要拉下来看看。此时直接git pull会报错提示工作区不干净。处理思路有两种如果B电脑上这些改动已经用不上了直接放弃git checkout .如果还想保留先临时存起来git stash git pull git stash popstash就像临时寄存柜把工作区里的改动放进去等你拉取完新代码再取出来。5. 两台电脑互传时的分支管理和冲突处理我建议你从一开始就别偷懒只用一条main分支、在A和B之间来回push/pull确实能跑通但等代码量上来你会发现事情没那么简单。5.1 为什么两机互传场景下也要开分支很多人在自己一个人、两台电脑的场景下觉得开分支是多余的。但实际开发中临时改个bug和继续写未完成的功能这两件事经常混在一起。如果你所有改动都直接在main上提交A电脑写了一上午还没写完的半成品不小心push上去了到B电脑想拉取一个稳定版拿出去演示却发现拉下来的是个编译不过的半成品。正确的做法是给每个任务开一个分支git checkout -b feature/xxx在B电脑上想拿到A电脑某个分支的代码git pull git checkout feature/xxx本地会直接基于origin/feature/xxx创建一个追踪分支。热搜词里有一个很典型的提问我在master上写的代码怎样剪切到dev上。这个场景本质上就是分支合并# 先把master上的改动提交掉 git add . git commit -m 完成某功能 # 切换到dev分支 git checkout dev # 把master上的提交合并过来 git merge master分支的意义在于隔离不稳定的改动互传场景下半成品和可用版本并存时分支是唯一优雅的解。哪怕只有你自己在两台电脑上开发我仍然建议按功能开分支改完测试无误再合并回主分支。5.2 冲突是怎么出现的两个人同时改了同一行这里说的两个人可能是你和同事也可能是你昨天在A电脑上的自己、和今天在B电脑上的自己。冲突的本质很简单同一份文件的同一处地方被两个不同的提交改成了不同的内容。举个具体例子A电脑上你删掉了配置文件里的timeout 30改成timeout 60并push。而B电脑在你pull这个改动之前也把timeout 30改成了timeout 45并且直接commit。当B电脑执行git pull时Git发现没法自动判断到底听谁的于是停下来告诉你CONFLICT (content): Merge conflict in 某个文件。打开冲突文件你会看到类似这样的标记 HEAD timeout 45 timeout 60 origin/main HEAD下面是当前分支B电脑的内容 origin/main上面是远程分支A电脑的内容是分界线。解决冲突的正确姿势手动编辑文件把标记和不要的内容都删掉保留你想要的那一行。保存文件。执行git add 该文件告诉Git冲突已解决。执行git commit完成这次合并提交。如果是自己两台电脑之间出现冲突大概率是改完忘push就去另一台电脑接着改造成的。破局习惯是通过git log --oneline --graph先看清两边的提交历史再动手合并。5.3 merge还是rebase互传场景下我的选择把A电脑的分支代码合并到B电脑时有人会问用git merge还是git rebase。我的建议是刚接触Git时只用merge原因很简单——merge生成的历史是真实发生过的rebase会改写历史在两台电脑互传场景下极容易造成本地历史与远程历史不一致后再push被拒的混乱。等把Git玩熟了再按需学习rebase也来得及。热搜词里还有git pick和fetch有什么区别这类问题放在互传场景下git fetch只是把远程的最新状态下载到本地但还没动你的工作区git pull等同于fetch merge。6. 几个真实踩过的坑换行符、大文件、.gitignore失效最后分享几个在两机互传过程中很典型、但绝大多数教程不会写清楚的坑。这些坑我都实打实踩过写出来帮你省点时间。6.1 Windows和macOS/Linux混传时换行符把diff搞花如果A电脑是WindowsB电脑是macOS或者LinuxGit的自动换行符转换机制很可能让你见识一次什么都没改、但整个文件都是变动的诡异现象。根源是Windows文本文件行尾是CRLFUnix/Linux/macOS是LF。Git为了协作方便默认会在提交时把CRLF转成LF、检出时再转回CRLF取决于core.autocrlf配置。当两台电脑的配置不一致时你拉下来的文件和本地文件在换行符层面不一样git diff就会显示每一行都变了。我的做法是给仓库加一个.gitattributes文件统一行为* textauto *.js text eollf *.json text eollf这样无论在哪个系统上检出代码文件的换行符都被强制成LF避免了两端各改各的问题。这个文件一旦加上并提交所有平台都按规矩来互传体验会顺畅很多。6.2 大文件让push直接失败别硬扛热搜词里有一条git 无法提交大文件这问题我熟。之前往仓库里塞了一个300MB的二进制资源包结果git push跑到一半直接被平台拒绝。大多数代码托管平台对单文件大小有硬性限制GitHub超过100MB直接拒收更重要的是大文件一旦进入Git历史即便以后删了它依然在.git对象库里占着空间clone会痛苦到爆炸。在互传场景下如果想同时传输大资源文件我的建议是代码走Git大文件走网盘或者NAS并在.gitignore里把这些目录排除掉。另外开发中常见的临时生成物、编译输出、日志文件也全部不进Git。6.3 .gitignore不生效的真正原因说到.gitignore很多人会遇到明明加进去了文件还是出现在git status里的情况。准则是如果这个文件已经被Git跟踪过那么.gitignore对它无效。Git的规则只对尚未被跟踪的文件生效。解决办法是把它从跟踪列表里移除但保留本地文件git rm --cached 文件名比如日志目录git rm -r --cached logs/然后提交这个变更再重新把.gitignore加上规则后面就不会再跟踪这些文件了。这个命令不会删除你本地的文件只是告诉Git我不再管理它可以放心用。6.4 两机互传的常用命令速查最后给一张我自己的命令速查表贴在工位旁边那种动作命令下载代码到新电脑git clone SSH地址查看当前状态git status查看变更内容git diff提交全部改动git add .提交并写注释git commit -m 说明推送到远程git push拉取远程更新git pull临时寄存改动git stash/git stash pop新建并切换分支git checkout -b 分支名合并分支到当前git merge 分支名查看提交历史git log --oneline --graph修改上一次提交注释git commit --amend -m 新注释修改远程仓库地址git remote set-url origin 新地址6.5 如果你总是忘push有一个小技巧我自己在长时间多任务切换时也经常遇到以为push过结果没push的尴尬。后来我养成了一个习惯在A电脑准备合上盖子走人之前强制执行一次git status如果工作区不干净就立刻git commit并git push在B电脑打开盖开始干活之前先执行git pull。这两条不是技术问题是纪律问题。多台电脑互传代码最大的不确定因素从来不是Git本身而是哪台电脑上的代码是最新的这个记忆问题。把走之前push、来之后pull变成肌肉记忆比你用再复杂的工具都管用。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询