01. remote——跟远程仓库交互
remote 是 Git 里对远程仓库的引用。clone 下来的仓库自动有一个叫 origin 的远程。
git remote -v——看当前配置了哪些远程仓库及其 URL。通常 origin 指向你的仓库。
git remote add 名字 URL——添加新的远程仓库(比如 upstream 指向原仓库,方便同步别人的更新)。
git remote remove——删除不再需要的远程。
git remote rename——改名字。
git remote show 名字——查看远程仓库的详细信息(分支、fetch/push URL)。
bash
# 查看远程
git remote -v
# 添加上游仓库
git remote add upstream https://github.com/original/repo.git
# 从上游同步
git fetch upstream
git merge upstream/main
# 查看远程详细信息
git remote show origin
# 改 URL
git remote set-url origin [email protected]:user/new-repo.git
# 删除远程
git remote remove upstreamFork 了别人的项目,先把原项目加为 upstream。定期 git fetch upstream && git merge upstream/main 跟上原项目的更新。
02. fetch、pull、push——数据同步三件套
fetch、pull、push 是跟远程仓库同步的三个核心命令:
git fetch origin——从远程下载所有你本地没有的数据(新的分支、新的 commit),但不自动合并到你的代码里。只拉数据不看代码,安全操作。
git pull——fetch + merge 二合一。把远程的更新拉下来并合并到当前分支。相当于自动执行了 fetch 再 merge。如果有冲突会提示你手动解决。
git pull --rebase——fetch + rebase 二合一。拉下远程的更新然后用 rebase 方式整合(你的本地提交移到远程更新之后)。历史更线型好看但解决冲突步骤不同。
git push origin branch——把本地的 commit 推到远程。如果远程有了你本地没有的更新(别人推了新的),push 会被拒绝,需要先 pull。
bash
# fetch——安全拉数据不合并
git fetch origin
git fetch --all # 拉所有远程
# pull——拉数据+合并
git pull origin main
git pull --rebase # 用 rebase 方式整合
# push——推本地到远程
git push origin main
git push -u origin feature # 首次推送设置跟踪
git push --force-with-lease # 安全的强制推送git pull --rebase 比默认的 git pull 产生的历史更干净,推荐。如果 rebase 过程中有冲突,解决后 git rebase --continue。
03. Pull Request / Merge Request 流程
PR(Pull Request,GitHub 叫法)或 MR(Merge Request,GitLab 叫法)是现代团队协作的标准流程:
1. 从主分支创建一个 feature 分支
git checkout -b feature/new-login
2. 开发、commit、push 到远程
git push origin feature/new-login
3. 在 GitHub/GitLab 上创建 PR/MR——描述你做了什么、为什么这样做。
4. 同事 Code Review——在 PR 页面逐行看代码、提意见、讨论。
5. 修改代码、push 追加 commit。PR 自动更新。
6. Review 通过后合并到主分支——可以选择 merge commit、squash merge(合并所有 commit 为一个)、或 rebase merge。
bash
# PR 工作流
git checkout -b feature/new-feature
# ... 写代码 ...
git add .
git commit -m "feat: add new feature"
git push -u origin feature/new-feature
# 去 GitHub 创建 PR
# PR review 后修改
git add .
git commit -m "fix: review feedback"
git push
# PR 自动更新,不需要重新创建
# 合并后清理本地
git checkout main
git pull origin main
git branch -d feature/new-featurePR 提交前先 git fetch origin main && git merge origin/main 解决掉可能的冲突,这样 PR 里只有你自己的改动,review 更清爽。
04. fork 与 upstream——给开源项目贡献代码
给别人项目贡献代码的标准流程:
1. Fork——在 GitHub 上点 Fork 按钮,把别人的仓库复制到你自己的账号下。
2. Clone——把你 fork 的仓库 clone 到本地。
3. 添加上游——git remote add upstream 原始仓库地址。注意区分 origin(你的 fork)和 upstream(原仓库)。
4. 创建分支、改代码、commit、push 到你自己的 fork。
5. 在你的 fork 里创建 Pull Request,目标指向原仓库。
6. 维护同步——定期 git fetch upstream && git merge upstream/main,保持你的 fork 跟原仓库同步。
bash
# Fork 工作流
git clone https://github.com/your-user/project.git
git remote add upstream https://github.com/original/project.git
# 保持同步
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
# 在同步后的基础上创建新功能分支
git checkout -b feature/my-contribution
# 改代码 commit push
git push origin feature/my-contribution
# 去 GitHub 从 your-user/project 向 original/project 创建 PR05. 冲突解决
当两个人改了同一个文件的同一行,Git 不知道用谁的——这就产生了冲突。冲突不是 Bug,是正常的工作流程。
冲突的标志:Git 在文件里插入 <<<<<<<、=======、>>>>>>> 标记,标记之间分别是你改的和别人改的内容。
解决冲突的步骤:
1. 打开冲突文件,找到标记位置
2. 决定保留哪个版本——保留你的、保留别人的、或者合并两者
3. 删除冲突标记(<<<<<<、=======、>>>>>>>)
4. git add 标记为已解决
5. git commit 完成合并(merge 的 commit message 已经有模板)
合并工具:vscode 自带冲突解决界面很直观;命令行可以用 git mergetool(会打开配置的可视化合并工具)。
bash
# merge 时发生冲突
git merge feature
# CONFLICT: Merge conflict in file.txt
# 查看哪些文件有冲突
git status
# 解决后标记
git add file.txt
# 完成合并
git commit
# 放弃本次合并退回安全区
git merge --abort
# 用 vscode 打开冲突文件更直观冲突解决完别忘了删掉标记符号(<<<<<<、======、>>>>>>)。不删的话代码不但跑不起来,提交上去也尴尬。
知识测验
第 1/5 题正确 0
git fetch 和 git pull 的区别?
下一节
下一节 Git Hooks