使用 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