Git 环境配置
Git 简介
- Git 是目前世界上最先进的分布式版本控制系统。
- Git 优点:
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
Git 安装
- 官网下载地址:Git - Downloads
- Windows:
- 点击下载好的安装包安装软件。
- 默认安装即可。
- MacOS:
brew install git
Git 环境验证
- Windows:
- cmd 中输入命令
git --version
。
- cmd 中输入命令
- MacOS:
- 终端中输入命令
git --version
。
- 终端中输入命令
Windows 打开 GitBash
- 点击鼠标右键。
- 开始菜单。
Git 工作流程
Git 基本概念
- 文件状态
- 未跟踪(Untracked)
- 未修改(Unmodified)
- 已修改(Modified)
- 暂存区(Staged)
- 三个工作区域
- 工作区(Working Directory)
- 暂存区(Staging Area)
- 仓库区(Repository)
- 工作树(Worktree)
@startuml
scale 4
participant 未跟踪 as Ut
participant 暂存区 as S
participant 未修改 as Um
participant 已修改 as M
Ut -> S: 添加到暂存区
Um -> M: 编辑文件
M -> S: 添加到暂存区
S -> Ut: 移出暂存区
@enduml
Git 工作流程
@startuml
scale 3
participant 工作区 as work
participant 暂存区 as stage
participant "仓库区(本地)" as rep
participant "仓库区(远程)" as github
group 工作区
work -> stage: 添加、修改:git add 文件或目录
work <- stage: 删除: git rm 文件
work <- stage: 恢复内容: git checkout 文件
end group
group 版本库
stage -> rep: 保存一小段的工作内容: git commit -m "备注"
rep -> stage: 回退到某个记录中: git reset 版本号
end group
group 服务器
rep -> github: 同步本地仓库到服务器: git push
github -> rep: 同步服务器到本地仓库: git pull
end group
@enduml
Git 常用命令
基于 Git 的远程仓库
远程仓库 | 地址 | 备注 |
---|---|---|
GitHub | https://github.com/ | 世界上最主流的远程开源仓库。 |
Gitee | https://gitee.com/ | 国内目前比较主流的开源仓库,也可以私有化部署。 |
(推荐) | ||
GitLab | https://gitlab.com/ | 私有化部署,企业使用较多。 |
Git 远程仓库的应用场景
- 获取远程仓库代码:开源代码、项目代码。
- 项目协作:维护自己的代码、多人维护同一项目。
Git 同步命令
克隆远程仓库
- 命令:
git clone <url>
远程连接方式 | 特点 |
---|---|
HTTPS 连接 | 使用给定 URL 即可 clone,在 push 时验证用户名和密码。 |
SSH 连接 | 需要提前添加 SSH Key,在 push 时不需要输入用户名,配置 SSH 时设置了密码才需要输入密码。 |
HTTPS 连接
- 配置全局帐号:
- 配置用户名:
git config --global user.name "your name"
- 配置邮箱:
git config --global user.email "your_email@youremail.com"
- 配置用户名:
- 验证配置结果:
git config --global --list
SSH 连接
- 生成 SSH Key:
ssh-keygen -t rsa -C "your_email@youremail.com"
- 连敲三次回车键。
- 到对应目录下找生成的公钥和密钥。
拉取远程仓库
- 拉取远程仓库到本地:
git pull
localhost@ git_demo % git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From gitee.com:xxxx/git_demo
3c18462..9e58263 master -> origin/master
Updating 3c18462..9e58263
Fast-forward
README.md | 2 ++
1 file changed, 2 insertions(+)
初始化仓库
- 在已存在的目录中初始化仓库:
git init
- 关联远程仓库:
git remote add origin <url>
784f439064aa@ git_demo % git init
Initialized empty Git repository in /Users/mac/git_demo/.git/
localhost@ git_demo % git remote add origin git@gitee.com:feier-hogwarts/git_demo.git
localhost@ git_demo % git pull --allow-unrelated-histories origin master
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 17 (delta 3), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (17/17), done.
From gitee.com:feier-hogwarts/git_demo
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
Git 修改命令
跟踪新文件
- 添加文件或目录到暂存区:
git add <file>/<directory>
# 跟踪某个文件
784f439064aa@ git_demo % git add new_file.txt
# 跟踪当前目录下所有文件
784f439064aa@ git_demo % git add .
提交更新
- 提交到本地仓库:
git commit -m "comments"
- 已修改文件跳过使用暂存区域:
git commit -a -m "comments"
784f439064aa@ git_demo % git commit -m "first upload"
[master (root-commit) 9868463] first upload
1 file changed, 3 insertions(+)
create mode 100644 readme.txt
784f439064aa@ git_demo % git commit -a -m "跳过使用暂存区"
[master 2fee19e] 跳过使用暂存区
1 file changed, 2 insertions(+)
推送到远程仓库
- 推送本地仓库到远程仓库:
git push
localhost@ git_demo % git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 325 bytes | 325.00 KiB/s, done.
Total 3 (delta 1), reused 2 (delta 1)
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:feier-hogwarts/git_demo.git
a1cbb3a..3c18462 master -> master
Git 常用调试命令
检查当前文件状态
- 查看文件状态:
git status
784f439064aa@ git_demo % git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: readme.txt
查看已暂存和未暂存的修改
- 比较当前文件和暂存区域快照之间的差异:
git diff
- 查看已暂存的将要添加到下次提交里的内容:
git diff --staged
784f439064aa@ git_demo % git diff
diff --git a/readme.txt b/readme.txt
index f971b3a..bfa1ab8 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3,3 +3,5 @@
update1
update2
+
+update3
784f439064aa@ git_demo % git diff --staged
diff --git a/new_file.txt b/new_file.txt
new file mode 100644
index 0000000..c855c19
--- /dev/null
+++ b/new_file.txt
@@ -0,0 +1 @@
+987655
撤销操作
- 撤销对文件的修改:
git checkout <file>
- 取消暂存:
git reset HEAD <file>
784f439064aa@ git_demo % cat readme.txt
1234
update1
update2
update3
784f439064aa@ git_demo % git checkout readme.txt
784f439064aa@ git_demo % cat readme.txt
1234
update1
update2
784f439064aa@ git_demo % git reset HEAD file.txt
784f439064aa@ git_demo % git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
file.txt
nothing added to commit but untracked files present (use "git add" to track)
移除文件
- 删除文件:
git rm -f <file>
- 移出暂存区:
git rm --cached <file>
784f439064aa@ git_demo % git rm -f file.txt
rm 'file.txt'
784f439064aa@ git_demo % git rm --cached file.txt
rm 'file.txt'
忽略文件
-
.gitignore
文件。 - 有些文件无需纳入 Git 的管理。
- 比如日志文件,或者编译过程中创建的临时文件。
作业:创建本地仓库
创建本地仓库-命令行:
1、
2、初始化创建git仓库命令: git init
创建完成之后产生隐藏.git文件夹,证明初始化仓库完成
GitLab 实战
GitLab 帐号
- 申请账号。
- 申请权限。
配置公钥
- 找到 id_rsa.pub,复制内容。
- GitLab → 我的头像 → Prefereces。
- SSH keys。
- 粘贴公钥,点击 add key。
GitLab 创建项目
- 点击 New project 按钮。
- 选择项目类型,点击 Create blank project 从空项目开始创建。
GitLab 实战
- 克隆项目到本地。
- 添加内容。
- 提交内容。
- 更新本地项目。
# 克隆项目到本地
git clone xxx
# 添加内容
git add .
# 提交内容
git push
# 更新本地项目
git pull
GitHub 实战
GitHub 注册帐号
- 官网:https://github.com。
- 选择 sign up。
- 填写 email。
- 填写 password。
- 填写 username。
- 人机确认
- 点击注册。
- 发送确认邮件到邮箱。
- 邮件中找到注册确认码,填入确认输入框。
- 注册成功。
配置公钥
- 找到 id_rsa.pub,复制内容。
- GitHub → 我的头像 → Settings。
- SSH and GPG keys。
- New SSH Key。
- 粘贴公钥,点击 add ssh key。
GitHub 创建仓库
- 在 sign in 界面输入邮箱和密码,点击登录。
- 进入首页,左侧展示仓库列表。
- 新建仓库:New 按钮。
GitHub 实战
- 克隆项目到本地。
- 添加内容。
- 提交内容。
- 更新本地项目。
# 克隆项目到本地
git clone xxx
# 添加内容
git add .
# 提交内容
git push
# 更新本地项目
git pull
Gitee 实战
Gitee 注册帐号
- 官网:https://gitee.com。
- 点击注册按钮。
- 填写姓名。
- 填写手机号。
- 填写密码。
- 点击立即注册按钮。
配置公钥
- 找到 id_rsa.pub,复制内容。
- Gitee → 我的头像 → 设置。
- 安全设置 → SSH 公钥。
- 粘贴公钥,点击确定按钮。
Gitee 创建仓库
- 进入首页,左侧展示仓库列表。
- 新建仓库:+ 按钮。
Gitee 实战
- 克隆项目到本地。
- 添加内容。
- 提交内容。
- 更新本地项目。
# 克隆项目到本地
git clone xxx
# 添加内容
git add .
git commit -m "comments"
# 提交内容
git push
# 更新本地项目
git pull
Git 客户端与 IDE 实战
Git 结合 IDE 的优点
- 可视化强
- 操作简单、上手便捷
PyCharm Git 实战
- PyCharm 配置 Git
- PyCharm 配置 GitHub
- PyCharm 配置 Gitee
- PyCharm Git 操作实战
- PyCharm Git 日志管理
PyCharm 配置 Git
- 步骤:Settings/Preferences → Version Control → Git
PyCharm 配置 GitHub
- 步骤:Settings/Preferences → Version Control → GitHub
- 登录方式:
- 用户名密码方式登录。
- Token 方式登录:
- GitHub 获取 token。
- 配置 Token 登录。
PyCharm 配置 Gitee
- 安装 Gitee 插件:Settings/Preferences → Plungins → Marketplace
- 配置 Gitee:Settings/Preferences → Version Control → Gitee
Git Log 分析与检索
Git Log 分析
- 查看项目历史信息:
git log
git log
commit 0ba2badd7f0d7e3c245f6ebd2237f7aabaaea1ca (HEAD -> master, origin/master, origin/hogwarts, dev)
Author: hogwarts_feier <fangyuan@ceshiren.com>
Date: Fri Feb 24 14:19:52 2023 +0800
添加忽略文件
commit 4c086e144ea974d5fca3d0c23db4022990c2d511
Author: hogwarts_feier <fangyuan@ceshiren.com>
Date: Fri Feb 24 14:08:22 2023 +0800
添加 newfile 文件
commit cb8445d3d016397dead9e7f572bbf778076e7c5f
Author: hogwarts_feier <fangyuan@ceshiren.com>
Date: Fri Feb 24 14:05:06 2023 +0800
删除
commit ca61f2dca670724820ad498ac167ff8de5f8331a
Author: hogwarts_feier <fangyuan@ceshiren.com>
Date: Fri Feb 24 13:53:40 2023 +0800
Git Log 检索
- 筛选时间:
git log --since='2023-02-02 00:00:00'
- 筛选作者:
git log --author='feier'
- 筛选描述:
git log --grep='update'
git_demo % git log --since='2023-02-02 00:00:00'
commit 0ba2badd7f0d7e3c245f6ebd2237f7aabaaea1ca (HEAD -> master, origin/master, origin/hogwarts, dev)
Author: hogwarts_feier <xxx@ceshiren.com>
Date: Fri Feb 24 14:19:52 2023 +0800
添加忽略文件
git log --author='feier'
commit 0ba2badd7f0d7e3c245f6ebd2237f7aabaaea1ca (HEAD -> master, origin/master, origin/hogwarts, dev)
Author: hogwarts_feier <xxx@ceshiren.com>
Date: Fri Feb 24 14:19:52 2023 +0800
添加忽略文件
git log --grep='update'
commit da76565755c86a68123640ff7729f0796734acd3
Author: hogwarts_feier <xxx@ceshiren.com>
Date: Fri Feb 24 03:43:42 2023 +0000
update 1.
Signed-off-by: hogwarts_feier <xxx@ceshiren.com>
分支管理策略
分支管理
- 概念:
- 每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支。
- 价值:
- 多人协作。
- 环境管理。
创建分支
- 新建分支,但仍然停留在当前分支:
git branch 分支名
- 新建分支并直接切换至该分支:
git checkout -b 分支名
git_demo % git branch feier
git_demo % git checkout -b hogwarts
Switched to a new branch 'hogwarts'
查看分支
- 列出所有本地分支:
git branch
- 列出所有远程分支:
git branch -r
- 列出所有本地与远程分支:
git branch -a
git_demo % git branch
feier
* hogwarts
master
git_demo % git branch -r
origin/master
git_demo % git branch -a
feier
* hogwarts
master
remotes/origin/master
切换分支
- 切换到指定分支:
git checkout 分支名
git_demo % git checkout feier
Switched to branch 'feier'
删除分支
- 删除指定分支:
git branch -d 分支名
git_demo % git branch -d feier
Deleted branch feier (was 0ba2bad).
Git 合并与冲突
分支合并应用场景
- 合入主分支。
- 主分支合并其他分支:
- 通常使用 Merge Request 的方式。
主分支是稳定的、可用的代码
合并分支
- 合并指定分支到当前分支:
git merge 其他分支 本分支
- 变基:重新设置基准:
git rebase 其他分支
把bugfix分支的内容合并到dev分支
非Fast-forward的合并是很容易发生冲突的
什么是冲突
- 冲突:在并行工作的模式下,工作最终会发生重叠。当多个成员以不同的方式更改同一行内容时,在这种情况下,Git 无法判断哪个版本是正确的,这时就会产生冲突。
- 冲突场景:
- 多个分支代码合并到一个分支时。
- 多个分支向同一个远端分支推送代码时。
$ git merge change_site
Auto-merging filename
CONFLICT (content): Merge conflict in filename
Automatic merge failed; fix conflicts and then commit the result.
解决冲突
- 解决冲突方式:
- IDE 中解决冲突:选择要保留的内容点击 Accept,保存代码。
- 文件中解决冲突:保留需要的内容,删除其余内容,去掉分割线,保存代码。
- 冲突解决流程:
- 在本地当前分支上,修改冲突内容。
- 执行
git add .
添加到暂存区。 - 执行
git commit -m '提交说明'
提交到本地仓库,完成合并。 - 执行
git push
提交到远程仓库。
<<<<<<<
(本地修改内容)
=======
(远程修改内容)
>>>>>>>