git push
进行部署,然后在活动服务器上使用git pull
进行部署,以获取最新的推送版本的仓库。几个修订版本(实时服务器上没有git pull
)我们如何做一个git pull
,它指向我们想要的较早的提交?ie类似
git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4
#1 楼
提取存储库后,您应该可以进行以下操作:git checkout 3ef0d...
#2 楼
uploadpack.allowReachableSHA1InWant
自Git 2.5.0起,可以在服务器上启用此配置变量,此处GitHub功能请求和GitHub commit启用了此功能。
Bitbucket Server启用了此功能版本5.5+。
用法:
# Make remote with 4 commits, and local with just one.
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)"
# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"
# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true
# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"
评论
现在也有allowAnySHA1InWant,但是这些是安全功能,请确保您了解其中的含义。
– MarcH
19/12/10在18:51
#3 楼
如果活动服务器上的某个进程立即访问刚刚拉出的内容(即拉出后无法使用git checkout 3ef0d
),则应考虑标记要在生产环境中部署的版本,并特别在生产时签出该标记,以便拉取不会立即更改您的工作目录。否则,您可能会冒险有人在拉动之前推动。#4 楼
请注意,git pull
git checkout my-old-commit
现在使您处于DETACHED HEAD状态-实际上,您正在沿着新的提交路径在此存储库中发送将来的提交。
对于部署回购来说,这不是主要问题问题,因为唯一的提交应该是在被拉出之前已经正确提交的提交。
但是,有时检查提交标记(head,tags,remotes)看起来与主仓库相同很有用。要在结帐后解决此问题,请执行以下操作:
git reset
-重新连接头部git fetch
-同步遥控器的标记[这可能取决于git版本-我们的环境仍然是1.7 ...因此可能不再需要YMMV]
评论
很好,效果很好。还注意到,如果我想在以后的提取中恢复同步,则在进行下一个提取时需要指定远程服务器(即git pull server:repo vs常规git pull)
– dlrust
2010-2-26在19:01
也许OP提出了错误的问题,但是对我来说这是正确的问题,这是没有答案。服务器上有一个特定的提交,该提交在本地丢失。提交既不是分支的一部分,也不是标签的一部分,并且不会通过拉/取来进行传输。如何获取特定的提交?
–BlackEye
19年4月30日在9:40