Git 只推送一个文件

Git push only one file

我们有一个 public 回购,每个人都在推动。有时我们希望拉取和推送单个文件,而不是拉取整个远程文件并推送整个合并的本地文件。我知道推送一定是快进,能不能只快进一个文件?

这可能吗?如果不是,为什么(故意?)?

首先,您误用了 Git 术语。 refreference 只是一个名称,例如 refs/heads/master (分支名称的全名 master ) 或 refs/tags/v1.2 (标签的全称 v1.2).

下一步:git push 不推送 文件git push发送的是:

  • 提交 and/or 注释标签,以及所有其他需要的对象;
  • 一系列参考更新请求(默认)或命令(--force)。

接收服务器决定是否服从这些请求或命令。更新分支名称(refs/heads/ 命名空间内的引用)请求的默认设置是当且仅当它是快进操作时服从礼貌请求,并服从任何命令(任何强制更新) . 文件在这里完全不相关。当且仅当新提交哈希 ID 具有旧提交哈希 ID 作为祖先时,分支名称更新才是快进操作。1

要推送单个引用,只需这样做:

git push <remote> <local-name>:<remote-name>

要推送多个,只需这样做:

git push <remote> <l1>:<r1> <l2>:<r2> ... <ln>:<rn>

(在 git push 中省略冒号后的名称意味着另一个 Git 应该使用与您在本地 Git 中使用的名称相同的名称。)

任何提交附带的文件都是提交快照中的文件。由于您只能推送 commits(不是文件),因此无法推送文件。

(当然,您可以使用 other 而不是 Git 的方式将文件发送到服务器,并让服务器就地更新文件。但是在这种情况下根本不需要询问 Git!)


1Git 保持 D 直接 A 循环 G 提交的图或 DAG(实际上是所有对象,但提交是这里感兴趣的对象)。推送的结果是对 DAG 的更改。如果更改是纯粹的添加,则不会丢失任何提交。根据定义,这样的更新是 快进 ,因此是允许的。如果更改导致某些提交无法从更新的参考中访问,则更改根据定义是 非快进,因此默认情况下拒绝礼貌请求更新。

非快进更新是否真的丢失提交取决于这些提交是否可以通过其他外部名称访问。这更难计算——并非不可能,只是通过查看正在更新的一个引用不会立即显而易见。因此默认要求快进更新的设计原则。

总之,Git是真的在做graph theory