git从远程存储库中取出特定的修订版

我们有一个远程的git仓库,我们通常使用git push在我们的开发服务器上进行部署,然后在我们的活动服务器上运行git pull以获取最新推送的仓库版本。

但是,如果我们已经承诺并推进了一些修订(没有在服务器上的git pull ),我们怎么能做一个指的是我们想要的旧提交的git pull

即类似git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

    一旦你把仓库拉出来,你应该可以去:

     git checkout 3ef0d... 

    从Git 2.5的uploadpack.allowReachableSHA1InWant允许它:

     mkdir server cd server git init touch 1 git add 1 git commit -m 1 git clone ./ ../local for i in {2..4}; do touch "$i" git add "$i" git commit -m "$i" done # Before last commit. SHA3="$(git log --format='%H' --skip=1 -n1)" # Last commit. SHA4="$(git log --format='%H' -n1)" cd ../local # Does not give an error, but does not fetch either. git fetch origin "$SHA3" # Error. git checkout "$SHA3" cd ../server git config uploadpack.allowReachableSHA1InWant true cd ../local git fetch origin "$SHA3" git checkout "$SHA3" # Error. git checkout "$SHA4" 

    如果您的服务器上的某个进程立即访问刚刚拉出的内容(例如,您不能在pull之后使用git checkout 3ef0d ),则应考虑标记要在生产环境中部署的版本,并专门在生产环境中签出该标签,不会立即改变你的工作目录。 否则,你会冒险的人拉你之前推。

    请注意, git pull git checkout my-old-commit现在将您置于DETACHED HEAD状态 – 实际上,您将在此存储库中将未来的提交发送到新的提交path。 对于部署回购,这不是一个大问题,因为唯一的提交应该是已被提交之前正确提交。

    然而,它有时检查提交标记(头部,标记,遥控器)看起来与主回购相同。 要解决这个以下的结帐: git reset – 重新附加头git fetch – 同步远程标记[这可能是git版本相关 – 无可否认,我们的环境仍然在1.7 …所以可能不再需要YMMV]