使用 git push 命令可以将本地分支推送到远程仓库。

你可以给这个命令传递各种选项和参数。本文将介绍最常使用的选项和参数。

如何将本地 Git 分支推送到 Origin

如果你运行简单的命令 git push,默认情况下,Git 将为你选择另外两个参数:要推送到哪个目标远程仓库,要推送的分支

该命令的一般形式是这样的:

$ git push <remote> <branch>

默认情况下,Git 选择 origin 作为远程仓库,你的当前分支作为要推送的分支。

如果当前分支为 main,则 git push 命令将提供两个默认参数——有效运行 git push origin main

在下面的示例中,origin 是一个 GitHub 仓库,而当前分支是 main

(main)$ git remote -v 
origin  git@github.com:johnmosesman/burner-repo.git (fetch)
origin  git@github.com:johnmosesman/burner-repo.git (push)

(main)$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
   b7f661f..ab77dd6  main -> main

从输出中你可以看到,本地 main 分支被推送到远程 main 分支:

To github.com:johnmosesman/burner-repo.git
   b7f661f..ab77dd6  main -> main

在 Git 中如何强制推送一个分支

通常,你推送一个分支,并添加到其提交历史记录。

但是,有时你需要强行覆盖分支的历史记录。

你这么做的原因可能有几个。

第一个原因是要纠正一个错误——尽管最好做一个新的提交来还原更改

第二种(也是更常见的情况)是在执行诸如 rebase 之类的操作之后——该操作会更改提交历史记录:

在内部,Git 通过创建新的提交并将它们应用于指定的基础来完成 [rebase]。重要的是要理解,即使分支看起来相同,它也由全新的提交组成的。

rebase 将创建全新的提交。

这意味着,如果你尝试推送已在本地——而不是在远程——重新建立了基础的分支,则远程仓库将知道提交历史记录已更改,并且将阻止你推送,直到你解决差异为止:

(my-feature)$ git push
To github.com:johnmosesman/burner-repo.git
 ! [rejected]        my-feature -> my-feature (non-fast-forward)
error: failed to push some refs to 'git@github.com:johnmosesman/burner-repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

你可以在此处执行 git pull 来合并差异,但是如果你确实想覆盖远程仓库,则可以在推送时添加 --force 标记:

(my-feature)$ git push --force origin my-feature
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 184 bytes | 184.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
 + edb64e2...52f54da my-feature -> my-feature (forced update)

(注意:你可以使用缩写 -f 来表示 --force。)

强制推送是一种破坏性的操作——仅在确定需要执行这个操作时才使用它。

Force push with lease

有时你可能想强制推送——但前提是没有其他人对该分支提交贡献。

如果其他人为这个分支提交了贡献,并将他们的更改推送到了远程服务器上,而你强制将其推到了远端,那么你将覆盖他们的更改。

为避免这种情况,可以使用 --force-with-lease 选项。

根据文档:

单独使用 --force-with-lease,不指定详细信息,将通过要求它们的当前值与为它们提供的远程跟踪分支相同,来保护所有将要更新的远程引用。

这样就告诉 Git 仅当它与上次看到的相同时才强制更新该分支。

如果你正在与分支中的其他人进行协作,则最好避免使用 --force 或至少使用 --force-with-lease,来防止丢失其他协作者所做的更改。

如何在 Git 上推送到其他名称的分支

通常,你会将本地分支推送到同名的远程分支——但并非总是如此。

要推送到其他名称的分支,只需指定要推送的分支目标分支的名称,并用冒号(:)分隔。

例如,如果你想将名为 some-branch 的分支推送到 my-feature

(some-branch)$ git push origin some-branch:my-feature
Total 0 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
 + 728f0df...8bf04ea some-branch -> my-feature

如何推送所有本地分支到远程

你不需要经常从本地推送所有分支,但是如果你需要这样做,则可以添加 --all 标记:

(main)$ git branch
* main
  my-feature

(main)$ git push --all
...
To github.com:johnmosesman/burner-repo.git
   b7f661f..6e36148  main -> main
 * [new branch]      my-feature -> my-feature

结语

git push 命令是你经常会使用的命令,你可以将它和很多选项配合使用。我鼓励你阅读文档以了解这些有用的选项和快捷方式。

如果你喜欢本教程,我还将在 Twitter 上讨论类似的主题,并在我的网站上写这些主题。

原文:Git Push to Remote Branch – How to Push a Local Branch to Origin,作者:John Mosesman