Mac使用GitHub
Mac使用GitHub

Mac使用GitHub

本文作为一个教程,将简单的介绍如何使用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分支的主旋律。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注