为什么我的git origin要删除所有推送的更改?

del*_*ego 1 git dvcs

在想到我终于想出了git之后,我现在发现自己对我所看到的git行为非常困惑 - 每当我推动所做的更改并将其提交到我的本地机器到我的原始git存储库时,这些更改立即得到暂停在原始服务器上撤消.咦??!?

我有一台机器(机器A),上面有一个项目的git存储库; 该机器正在运行SSH服务器,我配置了一个帐户,以便我可以远程连接它并克隆git repo.然后我在机器B上使用git克隆了repo:

git clone ssh://username@remote.host/path/to/repo

没有问题.我在机器B上对项目进行了更改,并将这些更改提交到B上的git存储库.然后,我将更改推送回机器A上的源存储库:

git push master origin

这很好; 在机器B上,输出git remote show origin显示原点是最新的:

$ git remote show origin
* remote origin
  Fetch URL: ssh://username@remote.host/path/to/repo
  Push  URL: ssh://username@remote.host/path/to/repo
  HEAD branch: master
  Remote branch:
    master tracked
  Local ref configured for 'git push':
    master pushes to master (up to date)
Run Code Online (Sandbox Code Playgroud)

但是,当我去机器A做一个时git status,我看到我刚刚推动的所有变化现在都被淘汰了!

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   build-fatjar.xml
#       deleted:    src/monitor/config/client-lm-prod.xml
#       modified:   src/monitor/config/quartz-baseconfig.xml
#       modified:   src/monitor/service/task/BaseTask.java
#       new file:   src/monitor/service/task/CheckForCorrections.java
#       deleted:    src/monitor/service/task/CheckForDuplicates.java
#       deleted:    src/monitor/service/task/ProcessCorrections.java
#       renamed:    src/monitor/test/CheckForDuplicatesTest.java -> src/monitor/test/CheckForCorrectionsTest.java
#       deleted:    src/monitor/test/ProcessCorrectionsTest.java
#       modified:   src/monitor/test/TaskTestCase.java
Run Code Online (Sandbox Code Playgroud)

将原始存储库(机器A)置于与机器B上的状态相同的状态的唯一方法是git reset HEAD重置所有要提交的更改,然后重置每个更改git rm; 否则,git commit机器A上的下一个将撤消我刚从机器B推出的所有内容.

我已经阅读了每一个我可以得到的参考资料,没有提到这种行为; 同样,我也无法在网上找到它的参考.有任何想法吗?

mip*_*adi 5

听起来你正在推动一个非裸仓库(即一个在磁盘上签出文件的仓库).Git会更新repo,但不会更新已签出的文件,因此看起来好像有等待上传的更改.修复是做两件事之一:

  1. 要么推入一个裸仓库(原产地),然后使用后接收钩子检查文件(可能使用git archive)到服务器上的另一个地方,或者
  2. 使用post-receive挂钩运行git checkout或某些更新磁盘文件.

您可以在此Stack Overflow问题或本方法文章中阅读更多内容.