git - 如何推送到非裸 Git 存储库?

标签 git git-push git-non-bare-repository

我通常通过 ssh(屏幕和 vim)在远程服务器上工作,我在远程服务器上有一个 Git 存储库。有时我不在线,所以我的笔记本电脑上有一个单独的存储库(从我的 Remote 克隆)。

但是,我无法从远程端的这个存储库中提取数据,因为我通常在防火墙后面或者我没有公共(public) IP。

我读到我应该只推送到一个裸仓库。我应该如何将我的更改推送到我的远程存储库?

最佳答案

最佳选择

推送到您的非裸远程存储库的最干净、最不困惑和最安全的方法可能是推送到远程中代表您的笔记本电脑分支的专用分支。

让我们看一下最简单的情况,并假设您在每个存储库中只有一个分支:master。当您从笔记本电脑推送到远程仓库时,不是推送 master -> master,而是推送 master -> laptop-master(或类似的名称)。这样,推送不会影响远程仓库中当前 checkout 的 master 分支。要从笔记本电脑执行此操作,命令非常简单:

git push origin master:laptop-master

这意味着本地 master 分支将被推送到远程存储库中名为“laptop-master”的分支。在您的远程存储库中,您将拥有一个名为“laptop-master”的新分支,然后您可以在准备就绪时将其 merge 到您的远程主机中。

备选方案

也可以只推送 master -> master,但是一般不推荐推送到非裸仓库的当前 checkout 分支,因为如果你不明白发生了什么,可能会造成混淆。这是因为推送到已 checkout 的分支不会更新工作树,因此在被推送到的已 checkout 分支中检查 git status 将显示与最近的完全相反的差异推。如果在推送完成之前工作树是脏的,它会变得特别困惑,这是不推荐这样做的一个重要原因。

如果你只想尝试推送 master -> master,那么命令就是:

git push origin

但是当您返回到远程仓库时,您很可能想要执行 git reset --hard HEAD 以使工作树与推送的内容同步。 这可能很危险,因为如果您希望保留的远程工作树中有任何未提交的更改,它会将它们清除。在尝试之前,请确保您知道这样做的后果,或者至少先进行备份!

编辑 从 Git 2.3 开始,您可以使用“push-to-deploy” git push: https://github.com/blog/1957-git-2-3-has-been-released .但是推送到一个单独的分支然后 merge 通常会更好,因为它会进行实际的 merge (因此可以像 merge 一样处理未提交的更改)。

关于git - 如何推送到非裸 Git 存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1764380/

相关文章:

git - 如何将本地 Git 存储库推送到另一台计算机?

git - 为什么我的远程 Git 存储库在推送到它之后有未提交的更改?

git - 在 Git 中使用 receive.denyCurrentBranch 有什么后果?

Git 安装 RHEL Linux 失败,出现 "warning: zlib.h: No such file or directory"

git - 将 Flask 应用程序推送到 heroku : Could not build wheels for PyGObject which use PEP 517 and cannot be installed directly 时出错

ruby - 无法将提交推送到 heroku

git - git通过vscode表示 “unable to migrate objects to permanent storage”是什么意思

git - 停止将代码直接 checkin VSTS 中的 master 分支的权限

git - 如何配置 'git push -u'来推断远程分支名称?