概念
- 工作区 : 在本地实际进行文件操作的目录 .
- 暂存区 : 类似于缓冲区 , 用于记录准备进行下一次提交的内容 .
- 本地仓库 : 储存在本地的完整版本库 , 包含项目的提交历史 , 分支信息和标签等 .
- 远程仓库 : 部署在远程服务器的版本库 , 通常用于协作开发 .
文件状态
Untracked
未追踪 : 新创建或移动复制到本项目目录的文件 , 在未执行暂存命令前 , 文件处于未追踪状态 .Committed
已提交 : 将已暂存文件进行提交后的文件 , 已安全保存在本地仓库 , 文件的内容被记录为一次提交对象 .Modified
已修改 : 对工作区已提交文件进行更改后的文件 , 更改尚未保存到本地仓库 .Staged
已暂存 : 对工作区已修改文件或未追踪文件进行标记后的文件 , 文件被添加到暂存区 .
分支
分支是指向提交版本的可变指针 , 提交版本操作时 , 当前分支的指针会跟随指向新的提交版本 .
- 增加分支 :
- 仅创建 :
git branch <分支名>
- 创建并切换 :
git checkout -b <分支名>
- 仅创建 :
- 切换分支 :
git checkout <分支名>
- 合并分支 :
git merge <分支名>
合并指定分支到当前分支 .
如果两个分支对同一文件的同一部分进行了不同修改 , 即会发生合并冲突 , 此时需要手动处理冲突文件 . 可以通过git status
查看冲突文件 , 编辑完成后重新将文件放入暂存区后提交完成合并 . - 查看分支 :
git branch
- 删除分支 :
- 检查删除 :
git branch -d <待删除的分支名>
- 强制删除 :
git branch -D <待删除的分支名>
- 检查删除 :
控制台命令
本地仓库 - 暂存区 - 工作区
- 在当前项目目录初始化
git
仓库 :git init
- 将已修改文件提交到暂存区 :
- 单文件 :
git add <文件路径或文件名>
- 多文件 :
git add <文件路径或文件名1> <文件路径或文件名2> ...
- 特征文件 :
git add *.txt
将当前目录所有以.txt
结尾的文件添加到暂存区 . - 全部文件 :
git add *
- 单文件 :
- 将已暂存文件提交到本地仓库 :
- 单行备注 :
git commit -m "备注"
- 多行备注 :
git commit
进入文本编辑器进行备注编辑
如果文本编辑器是Vim
,Esc
+:wp
用于保存备注并返回至Git Bash
- 直接提交 :
git commit -a -m "备注"
跳过缓冲区将所有非未追踪文件的修改提交到本地仓库 . - 追加提交 :
git commit --amend -m "新备注"
将更改直接追加到上一次提交并更新备注 ( 谨慎使用 ) .
- 单行备注 :
- 查看提交历史记录 :
git log
- 将历史提交恢复到工作区 :
git checkout <提交哈希值> -- <期望恢复的文件>
分支指向提交版本 , 切换分支时也使用git checkout <分支名>
命令 , 同时工作区的文件会更新至新分支指向的提交版本 . 切换到新分支时 , 新分支需要存在 , 可以使用git checkout -b <新分支>
创建新分支并切换至改分支 , 创建新分支时新分支会指向当前分支所指向的提交版本 .
全局恢复 :git checkout <提交哈希值>
远程仓库 - 本地仓库 - 工作区
- 关联远程仓库 : 如果本地仓库不是通过克隆创建的 :
git remote add <远程仓库名(通常为origin)> <远程仓库地址>
- 如何使用克隆创建本地仓库 ?
git clone <远程仓库地址>
- 如果本地仓库是使用克隆创建的 ? 在克隆过程中 , 本地仓库会自动与远程仓库进行关联 , 不需要重新关联远程仓库 .
- 远程仓库的地址类型有 ?
HTTPS
和SSH
. - 一个本地仓库可以关联多个远程仓库 .
- 如何使用克隆创建本地仓库 ?
- 查看远程仓库信息 :
git remote -v
查看远程仓库的名称和对应的URL
. - 拉取远程仓库的版本 :
git pull <远程仓库名> <远程分支名>
拉取版本相当于合并分支 , 同样具有合并冲突 , 手动解决冲突后暂存+提交来完成合并 . - 推送本地提交到远程仓库 :
git push <远程仓库名> <本地分支名>:<远程分支名>
若本地分支名和远程分支名相同可简化为git push <远程仓库名> <共同分支名>
.
首次推送本地分支到远程仓库的同名分支时 , 可使用git push -u <远程仓库名> <共同分支名>
关联本地和远程 , 后续推送仅使用git push
即可 . - 查看远程提交记录 :
git log <远程仓库名>/<远程分支名>
协作开发
- 拉取克隆仓库
git clone
拉取该分支所指向的版本 , 远程仓库关于该分支的提交历史 , 与该分支相关的其他分支 . 在提交时git
首先会检查远程仓库和本地仓库关于当前分支 ( 不一定是拉取分支 ) 的提交历史是否一致 , 不一致则拒绝提交 . - 2.1 创建任务分支
git checkout -b <你负责的分支>
2.2 查看提交差异git diff
- 如果远程有更新 :
3.1 切换回有更新的分支git checkout <分支名>
3.2 拉取远端更新git pull origin <分支名>
3.3 切换回任务分支git checkout <你负责的分支>
- 远程同步三步法的简化 :
4.1 当前处于任务分支 .
4.2 使用变基命令git rebase <分支名>
将更新的分支直接同步到本地仓库
可能出现合并冲突 ! 需要手动处理冲突部分 . - 远程提交冲突 :
两人负责同一分支 , 一人先提交到远程仓库 , 另一个人再提交可能会发生提交被拒绝的情况 , 提交时git
会检查远程分支是否存在新的提交 , 如果本地的提交历史和远程分支不一致 , 提交会被拒绝 . 另一个人需要将远程分支的更新拉取到本地 , 解决合并冲突后再推送到远程分支 .
远程拉取命令区别
git clone
: 用于把远程仓库完整拉取到本地 , 会复制远程仓库中所有文件和版本历史 , 自动创建一个指向远程仓库的默认分支origin
.git fetch
: 用于获取远程仓库的最新更新 , 而不合并到当前分支 . 后续需手动合并或变基 .
变基原理
- 确认任务分支和远程仓库分支的共同祖先提交 ( 分叉点 ) .
- 提取远程任务分支从分叉点之后的所有提交 , 并将他们保存到一个临时区域 .
- 移动任务分支指向远程仓库分支的最新提交上 .
- 将临时区域保存的提交应用到最新提交上 .
此时有可能出现提交冲突 : 远程分支最新提交的文件和临时区域的版本有冲突 , 需要手动更改提交 .