介绍从原理入手快速上手Git。工作流程Git是一个版本控制工具用于文件备份、恢复。它可以在本地备份也可以在远程备份也就是说Git支持一个项目文件有多个不同版本的备份不同的版本之间互不影响地进行修改然后多个版本之间可以自由地进行合并所以对开发人员来说GIT是一款分布式的、可以用于多人并行开发、跟踪开发过程的必备工具。Git 的设计哲学获取 - 修改 - 存档 -分享。Git通过这些概念来实现版本管理工作区Working Directory你写代码的地方。暂存区Staging Area你整理代码的地方防止把垃圾代码也提交了。版本库Repository代码保险柜。整个“获取、修改、存档、分享”工作流程如下1第一阶段获取代码从云端到本地在你开始工作之前你需要一份代码副本。git clone如果你是第一次加入项目你会把整个远程仓库包含所有历史记录完整地下载到你的电脑。git pull如果你已经有项目了你会拉取远程仓库的最新改动合并到你的“未修改”状态中确保你的开发基础是最新的。2第二阶段工作区开发代码的诞生与变化这是你最常待的地方即你的编辑器VS Code, IntelliJ 等。未修改 (Unmodified)代码刚从仓库取出干净整洁。修改 (Modified)你动了代码。此时 Git 会检测到文件变化但这些变化仅存在于你的磁盘上非常脆弱一旦断电或误删就找不回来了。3第三阶段暂存与提交本地存档这是 Git 的精髓通过两步走确保提交质量。已暂存 (Staged)通过 git add你把改动放进“暂存区”。这就像是在照相前安排站位你可以选择只提交一部分修改而不是全部。已提交 (Committed)通过 git commit改动被正式打上快照存入你本地的“版本库”。此时代码依然只在你的电脑里你的同事看不见它们。4第四阶段远程同步团队共享已推送 (Pushed)执行 git push。这时你本地的一系列 Commit 记录会被上传到远程仓库GitHub/GitLab。只有到了这一步你的工作才算真正“同步”给了团队代码也才有了云端备份。5闭环路径撤销与回滚git checkout / restore如果你在修改过程中发现写乱了或者想看看之前的某个版本你可以通过这个命令从“版本库”中拉取旧代码覆盖掉当前的“工作区”。这给了你“吃后悔药”的机会。可以把 git checkout 想象成代码仓库里的“传送门”或“时光机”让你在不同的代码状态分支、提交、文件版本之间来回穿梭。什么是分支呢分支分支Branch是指把某个版本作为参考点 创建的开发版本路径。本地分支你正在写的代码。远程分支团队共享的代码在云端。远程跟踪分支你本地电脑里存的一份“云端代码快照”它告诉你“上次我联网查看时云端代码是长这样的”。A. 本地分支 (Local Branch)定义完全存在于你本地电脑上的分支。位置.git/refs/heads/ 目录下。特点你在上面写代码、提交 (commit)。它是你的私人工作空间除非你执行 push否则别人看不见。示例main, dev, feature-login。B. 远程分支 (Remote Branch)定义存在于远程服务器如 GitHub、GitLab上的分支。位置服务器的磁盘上。特点它是团队协作的“最终真相”。你不能直接在上面修改代码必须通过推送 (push) 或合并请求 (PR/MR) 来更新它。示例远程仓库里的 main 分支。C. 远程跟踪分支 (Remote-tracking Branch)定义它是远程分支在你本地仓库中的“只读镜像”。位置.git/refs/remotes/ 目录下。命名习惯通常是 remote/branch如 origin/main。特点它位于你的本地但你不能直接移动它不能在上面 commit。当你执行 git fetch 或 git pull 时Git 会自动更新这个分支以反映远程仓库的最新的状态。它是连接本地和远程的“中转站”。分支相关的操作1使用git branch创建新分支git branch new_branch2使用git checkout可以切换分支git checkout new_branch3融合某个分支到当前活动分支git checkout master git merge new_branch //将new_branch合并到当前活动的master分支回头总结一下git checkout 的功能主要可以分为以下三大类A. 分支切换 (Switching Branches)这是最常用的场景。当你工作在 feature 分支想去 main 分支看看时git checkout main作用 更新你的工作目录使其与目标分支的快照保持一致并将 HEAD 指针指向该分支。B. 创建并切换新分支如果你想开启一个新任务通常需要先建分支再切过去。这个组合动作可以一步到位git checkout -b new-feature等同于 先运行 git branch new-feature 再运行 git checkout new-feature。C. 撤销/恢复文件 (Restoring Files)如果你不小心改乱了一个文件想把它还原到最近一次提交时的样子git checkout -- index.html注意 这里的 -- 是为了防止文件名和分支名重名。这个操作会抹掉你在该文件上未提交的所有修改且不可撤销使用时请务必小心。解决冲突如果将代码git push推送到远程仓库发现远程仓库和原来的快照不同时就会发生冲突。需要我们手动解决该代码冲突。·在 Git 的世界里解决冲突本质上是将两个平行发展的版本你的小圆和同事的小圆强行合并为一个共识最终的大圆的过程1冲突的触发推送失败当你完成本地开发本地小圆并尝试 git push 时如果远程服务器发现已经有人在你之前提交了代码远程小圆Git 会立即拦截你的请求。报错信息通常会提示 [rejected] (non-fast-forward)。现状你的本地分支、远程跟踪分支和远程分支此时指向了不同的提交点历史出现了分叉。2同步情报执行 git pull为了解决分叉你必须先把“对手”的情报拿下来。动作执行 git pull或者先 fetch 再 merge。底层变化Git 会更新你的远程跟踪分支如 origin/main让它指向远程那个小圆并尝试将其合并到你的本地分支中。3 陷入僵局冲突检测如果 Git 发现你们两人改动了同一个文件的同一行它会停止自动合并。状态此时你的本地分支处于“Merging”中间态。文件表现冲突的文件会被 Git 强行注入“冲突标记” HEAD 你的代码本地小圆的内容 同事的代码远程小圆的内容 origin/main4人工手动解决这是唯一需要你大脑介入的时刻。你需要打开编辑器决定这些冲突行的去留选择 A保留你的修改删除同事的。选择 B舍弃你的修改采用同事的。选择 C将两者的逻辑结合写出一段全新的代码。清理删除所有的 , , 标记。5达成共识生成“大圆”解决完代码矛盾后你需要告诉 Git 这一阶段的战斗结束了。暂存执行 git add 文件名这代表你已经完成了该文件的“调解”。提交执行 git commit。结果Git 此时会生成一个合并提交Merge Commit。这就是你要求的那个大圆。大圆的特殊性普通小圆只有一个“父亲”而大圆有两个“父亲”它同时指向了之前的本地小圆和远程小圆象征着两者的融合。6重新推送现在你的本地分支已经站在了“大圆”的高度而大圆的历史里已经包含了远程那个小圆。动作执行 git push。结局远程服务器检查发现你的提交历史已经完整包含了它的历史于是愉快地接受。此时远程分支也更新到了那个大圆的位置。解决冲突不是“覆盖”而是“整合”。小圆代表独立性。大圆代表一致性。整个解决的过程就是发现分叉 - 拉取对手 - 手动调解 - 铸造共识大圆 - 同步云端。多分支在 Git 的世界里分支就像是“平行宇宙”。你可以让多个宇宙永远并行运行也可以在某个时点选择让它们交汇合并。Git 允许甚至鼓励多个分支长期共存。以下是几种常见的不合并场景实验性分支 (Experimental Branches)你有个疯狂的想法开个分支去试。试完发现行不通或者代码写得太烂了。你完全可以把这个分支搁置在那里或者直接删除永远不合并进主线。环境分支 (Environment Branches)在很多公司里develop开发、test测试和 production生产是三个独立的分支。它们长期共存分别对应不同的服务器环境。版本维护分支 (Maintenance Branches)如果你在开发软件的 2.0 版本但还需要为 1.0 版本的用户提供安全补丁。你会保留一个 v1.x 的分支只在上面修 Bug而不会把它合并到 2.0 的主线里。虽然不强制合并但分支的存在通常遵循以下逻辑分支类型命运描述功能分支 (Feature)最终合并开发完一个新功能如登录页面测试没问题后必须合并否则用户用不到。发布分支 (Release)最终合并准备发布前的最后修整完成后通常会合并回main和develop。环境分支 (Long-lived)永久共存只要项目还在运行main和test分支就会一直存在。废弃/归档分支永不合并开发失败或已过时的尝试。当我们push推送时其实只是推送了当前所在的工作分支。而pull会把远程仓库里所有分支的新动态都下载。需要认识到两者的区别1推送 (Push)默认只送“当前”当你执行 git push 而不带任何参数时行为Git 只会将你当前所在的分支推送到它关联的远程分支。例外除非你显式运行 git push --all否则你本地的其他分支比如你偷偷开的 experiment 分支是不会被送到服务器上的。注意如果当前分支没有设置“上游upstream”Git 会报错并提醒你使用 git push --set-upstream origin branch。2拉取 (Pull)看似只拉当前实则“暗度陈仓”git pull 实际上是两个命令的组合git fetch git merge。第一步 fetch全量更新当你输入 pull 时Git 其实会把远程仓库里所有分支的新动态都下载到本地的“远程跟踪分支”里比如更新所有的 origin/*。第二步 merge定向合并Git 只会将你当前分支对应的那个远程分支合并进来。结论你的其他本地分支虽然知道了远程有更新通过 fetch 拿到了数据但它们的文件内容并不会变直到你切换过去手动执行 merge。下面是一个多分支工作的示例下载安装a) 下载本地电脑平台对应版本需要科学上网Git - DownloadsLinux使用命令:apt-get install gitb) 以管理员身份运行 Git 安装程序除了添加右键菜单要勾选其他默认即可。c) 到git官网注册账号d) 本地电脑任意一个文件夹右键打开git bash配置用户名、邮箱、密码配置用户名 git config --global user.name 我的名字 配置邮箱 git config --global user.email 我的邮箱 配置密码 git config --global user.password 我的密码实战练习1从远程仓库拉取代码如果是第一次下载项目在任意一个文件夹下从远程下载项目git clone 项目地址如果是本地已经有项目在项目文件夹打开git命令行从远程拉取更新项目将远程仓库中的更改合并到当前分支中 git pull2本地修改代码后在项目文件夹打开git命令行进行本地暂存、提交先将修改的文件放入暂存区 git add ./ 将暂存区的修改记录本地提交 git commit -m 本次提交的注释3将项目推送到远程git push4如果与绑定的远程跟踪分支进行合并时有冲突git会提示解决冲突后才可以提交。5拉取远程代码git pull6git会把有区别的文件进行合并同时保留所有冲突的代码需要我们修改代码。7再次add和commit进行本地提交再次push推送。git add ./ git commit -m 合并后的注释 git push8完成。私有仓库1. 创建私密仓库登录到GitHub账户在右上角点击加号 () 图标然后选择 New repository。在仓库名称旁边确保选择了 Private私密选项。填写其他必要的详细信息如描述、是否初始化README文件等。点击 Create repository 完成创建。2. 邀请成员一旦你创建了私密仓库你可以邀请其他人成为协作者在你的仓库页面点击 Settings设置。在左侧菜单中选择 Collaborators成员。点击 Add People邀请协作者。输入你想要邀请的成员的GitHub用户名。选择成员的权限级别例如可以设置为 Read、Write 或 Admin。点击 Add to repository添加协作者到仓库按钮。
Git快速上手教程
介绍从原理入手快速上手Git。工作流程Git是一个版本控制工具用于文件备份、恢复。它可以在本地备份也可以在远程备份也就是说Git支持一个项目文件有多个不同版本的备份不同的版本之间互不影响地进行修改然后多个版本之间可以自由地进行合并所以对开发人员来说GIT是一款分布式的、可以用于多人并行开发、跟踪开发过程的必备工具。Git 的设计哲学获取 - 修改 - 存档 -分享。Git通过这些概念来实现版本管理工作区Working Directory你写代码的地方。暂存区Staging Area你整理代码的地方防止把垃圾代码也提交了。版本库Repository代码保险柜。整个“获取、修改、存档、分享”工作流程如下1第一阶段获取代码从云端到本地在你开始工作之前你需要一份代码副本。git clone如果你是第一次加入项目你会把整个远程仓库包含所有历史记录完整地下载到你的电脑。git pull如果你已经有项目了你会拉取远程仓库的最新改动合并到你的“未修改”状态中确保你的开发基础是最新的。2第二阶段工作区开发代码的诞生与变化这是你最常待的地方即你的编辑器VS Code, IntelliJ 等。未修改 (Unmodified)代码刚从仓库取出干净整洁。修改 (Modified)你动了代码。此时 Git 会检测到文件变化但这些变化仅存在于你的磁盘上非常脆弱一旦断电或误删就找不回来了。3第三阶段暂存与提交本地存档这是 Git 的精髓通过两步走确保提交质量。已暂存 (Staged)通过 git add你把改动放进“暂存区”。这就像是在照相前安排站位你可以选择只提交一部分修改而不是全部。已提交 (Committed)通过 git commit改动被正式打上快照存入你本地的“版本库”。此时代码依然只在你的电脑里你的同事看不见它们。4第四阶段远程同步团队共享已推送 (Pushed)执行 git push。这时你本地的一系列 Commit 记录会被上传到远程仓库GitHub/GitLab。只有到了这一步你的工作才算真正“同步”给了团队代码也才有了云端备份。5闭环路径撤销与回滚git checkout / restore如果你在修改过程中发现写乱了或者想看看之前的某个版本你可以通过这个命令从“版本库”中拉取旧代码覆盖掉当前的“工作区”。这给了你“吃后悔药”的机会。可以把 git checkout 想象成代码仓库里的“传送门”或“时光机”让你在不同的代码状态分支、提交、文件版本之间来回穿梭。什么是分支呢分支分支Branch是指把某个版本作为参考点 创建的开发版本路径。本地分支你正在写的代码。远程分支团队共享的代码在云端。远程跟踪分支你本地电脑里存的一份“云端代码快照”它告诉你“上次我联网查看时云端代码是长这样的”。A. 本地分支 (Local Branch)定义完全存在于你本地电脑上的分支。位置.git/refs/heads/ 目录下。特点你在上面写代码、提交 (commit)。它是你的私人工作空间除非你执行 push否则别人看不见。示例main, dev, feature-login。B. 远程分支 (Remote Branch)定义存在于远程服务器如 GitHub、GitLab上的分支。位置服务器的磁盘上。特点它是团队协作的“最终真相”。你不能直接在上面修改代码必须通过推送 (push) 或合并请求 (PR/MR) 来更新它。示例远程仓库里的 main 分支。C. 远程跟踪分支 (Remote-tracking Branch)定义它是远程分支在你本地仓库中的“只读镜像”。位置.git/refs/remotes/ 目录下。命名习惯通常是 remote/branch如 origin/main。特点它位于你的本地但你不能直接移动它不能在上面 commit。当你执行 git fetch 或 git pull 时Git 会自动更新这个分支以反映远程仓库的最新的状态。它是连接本地和远程的“中转站”。分支相关的操作1使用git branch创建新分支git branch new_branch2使用git checkout可以切换分支git checkout new_branch3融合某个分支到当前活动分支git checkout master git merge new_branch //将new_branch合并到当前活动的master分支回头总结一下git checkout 的功能主要可以分为以下三大类A. 分支切换 (Switching Branches)这是最常用的场景。当你工作在 feature 分支想去 main 分支看看时git checkout main作用 更新你的工作目录使其与目标分支的快照保持一致并将 HEAD 指针指向该分支。B. 创建并切换新分支如果你想开启一个新任务通常需要先建分支再切过去。这个组合动作可以一步到位git checkout -b new-feature等同于 先运行 git branch new-feature 再运行 git checkout new-feature。C. 撤销/恢复文件 (Restoring Files)如果你不小心改乱了一个文件想把它还原到最近一次提交时的样子git checkout -- index.html注意 这里的 -- 是为了防止文件名和分支名重名。这个操作会抹掉你在该文件上未提交的所有修改且不可撤销使用时请务必小心。解决冲突如果将代码git push推送到远程仓库发现远程仓库和原来的快照不同时就会发生冲突。需要我们手动解决该代码冲突。·在 Git 的世界里解决冲突本质上是将两个平行发展的版本你的小圆和同事的小圆强行合并为一个共识最终的大圆的过程1冲突的触发推送失败当你完成本地开发本地小圆并尝试 git push 时如果远程服务器发现已经有人在你之前提交了代码远程小圆Git 会立即拦截你的请求。报错信息通常会提示 [rejected] (non-fast-forward)。现状你的本地分支、远程跟踪分支和远程分支此时指向了不同的提交点历史出现了分叉。2同步情报执行 git pull为了解决分叉你必须先把“对手”的情报拿下来。动作执行 git pull或者先 fetch 再 merge。底层变化Git 会更新你的远程跟踪分支如 origin/main让它指向远程那个小圆并尝试将其合并到你的本地分支中。3 陷入僵局冲突检测如果 Git 发现你们两人改动了同一个文件的同一行它会停止自动合并。状态此时你的本地分支处于“Merging”中间态。文件表现冲突的文件会被 Git 强行注入“冲突标记” HEAD 你的代码本地小圆的内容 同事的代码远程小圆的内容 origin/main4人工手动解决这是唯一需要你大脑介入的时刻。你需要打开编辑器决定这些冲突行的去留选择 A保留你的修改删除同事的。选择 B舍弃你的修改采用同事的。选择 C将两者的逻辑结合写出一段全新的代码。清理删除所有的 , , 标记。5达成共识生成“大圆”解决完代码矛盾后你需要告诉 Git 这一阶段的战斗结束了。暂存执行 git add 文件名这代表你已经完成了该文件的“调解”。提交执行 git commit。结果Git 此时会生成一个合并提交Merge Commit。这就是你要求的那个大圆。大圆的特殊性普通小圆只有一个“父亲”而大圆有两个“父亲”它同时指向了之前的本地小圆和远程小圆象征着两者的融合。6重新推送现在你的本地分支已经站在了“大圆”的高度而大圆的历史里已经包含了远程那个小圆。动作执行 git push。结局远程服务器检查发现你的提交历史已经完整包含了它的历史于是愉快地接受。此时远程分支也更新到了那个大圆的位置。解决冲突不是“覆盖”而是“整合”。小圆代表独立性。大圆代表一致性。整个解决的过程就是发现分叉 - 拉取对手 - 手动调解 - 铸造共识大圆 - 同步云端。多分支在 Git 的世界里分支就像是“平行宇宙”。你可以让多个宇宙永远并行运行也可以在某个时点选择让它们交汇合并。Git 允许甚至鼓励多个分支长期共存。以下是几种常见的不合并场景实验性分支 (Experimental Branches)你有个疯狂的想法开个分支去试。试完发现行不通或者代码写得太烂了。你完全可以把这个分支搁置在那里或者直接删除永远不合并进主线。环境分支 (Environment Branches)在很多公司里develop开发、test测试和 production生产是三个独立的分支。它们长期共存分别对应不同的服务器环境。版本维护分支 (Maintenance Branches)如果你在开发软件的 2.0 版本但还需要为 1.0 版本的用户提供安全补丁。你会保留一个 v1.x 的分支只在上面修 Bug而不会把它合并到 2.0 的主线里。虽然不强制合并但分支的存在通常遵循以下逻辑分支类型命运描述功能分支 (Feature)最终合并开发完一个新功能如登录页面测试没问题后必须合并否则用户用不到。发布分支 (Release)最终合并准备发布前的最后修整完成后通常会合并回main和develop。环境分支 (Long-lived)永久共存只要项目还在运行main和test分支就会一直存在。废弃/归档分支永不合并开发失败或已过时的尝试。当我们push推送时其实只是推送了当前所在的工作分支。而pull会把远程仓库里所有分支的新动态都下载。需要认识到两者的区别1推送 (Push)默认只送“当前”当你执行 git push 而不带任何参数时行为Git 只会将你当前所在的分支推送到它关联的远程分支。例外除非你显式运行 git push --all否则你本地的其他分支比如你偷偷开的 experiment 分支是不会被送到服务器上的。注意如果当前分支没有设置“上游upstream”Git 会报错并提醒你使用 git push --set-upstream origin branch。2拉取 (Pull)看似只拉当前实则“暗度陈仓”git pull 实际上是两个命令的组合git fetch git merge。第一步 fetch全量更新当你输入 pull 时Git 其实会把远程仓库里所有分支的新动态都下载到本地的“远程跟踪分支”里比如更新所有的 origin/*。第二步 merge定向合并Git 只会将你当前分支对应的那个远程分支合并进来。结论你的其他本地分支虽然知道了远程有更新通过 fetch 拿到了数据但它们的文件内容并不会变直到你切换过去手动执行 merge。下面是一个多分支工作的示例下载安装a) 下载本地电脑平台对应版本需要科学上网Git - DownloadsLinux使用命令:apt-get install gitb) 以管理员身份运行 Git 安装程序除了添加右键菜单要勾选其他默认即可。c) 到git官网注册账号d) 本地电脑任意一个文件夹右键打开git bash配置用户名、邮箱、密码配置用户名 git config --global user.name 我的名字 配置邮箱 git config --global user.email 我的邮箱 配置密码 git config --global user.password 我的密码实战练习1从远程仓库拉取代码如果是第一次下载项目在任意一个文件夹下从远程下载项目git clone 项目地址如果是本地已经有项目在项目文件夹打开git命令行从远程拉取更新项目将远程仓库中的更改合并到当前分支中 git pull2本地修改代码后在项目文件夹打开git命令行进行本地暂存、提交先将修改的文件放入暂存区 git add ./ 将暂存区的修改记录本地提交 git commit -m 本次提交的注释3将项目推送到远程git push4如果与绑定的远程跟踪分支进行合并时有冲突git会提示解决冲突后才可以提交。5拉取远程代码git pull6git会把有区别的文件进行合并同时保留所有冲突的代码需要我们修改代码。7再次add和commit进行本地提交再次push推送。git add ./ git commit -m 合并后的注释 git push8完成。私有仓库1. 创建私密仓库登录到GitHub账户在右上角点击加号 () 图标然后选择 New repository。在仓库名称旁边确保选择了 Private私密选项。填写其他必要的详细信息如描述、是否初始化README文件等。点击 Create repository 完成创建。2. 邀请成员一旦你创建了私密仓库你可以邀请其他人成为协作者在你的仓库页面点击 Settings设置。在左侧菜单中选择 Collaborators成员。点击 Add People邀请协作者。输入你想要邀请的成员的GitHub用户名。选择成员的权限级别例如可以设置为 Read、Write 或 Admin。点击 Add to repository添加协作者到仓库按钮。