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


56

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

但是,如果我们已经提交并推送了一些修订版本(git pull在实时服务器上没有),那么我们该怎么做git pull呢?它指的是我们想要的较早的提交?

即像 git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

Answers:


64

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

git checkout 3ef0d...

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

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

8

uploadpack.allowReachableSHA1InWant

由于Git 2.5.0可以在服务器上启用此配置变量,因此GitHub功能请求GitHub提交启用了此功能

从5.5+版本开始,Bitbucket Server启用了它

用法:

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

2

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


1

请注意,git pull git checkout my-old-commit 现在a 使您处于DETACHED HEAD状态-实际上,您是沿着新的提交路径在此存储库中发送将来的提交。对于部署回购来说,这不是主要问题,因为唯一的提交应该是在被拉取之前已经正确提交的提交。

但是,有时检查提交标记(head,tags,remotes)看起来与主仓库相同是有用的。要在结帐后解决此问题,请执行以下操作: git reset -重新连接头部 git fetch -同步遥控器的标记[这可能取决于git版本-我们的环境仍然是1.7 ...因此可能不再需要YMMV]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.