Git pull不会拉取所有内容

73

我有一台服务器,其中有些设置我不太清楚在哪里,我只是使用git pull命令获取了GitHub存储库中的内容,然后重新启动以进行部署。

问题是,有一个提交记录不是我的最新版本,它并没有真正存在于我的服务器上。这些文件没有被添加到.gitignore文件中。如何确保git pull拉取了该提交记录?

我真的不知道如何解决它,正在考虑重启服务器 :(

14:41][root@someserver] someserver_dir (master)$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   Gemfile
#   modified:   Gemfile.lock
#   modified:   config/assets.yml
#   modified:   config/database.yml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   randomfiles

更多的信息将有助于回答你的问题。git status 显示了什么?你是否在本地正确的分支上?例如,如果你正在服务器上查看 master 分支,那么你是否在本地检出了 master 分支?git log origin/master..master 呢? - Adam Monsen
这个 Git 仓库是公开的吗?如果是,能提供一个 URL 吗? - Adam Monsen
不公开,git 状态显示一切正常,只有一个分支。 - thiagofm
我已经尝试重新提交更改,神奇的是,当我拉取时,什么也没有发生(已经是最新的)。 - thiagofm
谢谢。您能否也包括 git config --list 命令的输出? - Adam Monsen
显示剩余2条评论
4个回答

206

如果你希望你的服务器版本始终反映存储库中的提交,则最好使用 git reset 而不是 git pull - 这样你就不会调用合并功能,而是将所有文件设置为与你重置到的提交中完全相同。例如:

git fetch origin master
git reset --hard FETCH_HEAD

12
我经常忘记这个命令,所以我不断回到这个帖子。只想补充一下,如果你想从特定分支获取所有内容,将“master”更改为任何其他分支名称也同样有效。 - mdegges
2
你可以重置到特定的分支,所以 git reset --hard origin/master 也可以工作,同样适用于你指定的任何分支。(很有趣看到我5年前问这个问题,我记得当时我在管理一些使用git部署的远程服务器,最终陷入了糟糕的状态..哈哈) - thiagofm
文件恢复后与原始文件相同,但是我收到了“致命错误:无法将索引文件重置为版本'FETCH_HEAD'。” 我需要做什么? - Sadee
拯救了我的一天!!! 已经苦苦挣扎了相当长一段时间,一直弄不明白为什么我无法从origin master中拉取最新的更改到全新的分支中。 - pr1nc3
1
太棒了,它起作用了。我尝试了 git fetch origin <branchname> 然后是 git reset --hard FETCH_HEAD。这个分支在 github.com 上可见,但在我的本地上却没有出现,即使尝试了很多次 git pull - paul
现在执行 git fetch origin main - dclipca

13
你可以使用git pull origin branch_name
例如:如果我在GitHub上有一个生产分支,那么我会写git pull origin production,这将给我所有最新的提交。
有时候只执行git pull并不能获取到生产分支的最新提交,即使你正在该分支上工作并提交代码。
幕后工作。

http://git-scm.com/docs/git-pull#_default_behaviour

解释和例子


2
这对我有用。如果能更好地解释一下为什么会更好。 - Vendetta V
我已经添加了文档以及其他人的答案链接,以便更好地理解。@VendettaV - 感谢您指出。 - invinciblemuffi

4

尝试使用以下命令清理本地仓库,然后运行git pull:

$ git gc --prune=now
$ git remote prune origin

2
检查您的分支是否正在跟踪正确的最新提交。使用git branch -avv进行检查。
如果确实没有跟踪正确的提交,请使用git reset --hard [commit hash]来强制重置FETCH_HEAD。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接