Skip to content

推送与拉取

概述

推送(Push)和拉取(Pull)是 Git 远程协作中最常用的操作,它们实现了本地仓库与远程仓库之间的代码同步。理解这些操作的工作原理对于团队协作至关重要。

git push 推送

基本语法

bash
git push <remote> <branch>

推送到远程仓库

推送当前分支到 origin:

bash
git push origin main

首次推送并设置上游分支

bash
git push -u origin main

或使用完整语法:

bash
git push --set-upstream origin main

设置上游后,后续可直接使用:

bash
git push

推送所有分支

bash
git push --all origin

强制推送

警告

强制推送会覆盖远程历史,谨慎使用!

bash
git push --force origin main

更安全的强制推送(推荐):

bash
git push --force-with-lease origin main

推送标签

推送单个标签:

bash
git push origin v1.0.0

推送所有标签:

bash
git push --tags origin

删除远程分支

bash
git push origin --delete feature-branch

git pull 拉取

基本语法

bash
git pull <remote> <branch>

拉取远程更新

bash
git pull origin main

如果已设置上游分支:

bash
git pull

git pull 的工作原理

git pull 实际上是两个命令的组合:

bash
git fetch origin
git merge origin/main

使用变基模式拉取

bash
git pull --rebase origin main

这等同于:

bash
git fetch origin
git rebase origin/main

拉取时指定合并策略

bash
git pull -s recursive -X theirs origin main

git fetch 获取

基本语法

bash
git fetch <remote>

获取所有远程更新

bash
git fetch origin

获取所有远程仓库的更新

bash
git fetch --all

获取特定分支

bash
git fetch origin main

fetch 的工作原理

git fetch 只下载远程数据,不会自动合并:

bash
git fetch origin

查看获取的更新:

bash
git log HEAD..origin/main

合并获取的更新:

bash
git merge origin/main

清理远程已删除的分支引用

bash
git fetch --prune origin

或简写:

bash
git fetch -p origin

push/pull/fetch 区别

操作对比

命令方向是否自动合并使用场景
git push本地 → 远程推送本地提交
git pull远程 → 本地快速同步更新
git fetch远程 → 本地安全检查更新

工作流程对比

git pull 流程

远程仓库 → 下载更新 → 自动合并 → 本地仓库

git fetch + merge 流程

远程仓库 → 下载更新 → 检查变更 → 手动合并 → 本地仓库

何时使用哪个命令

使用 git push

  • 完成本地开发后推送代码
  • 分享你的提交给团队

使用 git pull

  • 快速同步远程更新
  • 确定不会有冲突时

使用 git fetch

  • 想先查看远程变更再决定是否合并
  • 需要精确控制合并过程
  • 多人协作时更安全的做法

推荐工作流程

安全的同步流程:

bash
git fetch origin
git status
git log HEAD..origin/main
git merge origin/main

或使用变基:

bash
git fetch origin
git rebase origin/main

实战示例

场景一:首次推送新仓库

bash
git init
git add .
git commit -m "Initial commit"
git remote add origin git@github.com:user/repo.git
git push -u origin main

场景二:团队协作日常同步

bash
git fetch origin
git status
git pull --rebase origin main
git push origin main

场景三:解决推送冲突

当推送被拒绝时:

bash
git push origin main

输出:

! [rejected]        main -> main (non-fast-forward)

解决方法:

bash
git fetch origin
git rebase origin/main
git push origin main

场景四:多人协作同一分支

bash
git fetch origin
git rebase origin/feature-branch
git push origin feature-branch

最佳实践

推送前先拉取

bash
git pull --rebase
git push

使用 --force-with-lease 替代 --force

bash
git push --force-with-lease origin main

定期清理远程引用

bash
git fetch --prune

使用变基保持历史整洁

bash
git pull --rebase origin main

常见问题

推送被拒绝(non-fast-forward)

原因:远程有新的提交。

解决:

bash
git fetch origin
git rebase origin/main
git push origin main

拉取时产生不必要的合并提交

使用变基模式:

bash
git pull --rebase origin main

配置默认使用变基:

bash
git config pull.rebase true

如何撤销已推送的提交

bash
git revert HEAD
git push origin main

总结

  • git push 将本地提交推送到远程仓库
  • git pull 拉取并自动合并远程更新
  • git fetch 只下载远程数据,更安全可控
  • 推荐先 fetch 再 merge/rebase,最后 push
  • 使用 --force-with-lease 替代 --force