一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 11 天,点击查看活动详情。
一、Git 操作的基本结构
- 工作区(Workspace):基本文件的存放区(开发位置)
- 暂存区(Index/Stage):基本文件添加到暂存区后才会被 Git 管理(提交、更新)
- 本地仓库(Repository):本地的文件管理区域,提交代码或者更新代码的位置
- 远程代码托管中心(Remote):联合开发时,统一的文件联网管理中心
- 关系图:
二、个人开发时 git 的使用
注册 github 或者码云账号(官网注册即可)
Git 官方下载地址(windows 版):Git - Downloading Package
为仓库生成和添加 SSH 公钥
详细可访问:生成/添加 SSH 公钥 - Gitee.com
Git 全局设置
直接进入命令行工具(如 cmd)中执行
git config --global user.name "用户名"
git config --global user.email "邮箱地址"
新建仓库
注:按顺序执行以下所有命令
1. 在命令行工具(git 或者 cmd 或者 powershell)建立 git 仓库
mkdir vue_shop -- 建立 vue_shop 文件夹
cd vue_shop -- 进入 vue_shop 文件根目录
git init -- 初始化 git 仓库
touch README.md -- 添加 readme 说明
git add README.md -- 把 readme 说明添加到暂存区
git commit -m "第一次提交" -- 把暂存区的文件推送到本地仓库
git remote add origin 新建仓库的 SSH 地址 -- 将本地仓库与 git 仓库进行关联
git push -u origin master -- 将本地仓库主分支推送到 git 仓库
建议在 github 或者码云中直接新建仓库
2. 如果已有仓库
cd existing_git_repo -- 此处可以直接进入项目根目录, 右键进入命令行工具(git 或者 cmd 或者 powershell)
git remote add origin 已有仓库的 SSH 地址
git push -u origin master -- 将本地仓库主分支推送到 git 仓库
在项目中开发新模块前
此时也可以直接在 vscode 中的终端进行,记得先点击+号新建终端
以下粗体命令为必需命令,黑色命令为协助检查命令,以防错误
在当前项目下
-
git status -- 查看当前工作区状态(查看工作区是否干净)
-
git branch -- 查看当前是否在
master主分支 -
git checkout -b login -- 创建新子分支
login,并切换到login分支 -
git branch -- 查看当前是否在
login子分支 -
git push -u origin login -- 将本地子分支
login推送到git仓库(使git仓库中也有login这个分支),第一次推送不能直接用 git push
项目新模块开发完成后
此时可以直接在 vscode 中的终端进行,记得先点击+号新建终端
-
git status -- 查看当前工作区状态(查看工作区内修改和新增的文件,这些文件状态都为红色,以及当前是否在 login 子分支)
-
git add . --- 将所有修改和新增的文件都添加到暂存区
-
git status -- 查看当前工作区状态(文件是否已全部添加,添加的文字状态都为绿色)
-
git commit -m "文本信息" -- 把暂存区中的所有文件提交到本地仓库,并添加注释信息(注:此时只是将本地仓库的代码进行了更新,还需要将
git仓库的代码进行同步更新) -
git branch -- 查看当前所在分支,即
login子分支(提交的文件都被提交到login子分支) -
git push -- 将本地更新的
login分支推送到git仓库中的login分支(git中已有login分支,非第一次推送login,直接 git push 即可)
注:以下是对本地仓库的操作
-
git checkout master -- 切换到
master主分支(从login子分支切换到master主分支) -
git branch -- 查看当前所在分支(是否在
master主分支) -
git merge login -- 基于
master主分支,将login子分支的文件全部合并到master主分支
注:此时只是将本地仓库的代码进行了更新,还需要将git仓库的代码进行同步更新
-
git branch -- 查看当前所在分支(是否在
master主分支) -
git push -- 将本地更新的
master推送到git仓库中(更新git中的master)
如果你对以上步骤不太清晰,请按顺序记住加粗的命令即可正确完成项目在 git 仓库中的更新。你也可以仔细阅读下面更详细的内容,方便你对 git 的理解。
三、Git 的常用命令
本地库的操作
新建 Git 管理库
- git init:在当前目录创建一个
Git代码库 - git init [project-name]:新建一个目录,将其初始化为
Git代码库
签名配置
签名是 git 提交代码时的用户标识
-
用户签名:git config user.name “[name]” 、 git config user.email “[email address]” 案例:git config user.name “xxxx”、git config user.email “xxx@qq.com”
-
系统签名:git config --global user.name “[name]” 、git config --global user.email “[email address]”
注意: Git 会采用就近原则,如果设置了用户签名就会覆盖系统签名
查看信息
- git status:显示当前 git 库所有有变量的文件(查看管理库的当前状态)
暂存区的操作
- git add [file1] [file2]:将工作区新增/修改的文件添加到暂存区
- git add .:将当前目录下的所有文件添加到暂存区
- git reset [file]:撤销暂存区的文件,工作区不变
- git commit -m “备注” [file]:将暂存区的内容提交到本地库
历史记录的操作
查看:
- git log:显示当前本地库的历史提交记录
- git log --pretty=oneline:以单行的方式简化显示本地库的历史提交记录
- git log --oneline:以更简化的 hash 值显示本地库提交的历史记录
- git reflog:显示当前历史版本的全部操作过程
版本的选择:
- git reset --hard [版本的哈希索引值]:表示当前版本设置为指定的某个历史版本
- git reset --hard HEAD^: 表示当前的版本后退一步,n 个^表示后退 n 歩
- git reset --hard HEAD~n:指定后退 n 歩
找回删除的文件
- 删除的文件的操作已经提交的本地库:通过指定历史未删除的版本找回
- 删除文件的操作未提交到本地库:git checkout [file]
文件差异比较
- git diff [file]:将工作区的文件和暂存区的文件进行比较
- git diff [hash 索引值] [file]:将本地库的某个历史版本和工作区的文件进行比较
- git diff:将工作区和本地库的所有文件进行比较
分支的处理
什么是分支?
分支就是在当前的版本控制的主线上,复制一份出来,形成一个支线,所有的代码管理都可以对这个支线进行操作。对支线的操作不会对主线造成任何影响。这条支线就是所谓的分支。
分支的应用场景
在项目开发过程中,可能会需要开发一些周期比较长并且不急于上线的功能,如果直接在当前的主线上进行版本控制,可能会对当前主线的代码造成污染,但是从代码的安全性角度来说,又不能不进行版本管理,这个时候就可以考虑分支进行开发。
分支的操作
- git branch -v:查看当前的分支情况
- git branch [分支名]:创建分支
- git checkout [分支名]:切换分支
- git push origin --delete [分支名]:删除远程分支(需要将分支切换到
master才能删除其他子分支)
注意:切换分支的时候,工作区中没有提交到本地库的文件会继续保留,被提交到工作区的文件有可能会消失
- git merge [有新内容的分支名]:合并分支
注意:合并分支的时候,需要定位到被合并的分支上,然后再执行merge命令将有新内容的分支合并过来。
比如:需要将分支 1 合并到主分支上,先要通过 git checkout [主分支] 的命令定位到主分支,再执行 git merge [分支 1]的命令进行合并
冲突的解决:
如果主干和分支都修改了某个文件的相同的位置,就会发生所谓的冲突,这个时候需要进行冲突的解决:
- 找到冲突的文件进行编辑
- 按照具体的业务需求修改成合适的情况
- git add 添加修改后的文件到暂存区
- git commit 命令提交修改后的文件到本地库
- git branch --merged:查询哪些分支合并入当前分支
- git branch --no-merged:查询没有和当前分支合并过的其他分支
- git branch -d [分支名]:删除分支
注意:如果该分支没有合并到主分支,则会删除失败,需要通过 git branch -D [分支名] 的方式强制删除
远程库的操作
- git remote -v:显示所有远程仓库
- git remote add [alias] [url]:新增一个远程仓库
- git push [alias] [分支名]:将指定分支推送到远程仓库上
- git push [alias] --all:推送所有分支到远程库
- git clone [url]:克隆远程仓库的文件到本地库,并且初始化本地库
- git pull [alias] [分支名]:将远程仓库上的变动拉取到本地库并且合并
拉取项目中的某一个文件
下面以克隆开源项目druid 下的/druid/doc 目录为例
mkdir druid
cd druid
git init // 初始化空仓库
git remote add -f origin <https://github.com/alibaba/druid.git> // 关联远程地址 ,这一步不要终止执行,不然下面操作无效
git config core.sparsecheckout true // 开启 Sparse Checkout 模式
echo "doc" >> .git/info/sparse-checkout // 设置需 Check Out 的文件。直接从项目目录下开始
git pull origin master // Check Out
Clone 项目后与另一个仓库关联
- git remote rm origin -- 取消项目与当前仓库的远程链接
- git remote add origin xxxxx -- 建立项目与目标仓库的远程链接
- git push -u origin master -- 将项目推送到目标仓库
拉取目标仓库中项目的部分文件
- mkdir project -- 创建新文件夹
- cd project -- 进入该文件夹
- git init -- 初始化 git 本地仓库
- git remote add -f origin -- 将远程 git 仓库与本地仓库关联
- git config core.sparsecheckout true -- 开启 Sparse Checkout 模式
- 选择需要 clone 的文件,作为列表保存到 .git/info/sparse-checkout 中
- git pull origin master -- 从分支中拉取需要的文件
补充第 6 步:
echo “test.txt” >> .git/info/sparse-checkout
echo “test/test1” >> .git/info/sparse-checkout
echo “test” >> .git/info/sparse-checkout
fork 和 clone,fetch 和 pull 的区别
PR 操作