我的工作流程基本上是:
- 在我的台式电脑上创建一个 repo
- 做一些工作并提交更改
- 克隆到我的笔记本电脑上
- 致力于此,提交更改
现在我想将更改与我的桌面同步。尝试 git push desktop.local:~/my-repo
会失败,因为 the master branch is already checked out .我知道有两种解决方案:
在我 PC 的另一个目录中创建第三个裸存储库,并从那里更新两个工作副本。但是一个带有两个工作副本的中央存储库听起来像...... SVN!除了笨拙之外,因为我不能只使用
svn update
和svn commit
来与这个中央存储库同步——需要额外的步骤来实际更新中央 repo 提交的更改Git 中的工作副本。推送到一个单独的分支并将该分支 merge 到我的桌面工作副本中。这还不算太糟糕,但是……
...我不明白的是:如果我只是通过 SSH 连接到桌面 PC 并发出 git pull laptop.local:~/my-repo
,它就可以工作了!它 pull 已提交的更改并更新 checkout 的主分支,不问任何问题。为什么 git push
不能自己做?
所以这是我的问题:是否有一个命令与 ssh
的工作方式相同 - 进入我的台式电脑并发出 pull
?
最佳答案
问题是当你试图 push 你同时做 2 个 Action 时。 第一个是更新 git 树,第二个是更新笔记本电脑上的工作目录。所以在推送过程中有一种隐式的“checkout ”,而 git 拒绝这样做,这是正确的。 想象一下,如果有人真的在您的台式 PC 上工作,将会发生什么。 当你使用 SSH 时,事情就不同了,你在你的工作目录中,你对你所做的一切负责,因此,你可以做任何你想做的事,删除文件,“pull ”。所以这在某种程度上看起来很正常,推送不允许您(默认情况下)搞砸远程计算机。
更新
如果您将 receive.denyCurrentBranch 设置为 ignore ,您可以推送,但您仍然必须将您的工作目录与“最新”版本的代码(您刚刚推送的代码)“同步”。这意味着您仍然有 2 个命令可以在每台计算机上运行一个
如果您真的只想运行一个命令,请使用 shell 的强大功能并创建一个别名,该别名可以从桌面计算机执行 git pull
alias remote_pull=ssh <desktop> "cd <path>; git pull"
关于Git - 将存储库与 checkout 分支同步的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4011089/