Git代码管理-可乔

Git 环境配置

Git 简介

  • Git 是目前世界上最先进的分布式版本控制系统。
  • Git 优点:
    • 适合分布式开发,强调个体。
    • 公共服务器压力和数据量都不会太大。
    • 速度快、灵活。
    • 任意两个开发者之间可以很容易的解决冲突。
    • 离线工作。

Git 安装

  • 官网下载地址:Git - Downloads
  • Windows:
    1. 点击下载好的安装包安装软件。
    2. 默认安装即可。
  • MacOS:
    • brew install git

Git 环境验证

  • Windows:
    • cmd 中输入命令 git --version
  • MacOS:
    • 终端中输入命令 git --version

image

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 连接

  1. 生成 SSH Key:
  • ssh-keygen -t rsa -C "your_email@youremail.com"
  1. 连敲三次回车键。
  2. 到对应目录下找生成的公钥和密钥。

image

拉取远程仓库

  • 拉取远程仓库到本地:
    • 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、
image

2、初始化创建git仓库命令: git init

创建完成之后产生隐藏.git文件夹,证明初始化仓库完成

GitLab 实战

GitLab 帐号

  • 申请账号。
  • 申请权限。

配置公钥

  1. 找到 id_rsa.pub,复制内容。
  2. GitLab → 我的头像 → Prefereces。
  3. SSH keys。
  4. 粘贴公钥,点击 add key。

GitLab 创建项目

  1. 点击 New project 按钮。
  2. 选择项目类型,点击 Create blank project 从空项目开始创建。

GitLab 实战

  • 克隆项目到本地。
  • 添加内容。
  • 提交内容。
  • 更新本地项目。
# 克隆项目到本地
git clone xxx
# 添加内容
git add .
# 提交内容
git push
# 更新本地项目
git pull

GitHub 实战

GitHub 注册帐号

  1. 官网:https://github.com
  2. 选择 sign up。
  3. 填写 email。
  4. 填写 password。
  5. 填写 username。
  6. 人机确认
  7. 点击注册。
  8. 发送确认邮件到邮箱。
  9. 邮件中找到注册确认码,填入确认输入框。
  10. 注册成功。

配置公钥

  1. 找到 id_rsa.pub,复制内容。
  2. GitHub → 我的头像 → Settings。
  3. SSH and GPG keys。
  4. New SSH Key。
  5. 粘贴公钥,点击 add ssh key。

GitHub 创建仓库

  1. 在 sign in 界面输入邮箱和密码,点击登录。
  2. 进入首页,左侧展示仓库列表。
  3. 新建仓库:New 按钮。

GitHub 实战

  • 克隆项目到本地。
  • 添加内容。
  • 提交内容。
  • 更新本地项目。
# 克隆项目到本地
git clone xxx
# 添加内容
git add .
# 提交内容
git push
# 更新本地项目
git pull

Gitee 实战

Gitee 注册帐号

  1. 官网:https://gitee.com
  2. 点击注册按钮。
  3. 填写姓名。
  4. 填写手机号。
  5. 填写密码。
  6. 点击立即注册按钮。

配置公钥

  1. 找到 id_rsa.pub,复制内容。
  2. Gitee → 我的头像 → 设置。
  3. 安全设置 → SSH 公钥。
  4. 粘贴公钥,点击确定按钮。

Gitee 创建仓库

  1. 进入首页,左侧展示仓库列表。
  2. 新建仓库:+ 按钮。

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


image

image

image

image

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分支
image

非Fast-forward的合并是很容易发生冲突的

image

image

什么是冲突

  • 冲突:在并行工作的模式下,工作最终会发生重叠。当多个成员以不同的方式更改同一行内容时,在这种情况下,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,保存代码。
    • 文件中解决冲突:保留需要的内容,删除其余内容,去掉分割线,保存代码。
  • 冲突解决流程:
    1. 在本地当前分支上,修改冲突内容。
    2. 执行 git add . 添加到暂存区。
    3. 执行 git commit -m '提交说明' 提交到本地仓库,完成合并。
    4. 执行 git push 提交到远程仓库。
<<<<<<<
(本地修改内容)
=======
(远程修改内容)
>>>>>>>