参数详情
--quiet不输出任何文本。-q--quiet的简写。--verbose输出详细文本。分别传递给fetch和merge/rebase命令。-v--verbose的简写。--[no-]recurse-submodules[=yes|on-demand|no]拉取子模块的新提交?(注意这不是拉取/检出的一部分)
与 Git 中的推送不同,推送会将本地更改发送到中央仓库的服务器,而拉取则是将服务器上的当前代码拉取到本地机器。本章解释了如何使用 Git 从仓库拉取代码,以及在拉取代码时可能遇到的情况。
23.1 拉取远程仓库的更改
简单拉取
当你与他人协作远程仓库(例如 GitHub)时,你可能希望将更改推送到远程仓库,以便其他人可以拉取这些更改。
git pull
在大多数情况下,此命令可以完成拉取操作。
从不同的远程仓库或分支拉取
你可以通过指定远程仓库或分支的名称来从不同的远程仓库或分支拉取更改。
git pull origin feature-A
此命令将从 origin 拉取 feature-A 分支到本地分支。注意,你可以直接提供 URL 而不是远程仓库名称,也可以提供对象名称(如提交哈希值)而不是分支名称。
手动拉取
要模拟 git pull 的行为,可以使用 git fetch 然后 git merge。
git fetch origin # 从 origin 拉取对象并更新引用
git merge origin/feature-A # 实际执行合并
这可以给你更多控制权,并允许你在合并之前检查远程分支。事实上,在拉取后,你可以使用 git branch -a 查看远程分支,并使用以下命令检出远程分支:
git checkout -b local-branch-name origin/feature-A # 检出远程分支
检查分支,提交更改,合并,拆分,修改或执行其他操作
git checkout merging-branches # 切换到目标分支
git merge local-branch-name # 执行合并
这在处理拉取请求时非常有用。
23.2 更新本地更改
当存在本地更改时,git pull 命令会中止并报告:
error: Your local changes to the following files would be overwritten by merge
为了更新(类似于 SVN 中的 svn update),可以运行以下命令:
git stash
git pull --rebase
git stash pop
一种方便的方法是使用别名:
版本 < 2.9
git config --global alias.up '!git stash && git pull --rebase && git stash pop'
版本 ≥ 2.9
git config --global alias.up 'pull --rebase --autostash'
然后你可以简单地使用:
git up
23.3 强制拉取本地更改
git fetch
git reset --hard origin/master
注意:使用 reset --hard 丢弃的提交可以通过引用日志和 reset 恢复,但未提交的更改将永久丢失。
如果远程仓库和分支的名称不同,请将 origin 和 master 分别替换为你想要强制拉取的远程仓库和分支名称。
23.4 从远程仓库拉取代码
git pull
23.5 保持线性历史记录
拉取时变基
如果你从远程仓库拉取新的提交,并且当前分支上有本地更改,Git 会自动合并远程版本和你的版本。如果你希望减少分支上的合并数量,可以告诉 Git 在远程分支的版本上变基你的提交。
git pull --rebase
设置默认行为
要将此行为设置为新创建分支的默认行为,运行以下命令:
git config branch.autosetuprebase always
要更改现有分支的行为,使用以下命令:
git config branch.BRANCH_NAME.rebase true
然后运行:
git pull --no-rebase
执行正常的合并拉取。
检查是否可以快速前进
要仅允许本地分支快速前进,可以使用:
git pull --ff-only
当本地分支不可快速前进时,此命令会显示错误,需要对上游执行变基或合并。
23.6 拉取时出现“权限被拒绝”
如果 .git 文件夹的权限设置错误,可能会出现此问题。通过设置 .git 文件夹的所有者来解决此问题。有时,其他用户拉取并更改了 .git 文件夹或文件的权限。
要解决问题,运行以下命令:
chown -R youruser:yourgroup .git/