我们通常有一个远程git仓库,通常通过在开发服务器上使用git push进行部署,然后在活动服务器上使用git pull进行部署,以获取最新的推送版本的仓库。几个修订版本(实时服务器上没有git pull)我们如何做一个git pull,它指向我们想要的较早的提交?

ie类似git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

#1 楼

提取存储库后,您应该可以进行以下操作:

git checkout 3ef0d...


评论


很好,效果很好。还注意到,如果我想在以后的提取中恢复同步,则在进行下一个提取时需要指定远程服务器(即git pull server:repo vs常规git pull)

– dlrust
2010-2-26在19:01

也许OP提出了错误的问题,但是对我来说这是正确的问题,这是没有答案。服务器上有一个特定的提交,该提交在本地丢失。提交既不是分支的一部分,也不是标签的一部分,并且不会通过拉/取来进行传输。如何获取特定的提交?

–BlackEye
19年4月30日在9:40

#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]