ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PyCharm中Git拉取推送与冲突处理全攻略:从环境配置到团队协作

PyCharm中Git拉取推送与冲突处理全攻略:从环境配置到团队协作 每次带新人用 PyCharm 做开发我碰到最多的困惑不是 Python 语法也不是依赖装不上而是我这代码怎么发给你你改完我怎么拿过来。说白了就是 Git 的拉取和推送。这东西单独看每个教程都讲得头头是道但真到自己打开 PyCharm 操作时总会在某个角落卡住——要么不知道要先配 Git要么认证失败要么推送被拒要么干脆冲突一堆。这篇就把整个链路串起来讲透从环境准备到日常上传拉取再到冲突解决和常见报错按我实际带人走过来的顺序一步一步写清楚。适合刚接触 PyCharm 和 Git 的新手也适合已经能用但经常踩坑、想系统理一遍的同学。1. 别急着点按钮先把 Git 这层地基打稳1.1 为什么 PyCharm 里上传拉取离不开本地 Git很多人会有个错觉PyCharm 这么大个 IDE应该自带上传拉取功能吧确实PyCharm 的界面里到处是PullPushClone按钮但它的本质是调用你电脑上安装的 Git 程序来干活。PyCharm 只是个图形化前端真正的版本控制逻辑全在 Git 里。所以第一步不是打开 PyCharm而是先确认你的电脑上有 Git。我用一个生活化类比来解释Git 相当于银行系统你的代码提交记录相当于存款流水远程仓库GitHub、Gitee、GitLab 等相当于你开户的那家银行网点。PyCharm 只是银行大厅里的一个智能终端操作方便但背后跑的还是那套银行系统。智能终端再好看银行系统没开通也取不了钱。这个前提看起来简单实际工作中我却见过不少同事在环境没配好的状态下瞎点按钮。有次一个新人装完 PyCharm 就开始点 Git 菜单弹了一堆英文报错后跑来找我我一看他电脑里压根没装 Git。磨刀不误砍柴工这个地基必须先打。1.2 安装 Git 并让 PyCharm 自动找到它Git 的安装没什么花活直接去官网 git-scm.com 下载对应系统的安装包。Windows下载 exe 安装包后一路 Next但有几个选项要留意。安装向导里有一个 Adjusting your PATH environment 的选项一定选 Git from the command line and also from 3rd-party software这样 PyCharm 和其他程序才能在 PATH 里找到 Git。行尾转换那个选项建议保持默认的 Checkout Windows-style, commit Unix-style line endings等你将来遇到换行符问题再回头调。macOS可以用官方 pkg 安装包也可以用 Homebrew 执行brew install git。LinuxUbuntu/Debian 用sudo apt install gitFedora 用sudo dnf install git。装完后建议先开个终端验证一下输入git --version能看到版本号就说明装好了。如果提示找不到命令多半是 PATH 没配好Windows 下重启终端或重启 PyCharm 一般能解决。接下来打开 PyCharm按CtrlAltS进入设置macOS 是Cmd,在搜索框输入 Git进入Version Control - Git右侧会有一个 Path to Git executable 的输入框点旁边的 Test 按钮PyCharm 会自动检测并显示 Git 版本号。如果这里显示了版本号说明 PyCharm 已经能调用 Git 了。1.3 提交前必须明确身份信息否则会报错Git 的每次提交都会记录作者信息这个信息不是从你系统账号里取的必须你主动告诉它。很多人第一次在 PyCharm 里提交代码时弹出一句 Please tell me who you are就是因为没配这两项。在终端里执行两行命令git config --global user.name 你的姓名或昵称 git config --global user.email youexample.com注意这里的邮箱建议用常用的邮箱因为在很多代码托管平台上Git 提交记录会跟账号邮箱关联如果用临时邮箱或瞎编的邮箱提交头像和贡献图可能对不上。--global表示全局生效也就是说这台电脑上所有仓库都默认用这个身份。如果你在公司的电脑上同时维护私人项目和公司项目也可以不加--global进入具体仓库目录后再单独配置当前仓库的 user 信息。在 PyCharm 的File - Settings - Version Control - Git里其实也能看到一些相关设置但最直接可靠的方式还是命令行。2. 从零同步到远程仓库认证配置与克隆项目2.1 认证方式怎么选Token、SSH 还是第三方登录现在 GitHub、Gitee、GitLab 都不允许用账号密码直接推送代码了要么用访问令牌Token要么用 SSH 密钥要么用网页端的快捷登录。我推荐新手上手阶段直接用 HTTPS Token原因很简单配置成本最低一个窗口粘贴进去就能用不需要生成密钥文件、不需要抄一大段公钥内容。我把三种方式放在一起对比一下认证方式配置成本使用场景坑点HTTPS Token低生成 Token 后粘贴一次即可日常开发最常用适合大多数新手Token 会过期过期后要重新生成SSH 密钥中要生成公钥私钥并配置到平台长期稳定连接、服务器部署私钥文件丢了或换电脑要重新配置平台快捷登录最低网页授权一次JetBrains 系 IDE 自带的登录功能仅 IDE 内有效命令行不通用以 Gitee 为例生成 Token 的路径是右上角头像 - 设置 - 安全设置 - 私人令牌 - 生成新令牌。生成时把仓库相关的权限如projects、pull_requests勾上令牌只显示一次生成后立刻复制保存。很多人顺手关了页面才发现没复制只能重新生成这个坑我踩过不止一次。2.2 从远程仓库拉取项目Clone 的完整过程打开 PyCharm在欢迎界面点 Get from VCS或者点击左上角File - New - Project from Version Control。这一步在 PyCharm 新版本里已经统一成了一个入口有些旧教程写的路径可能对不上你只要记住从版本控制获取项目这个含义就行。在弹出的对话框里URL 一栏填入远程仓库的地址格式类似https://gitee.com/username/project.git。在 GitHub 上可以点仓库页面的绿色 Code 按钮复制 HTTPS 地址在 Gitee 上是复制 下载 附近的 HTTPS 地址。Directory 一栏选择代码要保存到的本地路径注意路径里尽量不要带中文和空格减少一些莫名其妙的小问题。点击 Clone 后PyCharm 会弹出询问是否信任项目的窗口。这个窗口是从 2021 版之后加的安全保护机制点击 Trust Project 即可。之后 PyCharm 会开始拉取代码拉完右下角会提示 Check out from version control completed。如果项目有依赖需要下载比如 requirements.txt还需要再配置解释器和 Git 操作无关这里不展开。2.3 克隆失败的几个高频原因克隆失败时先在状态栏看是不是有红色报错常见情况有两种。第一种是网络问题。如果提示 Could not resolve host 或 Failed to connect to github.com port 443: Timed out多半是访问国外的托管平台不稳定。解决办法是换源GitHub 上不去就改从镜像或公司内网的 GitLab 拉取或者直接申请一个国内平台的仓库比如 Gitee 的仓库然后把 GitHub 仓库导入过去这个功能 Gitee 是免费提供的。还有一种情况是公司网络配了代理需要在 PyCharm 的Settings - Appearance Behavior - System Settings - HTTP Proxy里选择 Manual proxy configuration填上公司给定的代理地址和端口。第二种是认证失败。提示 Authentication failed 或 Invalid username or password说明 Token 没配对。有些版本 PyCharm 在 Clone 阶段就要求输入用户名和令牌用户名通常填你的平台用户名密码处粘贴 Token而不是真的密码。另外如果你的仓库地址填错了、仓库不存在或者你的账号没有被邀请加入这个私有仓库也会有 remote: Repository not found 这种错误。先检查这几项再考虑重装重配的事。3. 日常上传拉取主链路更新、提交、推送3.1 先搞清楚 Pull 和 Fetch拉取到底拉的是什么到了日常开发环节很多人一听到拉取就直接点右上角的CtrlT更新按钮。这个按钮默认执行的是 Update Project它相当于先 Fetch把远程的提交记录下载到本地缓存再把远程的改动合并到你当前的分支上。这个组合动作在绝大多数情况下是没问题的但理解它拆开的过程会更有帮助。Fetch只把远程仓库的提交记录同步到本地但不会改动你工作区里的任何文件。它更像看了一眼对方改了什么看完了你的代码还是原样。Pull在 Fetch 的基础上把远程分支的改动合并到当前分支也就是看到对方改了什么并且把这些改动真正并到你本地。为什么要区分因为有时候你想先看看远程是否比你领先用了 Pull 就会立刻改动工作区如果本地有没提交的修改可能触发冲突或需要 stash暂时储藏改动。而先用 Fetch 看清状态再决定是 Pull 还是 Rebase主动权就在自己手里。在 PyCharm 里手动操作的话路径是Git - Fetch然后Git - Pull...。Pull 弹出的小窗口里可以选择合并策略新手保持默认即可。3.2 提交 Commit上传前必须做对的一步拉取的逆操作是推送但推送之前必须先有本地提交。很多新人对提交的理解是保存文件其实完全不是一回事。保存文件只是写入了本地磁盘Git 完全不知道你做一次 Commit才是把当前文件的快照记进了 Git 的提交历史里。PyCharm 里文件颜色会直观地告诉你 Git 状态红色文件是新增的还没有被 Git 跟踪绿色文件已经被加入暂存区Git 准备跟踪它蓝色文件是已跟踪的但内容有修改灰色文件被忽略或者被删除按下CtrlK会弹出 Commit 窗口左侧是变更文件列表右侧是代码差异预览。勾选你要提交的文件中间写一句 Commit Message提交说明然后点 Commit 按钮。Commit 旁边的小三角还有一个 Commit and Push... 选项意思是一提交完就立刻推送这个动作适合单人开发但团队协作时千万不要轻易用——你还没看别人代码、没做自测就直接推上去了容易给别人制造冲突。写 Commit Message 有一个原则让一个月后的自己看得懂。比如fix: 修复登录接口报错就比update好太多。团队协作中规范的提交信息也是代码审查的线索。3.3 推送 Push把本地提交发到远程分支提交只是写进了本地仓库同事在远程仓库看不到。要把代码共享出去得执行推送。快捷键CtrlShiftK会弹出 Push 对话框里面会列出你将推送到远程的提交记录点一下右下角的 Push 就完成了。第一次推送某个新分支时PyCharm 会提示 The current branch has no upstream branch。这个英文看着吓人翻译过来就是当前这个分支在远程还不存在你要给远程创建一个对应名字的分支。点 Set upstream 或 OK 即可这会在远程创建一个与你本地分支同名的分支并建立两者的跟踪关系。以后再推送PyCharm 就知道推到哪里去了。推送被拒绝是新手最常遇到的报错之一提示一般是 Updates were rejected because the remote contains work that you do not have locally。这个报错翻译成人话就是远程分支上有一些提交是你本地没有的Git 为了安全不让你直接覆盖要求你先把对方的改动拉下来。解决办法就是回到第 3.1 节的 Pull 操作把远程改动合并进来再重新推送。这也是很多人经常搞不懂的一句话为什么我改了代码推送要我先把对方的拉下来我又没动他那部分。 因为 Git 不知道你有没有动重叠区域它只能从提交历史来判断你们的提交历史分叉了不合并就推上去可能会相互覆盖。安全起见它宁可拒绝你。4. 多人协作的冲突现场代码合并不了的处理办法4.1 冲突是怎么产生的两个人都改了同一个地方有次我带着一个同事做一个小需求他负责改config.py我负责改utils.py按理说互不干扰。结果我在改config.py里的某个配置项时顺手调整了格式他也改了同几个位置于是 Push 前 Pull 时冲突就出现了。冲突的本质就是远程分支的某个文件内容和你本地要合并的内容在相同位置发生了变化Git 不知道该用哪一边的所以停下来要你做决定。类比一下就是你去银行柜台存钱系统里显示你账户上跟柜员嘴上说的余额不一样银行必须让你本人确认不能随便相信任何一方。Git 也是这个逻辑它宁可停下来也不自作主张。4.2 读懂冲突标记合并时看到的那些尖括号冲突发生时PyCharm 会弹出冲突文件列表双击文件打开后代码里会出现一段事故现场 HEAD 这是你本地当前分支的代码 这是远程分支拉下来的代码 origin/feature/login HEAD和中间的之间是当前分支你本地 HEAD 指向的那版的内容和 origin/feature/login之间是别人在远程分支上改的内容。我的习惯是把分隔线划分成三个栏目来看你本地改了什么、对方改了什么、两边其实都想表达什么。多数情况下冲突不是两边代码天差地别而是各改了一行、格式不同、或者是删增位置不一样。把两边内容读懂之后手动编辑保留合理的那部分删掉两个分隔线和山形标记保存文件就行。4.3 解决冲突的两种做法手改还是用合并工具如果冲突只有一个文件、一两处手动改最快。但文件多、冲突点多时手动改容易漏。这时候可以用 PyCharm 的合并工具冲突弹窗里点 Merge Revisions 或者双击冲突文件后选 Merge会打开一个三栏对比窗口最左栏是本地版本最右栏是远程版本中间栏是合并结果区左右两栏修改的片段会高亮你可以点击上下箭头逐个处理或者用中间的按钮Accept Left 是取左边的改动Accept Right 是取右边的改动都想要就手动把两边内容都复制到中间区。每处理完一个片段就少一个冲突提示。我建议的处理流程是先把左右两栏都通读一遍搞清楚两边分别改了什么再逐步往中间区合并。不要上来就点 Accept Left 或 Accept Right 图省事因为你可能把对方的改动直接丢掉这种人为制造的问题比冲突本身更难排查。4.4 冲突处理后不能忘的收尾动作文件合并完成、保存之后还有一个新手的常见误区直接 CtrlShiftK 推送。其实冲突解决后的内容还没有提交Git 处于合并进行中MERGING的状态。正确做法是先编译运行一下项目确认合并后的代码逻辑没问题至少看看有没有语法错误然后再CtrlK提交这次合并最后推送。如果合并到一半发现自己越改越乱想回到拉取前的干净状态可以在 PyCharm 的Git - Abort Merging里终止合并代码会回到冲突发生前的状态。注意这个操作会丢弃你已经开始合并的修改不是所有场景都能用但总比把代码越并越乱强。预防冲突最有效的方式是养成先拉后推的习惯。我个人的节奏是每次开始做任务前先更新一次代码让本地基于最新的远程版本做完功能准备推送前再更新一次发现冲突就在最小范围内解决掉。把冲突留在小步提交之间远比憋一个大改动最后一次性合并舒服。5. 分支、回滚与高频报错排查5.1 分支管理新需求和试验性代码的正确打开方式刚开始用 Git 的人往往只在主分支上干活这其实没什么问题项目很简单时不需要复杂的分支策略。但团队协作稍微正式一点分支就是必需品主分支保持稳定可发布新需求、线上 bug 修复各自开分支互不干扰。在 PyCharm 中点击右下角的 Git 分支名称比如main或master弹出的菜单里可以很直观地完成分支操作New Branch基于当前分支创建新分支并自动切换过去适合开始一个新功能时用。Checkout切换到已有分支相当于从当前分支跳到另一个分支去。Merge into Current把选中的分支合并到当前分支这是把别人分支的改动收过来或把自己开发分支改的东西合并回主分支的常用方式。Delete删除本地分支注意先确认这个分支的改动已经合并或备份好。分支合并到主分支后记得顺便把远程分支也清理一下。在远程分支上右键选择 Delete 可以删除远程分支避免远程仓库堆了一堆废弃分支影响别人认路。5.2 回滚代码Reset 和 Revert 的区别写代码没有后悔药但 Git 有。回滚方式有 Reset 和 Revert 两种初学者容易混它们的区别其实很清晰操作效果适用场景团队协作安全性Git Reset把分支指针移回某个历史提交抛弃后续提交本地提交后悔、还没推送时的清理如果已推送会改写历史协作时危险Git Revert生成一个反提交即提交一次与目标提交相反的改动已推送到远程、需要撤销某个提交的影响安全因为提交历史是新增的不会覆盖别人的提交在 PyCharm 里进到Git - Show History可以看到当前分支的提交历史。选中一个提交右键里的 Revert Commit 就是弹出 Revert 流程它会自动生成本地反提交提交推送到远程后目标提交的改动就被抵消了。而 Reset 在 PyCharm 里的入口是Git - Reset...会让你选择 soft / mixed / hard 三种模式soft只移动指针所有改动保留在暂存区mixed保留在工作区但不暂存hard丢弃所有改动慎用我对新手的建议是只要提交已经推送到远程一律用 Revert 不要 Reset。改历史的事情交给本地分支随便折腾一旦上了共享远程分支改写历史会破坏其他人的本地记录最容易引发团队事故。5.3 高频报错台集锦常见提示与处理思路把平时带人遇到的高频报错整理成一份对照表遇到问题时先按表排查报错或提示原因处理方法Please tell me who you are没有配置 Git 用户信息执行git config --global user.name和user.emailUpdates were rejected because the remote contains work that you do not have locally远程有领先提交本地推送无法快进先 Pull解决冲突后重新 PushThe requested URL returned error: 403Token 权限不足或仓库只读检查 Token 是否勾选仓库写入权限Authentication failed密码错误或 Token 过期重新生成 Token在凭据管理器里更新The current branch has no upstream branch本地分支没有对应的远程分支Push 时选设置上游分支fatal: not a git repository当前目录不是 Git 仓库确认项目是通过 Clone 打开的或者执行过git initCould not read from remote repository远程仓库地址不存在或没有权限检查克隆地址、账号是否被加入仓库成员LF will be replaced by CRLF换行符格式差异警告Windows 上保持 Git 默认设置多用.gitattributes统一团队换行符filename too longWindows 下 Git 默认限制长路径在管理员终端执行git config --global core.longpaths trueremote: Repository not found仓库不存在或私有仓库无权限确认地址、确认账号权限、检查仓库是否删除遇到不认识报错的第一反应很多人是直接复制到搜索引擎搜这没问题但最好先看一眼 PyCharm 底部的 Version Control 工具窗那里记录着完整的 Git 输出。这些输出里往往已经藏着关键线索比网上零星的帖子更准确。6. 对新人最实用的一套操作习惯6.1 什么时候先拉后推最稳有人把 Git 用得熟不一定是命令背得多而是建立了条件反射式的流程。我的习惯是这样开始一天工作前先把当前分支更新一下切到新分支前先把主分支更新一下功能做完准备推送前再更新一次当前分支。这三步一旦养成你遇到突然冲突的概率会小非常多。尤其是推送前的更新是成本最低的冲突预防手段。你本地改动不多时合并远程改动通常很快反过来等你攒了一个星期的改动才想起拉取那才叫灾难。对于个人小项目哪怕没有同事跟你抢代码我也建议每天推送一次。远程仓库是代码的异地备份电脑硬盘坏掉时老老实实的推送记录能救你一命。这个教训我是真真切切经历过的不是危言耸听。6.2 顺手把 Version Control 工具窗用好PyCharm 的 Git 功能大部分都能在底部或侧边的 Version Control 工具窗里看到。默认快捷键是Alt9Windows/Linux或Cmd9macOS里面有几个常用标签页Commit当前变更列表可以直接勾选文件并填写提交信息Log分支提交历史的可视化图谱双击任何一次提交都能看当时的代码快照Local Changes未提交的修改列表右键可以对比差异、回滚改动很多人习惯提交时只看弹出的小窗口但从信息丰富度来说工具窗的 Log 页才是真正帮你看清项目演进脉络的地方。建议有空时翻一翻体会一下提交历史怎么走对理解 Git 的工作方式会有质的帮助。6.3 团队协作时最好约法三章如果你管着一个小组或者参与团队项目下面几条约定足以让绝大多数协作痛苦消失分支命名统一功能分支用feature/简短描述修复分支用fix/简短描述一眼就能看出用途提交信息写清为什么说清楚改了什么以及为什么这样改比泛泛而谈的优化代码强得多推送前自测至少保证自己提交的代码能编译、不引入明显错误把问题留在自己手里而不是推上去再让大家一起尴尬不随意 rebase 已推送的分支对共享分支执行强制推送前先问自己一句有没有人正在基于这个分支干活这些约定不需要写进什么正式文档里团队群里发一遍日常互相提醒几次就能形成默契。6.4 如果只能记住一点用一个最小的练习把整个流程跑通在 GitHub 或 Gitee 上建一个空仓库在 PyCharm 里克隆下来随便加一个文件提交推送然后再从另一台电脑或网页端改一行回到 PyCharm 拉取更新。这个闭环跑个两三遍你日常 90% 的操作就有底了。剩下的分支、冲突、回滚都是在这个闭环上做变化理解了主干其他都是分支。
返回列表