本文作为一个教程,将简单的介绍如何使用GitHub平台,以便对代码进行托管,或者对源码进行开源。
1、注册和安装
GitHub官网:https://github.com/
点击Sign up注册账户,注册过程不进行累赘。
2、安装Git
Mac用户可以通过Homebrew安装:
brew install git
验证 Git 是否安装成功:
git -–version
若能看到版本号,如 git version 2.x.x,则说明安装成功。
3、配置Git用户信息
设置全局用户信息(适用于所有 Git 仓库)
在终端(macOS/Linux)中运行::
git config --global user.name "你的 GitHub 用户名"
git config --global user.email "你的 GitHub 绑定邮箱"
这样,所有 Git 项目都会使用这个用户名和邮箱。
为什么要配置 Git 用户信息?
记录提交者身份:每次 git commit,Git 会在提交历史中附带用户名和邮箱信息,便于区分不同开发者的贡献。
与 GitHub 关联:GitHub 通过邮箱地址识别提交,并将它们与 GitHub 账号关联。
团队协作:在多人协作开发中,正确的用户信息可以帮助团队成员追踪谁提交了哪些更改。
针对某个项目设置(仅限当前 Git 仓库)
如果在不同项目中使用不同的 Git 账号(例如,工作和个人),可以在某个仓库内单独设置:
git config --local user.name "你的GitHub用户名"
git config --local user.email "你的GitHub绑定邮箱"
这只会影响当前仓库,而不会影响其他仓库。
查看已配置的 Git 用户信息
如果想查看当前 Git 配置的用户名和邮箱,可以运行:
git config --global user.name
git config --global user.email
者:
git config –list
这样可以检查所有的 Git 配置,包括用户信息、编辑器、默认分支等。
配置 Git 用户信息后对提交的影响
当执行 git commit 提交代码时,Git 会记录用户名和邮箱。例如:
commit 3f4b5d6 (HEAD -> main)
Author: JohnDoe <johndoe@example.com>
Date: Wed Jan 31 14:00:00 2025 +0800
修复存钱罐应用的 UI 问题
可以在 GitHub 提交历史中看到相应的提交者信息。
如果不配置 Git 用户信息会怎样?
首次提交代码时 Git 会报错:
*** Please tell me who you are.
Git 需要知道提交者信息,否则不会提交代码。
提交记录可能无法正确关联到 GitHub 账号:
如果 Git 配置的邮箱与 GitHub 账号不匹配,提交可能不会显示在 GitHub 个人主页的贡献图(contributions graph)中。
4、创建或克隆仓库
登陆GitHub后,点击右上角+号 – New repository。
填写仓库名称,选择Public(公开)或Private(私有)。
其中,README文件用于在GitHub仓库展示:
在创建页面还有两个配置,分别是”Add .gitignore”和”Choose a license”。
.gitignore文件
.gitignore 是一个 Git 配置文件,用于指定 哪些文件或文件夹 不应被 Git 追踪(即不纳入版本控制)。
它的作用是:
避免上传不必要的文件(如编译生成的 .o、.class 文件)。
保护敏感信息(如 API 密钥、配置文件)。
提高 Git 效率(减少无关文件的提交)。
如果创建的是Swift/iOS项目:
可以选择Swift或 Xcode 的 .gitignore 模板,或自己手动添加。
如果已经创建了 Xcode 项目,并希望手动添加 .gitignore,可以按照以下步骤操作:
1、在终端中进入Xcode 项目目录:
cd /Xcode项目路径
2、创建 .gitignore 文件:
touch .gitignore
3、编辑 .gitignore(可以使用 nano、vim 或 VS Code):
vi .gitignore
4、添加以下内容(适用于 Xcode 和 Swift 项目):
# macOS 系统相关
.DS_Store
# Xcode 相关
build/
DerivedData/
xcuserdata/
*.xcscmblueprint
# Swift Package Manager
.swiftpm/
Packages/
# CocoaPods
Pods/
*.xcworkspace
# Carthage
Carthage/
# Fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
# Xcode Playgrounds
timeline.xctimeline
playground.xcworkspace
保存并退出。
.gitignore 的作用
.gitignore 会告诉 Git 忽略特定文件,防止不必要的文件被提交。例如:
build/:防止 Xcode 生成的编译文件被提交。
Pods/:如果使用 CocoaPods,不需要提交 Pods 目录,只需 Podfile.lock。
DerivedData/:Xcode 的缓存文件,不需要上传到 GitHub。
其他方式获取Xcode .gitignore
如果不想手动添加 .gitignore,还可以使用 curl 命令直接下载:
curl -L -o .gitignore https://raw.githubusercontent.com/github/gitignore/main/Swift.gitignore
-L:允许 curl 处理 重定向(GitHub raw 文件通常有 301/302 跳转)。
-o .gitignore:将下载的内容保存为 .gitignore。
许可证(License)
许可证(License)是开源项目的法律协议,规定了其他人如何使用、修改和分发代码。
为什么需要许可证?
保护你的代码,防止他人随意使用或滥用。
允许他人合法使用,避免版权纠纷。
定义开源方式,例如是否允许商业用途、是否必须开源衍生项目。
常见的开源许可证
下面是常用的几种许可证:
1、Apache License 2.0(Apache 许可证 2.0):
特点:
允许自由使用、修改和分发,包括商用。
允许闭源(可以修改代码但不需要开源)。
提供专利授权,防止贡献者起诉用户侵犯专利。
需要在修改后提供版权声明和许可证文本。
适用场景:
适用于需要专利保护的企业项目(如 Android)。
适用于对自由度要求较高的开源项目。
示例项目:Android、Hadoop、Apache Web Server
2、GNU General Public License v3.0(GNU 通用公共许可证 3.0,GPLv3)
特点:
强制开源:任何基于 GPL 代码的修改或衍生作品必须 开源(即“Copyleft”)。
允许自由使用、修改和分发,但 修改后必须继续使用 GPL 许可证。
保护用户免受 DRM(数字版权管理)限制。
解决了 GPLv2 在专利和硬件方面的漏洞。
适用场景:
适用于希望代码保持开源的项目。
不适用于闭源商业软件(因为一旦使用 GPL 代码,整个项目都必须开源)。
示例项目:Linux 内核、GCC(GNU Compiler Collection)、WordPress
3、MIT License(MIT 许可证)
特点:
最宽松的开源许可证之一。
允许自由使用、修改、分发,包括商用和闭源。
仅要求保留原始许可证声明。
不提供专利授权,但通常不会影响商业使用。
适用场景:
适用于希望代码能被广泛使用、二次开发甚至商业化的项目。
适用于开源库、框架、工具等。
示例项目:React.js、jQuery、Ruby on Rails
4、BSD 2-Clause License(BSD 2 条款许可证,简化版)
特点:
允许自由使用、修改、分发,包括商用和闭源。
只要求保留版权声明和免责声明。
比 MIT 许可证更短,但功能相似。
适用场景:
适用于希望代码自由使用,同时不希望承担法律责任的项目。
示例项目:NetBSD、FreeBSD
5、BSD 3-Clause License(BSD 3 条款许可证,修正版)
特点:
与 BSD 2-Clause 类似,但增加了 “不得使用项目作者或贡献者的名称进行推广” 限制。
仍然允许自由使用、修改和分发(包括商用)。
适用于大型开源项目,避免误用作者或机构的名义。
适用场景:
适用于企业和学术机构,希望防止未经授权的品牌使用。
示例项目:LLVM、FreeBSD、PostgreSQL
如果不希望别人随意使用你的代码,可以 不添加许可证,默认 保留所有权利。
手动添加许可证
如果在创建 GitHub 仓库时没有选择许可证(License),可以 手动添加 许可证文件,步骤如下:
使用 GitHub 内置功能添加许可证
1、打开 GitHub 仓库。
2、点击 “Add file” → “Create new file”。
3、在文件名输入框中,输入 LICENSE(GitHub 会自动识别)。
提示有未保存的修改,是否放弃它们。
点击“确定”按钮后,跳转到显示许可证页面。
4、在左侧选择适合的许可证(例如 MIT License)。
5、GitHub 会自动填充许可证文本,点击 “Review and submit” 保存。
保存后,可以看到许可证文件。
5、创建完成GitHub仓库
6、本地克隆仓库
复制仓库的HTTPS/SSH地址(推荐使用HTTPS)。
在终端运行:
git clone 仓库地址
示例:
git clone https://github.com/fangjunyu1/Banklet.git
7、本地项目推送到GitHub
如果已经有一个本地项目,并想把它同步到 GitHub 仓库,可以按照以下步骤操作:
1、在本地终端初始化 Git 并推送
cd /path/to/your/project
2、初始化Git
git init
3、将项目所有文件添加到 Git
git add .
4、提交更改
git commit -m "初次提交"
5、将 GitHub 仓库添加为远程仓库
1)使用HTTPS方法:
git remote add origin https://github.com/你的用户名/你的仓库名.git
这条命令告诉 Git,远程仓库的地址是 https://github.com/你的用户名/你的仓库名.git,并命名为 origin(默认远程仓库名称)。
HTTPS 方式的特点:
适合临时或不常使用的环境。
每次推送代码时,Git 需要输入GitHub 账号和访问令牌(Personal Access Token,PAT),因为 GitHub 不支持直接输入密码。
如果没有设置 Git 凭据缓存,每次 git push 时都会要求输入用户名和访问令牌。
适用于防火墙或 SSH 受限的网络环境。
2)使用 SSH(推荐):
git remote add origin git@github.com:你的用户名/你的仓库名.git
这条命令使用 SSH 方式添加远程仓库,让 Git 通过 SSH 密钥认证访问 GitHub。
SSH 方式的特点:
不需要每次输入 GitHub 用户名和访问令牌(使用 SSH 公钥进行身份验证)。
适合长期开发,推荐使用 SSH 方式,特别是频繁提交代码的开发者。
需要先配置 SSH 密钥,如果未配置 SSH,会遇到 Permission denied (publickey) 错误。
git remote add origin … 作用
设置远程仓库的名称(默认命名为 origin)。
指定远程仓库的访问方式(HTTPS 或 SSH)。
后续 git push 或 git pull 时,会根据这个设置自动连接远程仓库。
可以使用以下命令查看已添加的远程仓库信息:
1)查看远程仓库列表
git remote -v
示例输出:
origin https://github.com/fangjunyu1/Banklet.git (fetch)
origin https://github.com/fangjunyu1/Banklet.git (push)
2)查看远程仓库的详细信息
git remote show origin
示例输出:
* remote origin
Fetch URL: https://github.com/fangjunyu1/Banklet.git
Push URL: https://github.com/fangjunyu1/Banklet.git
HEAD branch: main
Remote branch:
main new (next fetch will store in remotes/origin)
Local ref configured for 'git push':
main pushes to main (local out of date)
这个命令可以看到:
远程仓库的URL(Fetch 和 Push)。
远程默认分支(HEAD branch)。
本地与远程分支的关联情况。
修改远程仓库
如果已经设置了一个origin的远程仓库,无法重复添加相同名称的远程仓库。如果想要修改远程仓库的访问方式,如从HTTPS切换到SSH,可以使用以下两种解决方案:
方案1:删除原来的origin,然后重新添加
如果确认之前的 origin 远程仓库 URL 需要更换(比如之前添加的是 HTTPS,现在想改为 SSH),可以先删除 origin,然后重新添加:
git remote remove origin # 删除原有的远程仓库
git remote add origin git@github.com:fangjunyu1/Banklet.git # 重新添加
然后可以检查是否添加成功:
git remote -v
如果正确,应该看到:
origin git@github.com:fangjunyu1/Banklet.git (fetch)
origin git@github.com:fangjunyu1/Banklet.git (push)
方案2:直接修改 origin 的 URL
如果只是想切换远程仓库的地址(比如从 HTTPS 切换到 SSH),可以直接使用:
git remote set-url origin git@github.com:fangjunyu1/Banklet.git
然后查看是否修改成功:
git remote -v
Git分支
因为下面的推送代码涉及到Git分支,因此这里作为一个科普分支的知识内容插入进来。
什么是分支?
Git 分支的作用就像“平行宇宙”,你可以在分支上自由修改代码,而不会影响其他分支。
当创建一个 Git 仓库时,默认会有一个主分支,早期 Git 默认是 master,但现在 Git 推荐使用 main 作为默认分支。
常见的分支名称
在实际开发中,不同分支有不同的用途,通常有以下几种常见的分支:
分支的实际用法
(1)查看当前分支
git branch
如果输出:
* main
develop
feature-login
表示当前在 main 分支(前面有 *)。
(2)创建一个新分支
创建 develop 分支:
git branch develop
但这样不会切换到 develop,还需要:
git checkout develop # 切换到 develop
或者直接用:
git checkout -b develop # 创建并切换到 develop
(3)切换分支
git checkout main # 切换回 main 分支
(4)合并分支
如果在 develop 分支上开发完功能,想合并到 main:
git checkout main
git merge develop
为什么需要分支?
如果所有开发者都直接在 main 分支上工作,可能会出现:
代码冲突:多人修改同一个文件,推送时会冲突,难以管理。
不稳定性:如果某人推送了未完成的功能或有 bug 的代码,其他人拉取后可能导致整个项目无法运行。
无法并行开发:如果开发 A 还没完成,开发 B 需要修改相同的代码区域,可能会相互影响。
分支的作用:
隔离开发:不同功能或修复可以在自己的分支上独立完成,不影响 main 分支。
减少冲突:每个人在自己的分支上开发,最后再合并到 main,降低直接冲突的可能。
保持稳定:main 分支通常是稳定的代码,只有经过测试和审核的代码才能合并进去。
多人协作
假设你和你的团队正在开发一个存钱罐应用 Banklet,你们使用 Git 进行版本管理。
(1) main 只存稳定的版本
你从远程仓库 git clone 下来,默认的 main 分支是 稳定版本,适用于发布给用户。
(2) develop 分支是所有开发工作的集合
git checkout -b develop # 创建 develop 分支
git push -u origin develop # 推送到远程
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a pull request for 'develop' on GitHub by visiting:
remote: https://github.com/fangjunyu1/Banklet/pull/new/develop
remote:
To github.com:fangjunyu1/Banklet.git
* [new branch] develop -> develop
branch 'develop' set up to track 'origin/develop'.
develop 分支用来整合所有功能开发的代码,等稳定后再合并到 main。
(3)每个功能有自己的 feature/xxx 分支
如果要实现一个新的“每日存钱提醒”功能,可以创建一个 feature/reminder 分支:
git checkout -b feature/reminder develop # 从 develop 创建新分支
# 编写代码...
git commit -am "添加每日存钱提醒"
git push -u origin feature/reminder # 推送到远程
这样,你的代码不会影响 main 或 develop,其他人也可以并行开发其他功能。
-u 选项(–set-upstream)的作用:让 Git 记住远程 origin/feature/reminder,以后可以直接用 git push,而不需要指定 origin feature/reminder
在代码中使用git branch查看分支:
git branch
develop
* feature/open-source
main
(4)开发完成后合并回 develop
git checkout develop # 切换回 develop 分支
git merge feature/reminder # 合并新功能
git push origin develop # 推送到远程
这样,新功能不会影响 main,但已经集成到 develop,等待测试通过后,再合并到 main。
develop何时合并到main?
有两种方法可以把 develop 合并到 main:
方法 1:本地合并(推荐)
git checkout main # 切换到 main
git merge develop # 把 develop 合并到 main
git push origin main # 推送 main 到远程
这在本地合并,然后推送到 GitHub。
方法 2:GitHub 上创建 Pull Request
1、打开GtHub仓库
2、切换到 develop 分支
3、点击 “Compare & pull request”
4、选择合并到 main
点击拉取请求后,会跳转到拉取请求页面。
5、点击 “Merge pull request”
点击“Confirm merge”后,显示“Pull request successfully merged and closed”,表示分支合并成功,并显示“Delete branch”删除分支的按钮。
点击“Delete branch”按钮后,会自动删除这一分支。
6、本地同步最新 main
git checkout main
git pull origin main # 拉取 GitHub 最新的 main
这种方法适用于团队协作,可以在 GitHub 上先审核代码,再合并。
6、推送代码到 GitHub
git branch -M main
git push -u origin main
1)git branch -M main
作用:将当前分支重命名为 main。
-M 选项表示强制重命名(如果 main 已存在,会覆盖)。
如果最初初始化 Git 时默认分支是 master,执行这条命令后,分支会变成 main。
示例:
git branch -M main
如果当前分支已经是 main,这条命令不会有任何影响。
2)git push -u origin main
作用:将 main 分支推送到远程仓库,并设置 main 为默认上游(upstream)分支。
-u(–set-upstream)让 main 分支与 origin/main 关联,这样以后只需 git push 而不需要指定 origin main。
origin 是远程仓库的名字,main 是推送的分支。
示例:
git push -u origin main
如果未使用 git remote add origin,git push 会报错,因为 Git 不知道远程仓库地址。
如果之前已经运行过 git push -u origin main,以后只需:
git push # 自动推送 main 分支
而不需要:
git push origin main # 需要手动指定远程和分支
为什么使用git branch -M main?
1)社区标准的变化
2020 年左右,Git 社区和 GitHub 逐渐将默认分支名称从 master 改为 main,以减少对历史上“master-slave”(主从)概念的不当联想,同时提高通用性和可读性。
Git 2.28 及更新版本允许用户手动设置默认分支名称:
git config --global init.defaultBranch main
这样,新建仓库时默认分支就会是 main。
2)GitHub 和 GitLab 等平台默认使用 main
GitHub 2020 年 10 月起,新仓库默认分支变为 main。
GitLab 也在 2021 年后默认使用 main。
如果 Git 版本较老,默认仍然是 master,但 GitHub 新建仓库时默认是 main,这样本地 master 和远程 main 不匹配,可能会导致推送冲突。
解决方案:
git branch -M main # 把 master 改名为 main
git push -u origin main # 推送 main 分支到远程
3)团队协作和一致性
如果当前团队使用 main 作为默认分支,但你的 Git 仍然用 master,会导致混乱。
使用一致的命名方式可以避免误操作(例如 git push origin master 可能会失败)。
如果Git 仍然使用 master,建议修改默认设置:
git config --global init.defaultBranch main
然后,创建的新仓库都会默认使用 main。
8、Git基本操作
添加文件并提交
git add .
git commit -m "提交信息"
其中:
git add .:添加所有修改的文件。
git commit -m “提交信息”:提交更改,并写明修改说明。
推送代码到 GitHub
git push origin main
main 是默认的主分支,如果你的主分支是 master,则需要替换 main 为 master。
拉取最新代码
git pull origin main
远程协作
分支管理
创建新分支:
git checkout -b 新分支名
切换分支:
git checkout 分支名
合并分支:
git merge 目标分支
扩展知识
git push报错
git push origin develop # 推送到远程
To github.com:fangjunyu1/Banklet.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'github.com:fangjunyu1/Banklet.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
git push 失败的原因是:远程仓库 main 分支的内容比本地 main 更新,而本地的代码没有这些更新,所以 Git 拒绝直接推送。
本地 main 和 远程 main 不同步,远程仓库可能已经有新的提交(例如,之前在 GitHub 上修改过文件,或者别人推送了代码)。
Git 不允许覆盖远程的更改,防止数据丢失。
方法 1:先拉取再推送(推荐)
git pull --rebase origin main # 先拉取远程 main 分支并将本地变更重新应用
git push origin main # 重新推送
git pull –rebase origin main 先获取远程仓库的最新代码,并把你的更改重新叠加在最新的 main 之上,避免冲突。
git push origin main 在代码合并后,成功推送到远程。
方法 2:如果你不关心远程代码,强制覆盖
警告:这会覆盖远程仓库的代码,可能导致别人提交的更改丢失
git push --force origin main
适用情况
确定远程仓库的 main 分支不需要(比如刚创建仓库,还没正式开发)。
但如果团队协作,强制推送可能导致他人的提交丢失!
方法 3:如果出现冲突,手动合并
如果 git pull 后提示冲突:
git merge origin/main # 手动合并
git push origin main # 解决冲突后推送
步骤
1)git pull –rebase origin main(如果失败,继续下一步)
2)git merge origin/main(合并远程更改)
3)手动解决冲突
4)git commit -am “解决冲突”
5)git push origin main
典型Git冲突问题
如果远程的main分支已经被其他人修改,本地的main分支也有修改,就会导致git push失败。需要先拉取远程的main并手动合并。
当你执行 git push origin main,Git 会拒绝推送,并提示:
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'github.com:你的仓库.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally.
原因:
1)你本地 main 有新的提交。
2)远程 main 也有新的提交(别人修改并推送了)。
3)你的 git push 会导致远程 main 被覆盖,所以 Git 阻止了推送。
解决方案:
步骤 1:先拉取远程最新的 main
git fetch origin # 获取远程更新,但不合并
git merge origin/main # 合并远程的 main 到本地
可能出现冲突!如果有冲突,Git 会提示你哪些文件冲突了,你需要手动解决冲突。
步骤 2:解决冲突(如果有)
如果 Git 提示冲突:
Auto-merging example.txt
CONFLICT (content): Merge conflict in example.txt
手动解决:
1、打开 Xcode 或 VSCode,找到标记为 <<<<<<< 的冲突文件:
<<<<<<< HEAD
你的本地修改内容
=======
远程仓库的修改内容
>>>>>>> origin/main
2、选择正确的内容,删除 <<<<<<< 和 ======= 标记。
3、标记为已解决:
git add .
git commit -m "解决 main 分支合并冲突"
步骤 3:推送合并后的 main
git push origin main
现在本地 main 已经同步了远程的 main,冲突已解决,推送会成功。
总结
本文的内容比较繁多,但总体的GitHub使用方法都在这篇文章当中。
GitHub比较复杂的还是关于分支的概念,在开发的过程中通常存在一个main分支,这个分支表示稳定/公开的版本。自己独立开发的话,可以考虑直接在main分支上开发,或者单独创建一个develop分支进行开发。
如果是多人开发的话,通常存在一个main分支,一个develop分支,每个人还会再单独创建一个独立的分支。在独立的分支上修改/解决问题后,将独立的分支同步到远程仓库中,在远程仓库中进行合并等相关操作。
对于分支的理解,可以比作备份。main分支是稳定的文件,如果要修改文件内容,应该设置一个备份,比如develop分支。但是如果开发人员比较多,那么它们都会拉取并修改develop这个备份分支。在修改的过程中,就会存在Git冲突等问题。
因此,解决这一冲突时,就需要从远程仓库拉取develop分支,然后进行合并,并重新推送到远程仓库。如果每个人需要修改代码的某一个功能逻辑,就可以单独创建功能分支,然后同步到远程仓库。最后可以在远程仓库(如Github)将功能分支合并到develop分支,如果存在冲突,则需要解决冲突后进行合并。
分裂和合并更像是GitHub分支的主旋律。