第一次把项目并入别人的 GitHub 仓库:从 README 到 Pull Request

今天想把自己写的项目放进别人创建的 GitHub 仓库。起初我以为“推送到 main”就是把当前文件夹直接传上去,后来才弄明白:我的项目文件夹当时甚至不是 Git 仓库,而目标仓库已经有自己的内容。直接覆盖或强推都可能伤到别人的文件。

这篇是我按当时的操作讨论整理的备忘。文中的仓库名、路径和分支名都是示例。那次只整理了本地 README 和一份技术记录,没有完成 Git 提交、推送或合并。下面的命令是后续准备采用的步骤,不能当作已经执行的记录。

先弄清几个位置

名称 在这次操作中是什么
D:\my-project 我现有的项目文件夹,当时没有 .git,所以不能在这里直接 git push。
example-owner/team-repo 对方创建并邀请我协作的目标仓库,里面原本就有内容。
main 目标仓库的主分支,最终希望把项目并进去。
add-my-project 我准备创建的工作分支,先在这里提交,再发起 Pull Request。
博客目录 我写这篇文章的地方,和目标仓库是两回事。

Git 里的“提交”是把改动记录在本地仓库;“推送”才是把本地分支送到远端仓库;Pull Request(简称 PR)是请求把工作分支合并到主分支。这三件事不是同一步。

1. 从对方仓库开始

先接受 GitHub 协作邀请。在一个空目录的上级目录打开 PowerShell,克隆目标仓库,再从它当前的 main 建一个工作分支:

1
2
3
git clone git@github.com:example-owner/team-repo.git
cd team-repo
git switch -c add-my-project

git clone 会下载仓库内容和 Git 历史;cd 进入克隆出来的目录;git switch -c 新建并切换到分支。这里的 SSH 地址要求电脑已配置 GitHub SSH 认证;如果没有,可以使用该仓库页面给出的 HTTPS 克隆地址。

为什么从对方仓库克隆? 这样本地一开始就有对方现有的文件和提交历史,可以看清自己会改动什么。原来的 D:\my-project 只是待复制的项目文件,不要把它当作目标仓库的替身。

2. 复制文件,先看有没有撞名

原计划是把项目放进 my-project 子目录,避免和对方仓库根目录的文件重名。但我后来已经把项目文件直接放在克隆仓库的根目录。这时最该检查的是原有 README.md 是否被自己的版本覆盖,以及有没有意外改动或删除对方的文件。发现冲突就先和仓库所有者确认放置方式,再继续。

依赖目录 node_modules 不需要复制。项目里的测试样本是否适合公开尚未决定,也先不要暂存。若最终不提交样本,README 中依赖样本的测试说明也要对应修改。

3. 在克隆仓库根目录检查并暂存

因为文件放在根目录,原计划的 git add my-project 已经不适用。我需要在克隆出的 team-repo 目录里执行(文件名按实际情况替换):

1
2
3
4
git status --short
git add -- README.md docs src package.json package-lock.json
git diff --cached --name-status
git diff --cached --check

这些命令分别在做什么:

  1. git status --short:列出新增、修改、删除的文件。先确认自己究竟复制了哪些东西。
  2. git add -- ...:只把列出的路径放进“暂存区”,准备纳入下一次提交。-- 后面是文件名或目录名;实际文件清单变了,就按实际情况调整。这里不要图省事直接 git add -A,以免把 node_modules 或尚未决定公开的样本一起带上。
  3. git diff --cached --name-status:看已暂存文件的状态。A 是新增,M 是修改,D 是删除。若出现意外的 M 或 D,尤其是原仓库的 README,先停下来核对具体差异:git diff --cached -- README.md。
  4. git diff --cached --check:检查暂存内容中的空白字符等格式问题。它通过也不代表内容安全,仍要看文件清单和实际差异。

如果想从暂存区撤回误加的文件,可用 git restore --staged -- <文件路径>;这一步不会删除工作目录里的文件。遇到覆盖或删除原有文件时,先弄清文件来源,不要直接提交。

4. 确认后再提交、推送工作分支

只有文件清单与差异都确认无误,才继续:

1
2
git commit -m "Add my project"
git push -u origin add-my-project

git commit 生成本地提交;git push -u origin add-my-project 把工作分支推到远端,并设置后续推送的默认上游。它不会自动把改动合并进 main。

最后到 GitHub 创建 PR,选择 base: main,compare: add-my-project,请仓库所有者审核后合并。此前我说的“推到 main”,在这个已有协作者仓库的场景里,实际应理解为“最终并入 main”;先推工作分支可以让对方看清改动。

这次真正记住的事

先确认当前目录是不是 Git 仓库、目标远端是谁、分支是什么,再看暂存区到底有哪些文件。README、依赖、测试样本都有各自的公开范围。最重要的是把“本地改了文件”“本地提交了”“推送到远端了”“合并进 main 了”分开说清楚;这次会话只完成了第一项中的 README 整理。