Skip to main content

image-20211117155030181

Workspace:工作区,就是平时进行开发改动的地方,是当前看到最新的内容,在开发的过程也就是对工作区的操作

Index:暂存区,当执行 git add 的命令后,工作区的文件就会被移入暂存区,暂存区标记了当前工作区中那些内容是被 Git 管理的,当完成某个需求或者功能后需要提交代码,第一步就是通过 git add 先提交到暂存区。

Repository:本地仓库,位于自己的电脑上,通过 git commit 提交暂存区的内容,会进入本地仓库。

Remote:远程仓库,用来托管代码的服务器,远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改,本地仓库修改完代码后通过 git push 命令同步代码到远程仓库。

工作流程

组员-git工作流程:

  1. 开发完,暂存到本地;【暂存修改】
  2. 以远程生产分支(一般为master)为依据,签出xxx分支,应用暂存;(xxx)【应用修改到个人分支xxx】
  3. 检查修改,冲突处理;没有冲突就push xxx分支到远程;(xxx)【提交个人分支到远程
  4. 切到测试分支(一般为develop),fetch 获取远程(一般为origin)更新,有更新就merge远程的测试分支;(develop)【合并个人分支到测试分支】
  5. merge xxx分支,检查修改,冲突处理;没有冲突就push到远程测试分支;(develop)【提交测试分支到远程】

测试反馈通过后,组长会合并你的远程xxx分支到生产;(组员一般没有这个权限)

  • 当xxx分支需要修改时,在该分支上修改完,提交到远程的分支;
  • 第1步暂存的好处是,当突然需要处理其他需求时,可以先暂存修改,进行其他需求的修改,互不影响;
  • 第4步的合并是为了同步其他组员的修改,其中,fetch+merge=pull,可以直接使用pull,但是推荐前者(fetch+merge),可以提前查看他人修改,减少冲突;

基本操作

暂存

添加文件到暂存区

# 添加某个文件到暂存区,后面可以跟多个文件,以空格区分
git add xxx
# 添加当前更改的所有文件到暂存区。
git add .

提交

# 提交暂存的更改,会新开编辑器进行编辑
git commit
# 提交暂存的更改,并记录下备注
git commit -m "you message"
# 等同于 git add . && git commit -m
git commit -am
# 对最近一次的提交的信息进行修改,此操作会修改commit的hash值
git commit --amend

合并

以分支为单位合并

git merge 分支名

以某次提交为单位合并

git cherry-pick 该提交的 hash 值

git log 可查看提交 hash 值

推送

# 从远程仓库拉取代码并合并到本地,可简写为 git pull 等同于 git fetch && git merge
git pull <远程主机名> <远程分支名>:<本地分支名>
# 使用rebase的模式进行合并
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>

拉取

git pull 不同的是 git fetch 操作仅仅只会拉取远程的更改,不会自动进行 merge 操作。对你当前的代码没有影响

# 获取远程仓库特定分支的更新
git fetch <远程主机名> <分支名>
# 获取远程仓库所有分支的更新
git fetch --all

分支

# 新建本地分支,但不切换
git branch <branch-name>
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看本地和远程分支
git branch -a
# 删除本地分支
git branch -D <branch-nane>
# 重新命名分支
git branch -m <old-branch-name> <new-branch-name>

回滚

未推送到远程

# 完全回滚到上一个提交
git rest --hard HEAD~1

# 回滚到指定提交
git reset --hard <commit-hash>

然后可以强制推送到远程

# 强制推送到远程(覆盖远程历史)
git push --force

这种有风险:

  • 会删除远程仓库的提交历史

  • 其他开发者的本地仓库会出现冲突

  • 无法恢复被删除的提交(除非有备份)

已推送远程推荐

# 撤销最后一次提交
git revert HEAD

# 撤销指定提交:
# 查看提交历史
git log --oneline
# 输出示例:
# a1b2c3d (HEAD -> main) 添加新功能
# e4f5g6h 修复bug
# i7j8k9l 更新文档
# m1n2o3p 初始提交

# 撤销 "修复bug" 这个提交
git revert e4f5g6h

比如:

# 假设提交历史如下:
git log --oneline
# abc123 (HEAD -> main) 添加用户登录功能
# def456 修复购物车bug
# ghi789 更新UI样式
# jkl012 添加商品搜索功能

# 发现用户登录功能有严重bug,需要撤销
git revert abc123

# 推送到远程
git push origin main

远程

# 查看远程仓库地址
git remote -v
# 删除远程占用
git remote rm origin
# 连接远程仓库,origin相当于xxx的别名,方便后续git操作
git remote add origin xxx
# 修改远程仓库地址
git remote set-url origin xxx

配置

# 查当前git代理
git config http.proxy
# 查全局git代理,https类似
git config --global http.proxy
# 删除代理
git config --unset http.proxy
# 查看全局配置信息:
git config --global --list
# 查看当前仓库的配置信息:
git config --list


# 查看特定配置项的值:
git config <key>
# 将 <key> 替换为要查看的特定配置项的名称,例如:
git config user.name
git config core.editor

# 设置全局邮箱:
git config --global user.email "xxx"
# 设置当前仓库邮箱:
git config user.email "xxx"
# 查看 Git 的所有配置信息:
# 此命令将显示所有 Git 配置项及其来源(配置文件和命令行选项等)。
git config --list --show-origin

rebase

保持线性历史

# 传统合并会产生分叉历史
git checkout main
git merge feature-branch
# 结果:有合并提交,历史呈现分叉

# 使用rebase保持线性历史
git checkout feature-branch
git rebase main
git checkout main
git merge feature-branch # 这将是快进合并
# 结果:线性历史,看起来像在main上直接开发

其他

# 查找某个文件的删除,在哪一次提交
git log --diff-filter=D --summary > log.txt

将包含文件删除的提交记录,写入log.txt文件,然后在文件中搜索文件名,就可以看到相关 commit 的 hash

比如

commit da76ba676629367b1a067bfb17964b9009969581
Author: xxx
Date: Tue May 7 16:37:43 2024 +0800

【EDIT】添加Reddit社媒分享,整合分享组件

delete mode 100644 src/GG/components/gg/GMobileShareButton.vue
delete mode 100644 src/GG/components/gg/GPcShareButton.vue

拓展

  • --summary显示提交摘要
  • --diff-filter提交类型,包含
    • A:只显示添加的文件。
    • C:只显示复制的文件。
    • D:只显示删除的文件。
    • M:只显示修改的文件。
    • R:只显示重命名的文件。
    • T:只显示更改了文件类型的文件。

此外,还可以在选项前加上小写字母 d 来排除选择。例如,--diff-filter=dM 会显示除了修改的文件以外的所有文件。

团队协作

私仓+公仓+merge request 模式

1.在公仓那 fork 出来,此时创建了私仓;

2.clone 私仓到本地,添加私仓和公仓的 remote;

git remote add origin 私仓地址
git remote add upstream 公仓地址

tip: origin 和 upstream 命名看团队要求或者个人习惯;

3.执行 git remote -v 查看验证;

4.每次负责模块开发完,fetch 公仓的更新,若有 conflict 得解决再 merge;

git fetch upstream
git merge upstream/分支名

5.提交更新到私仓

git push origin 分支名

6.接着去公仓提交 merge request,由项目的 maintainer 合并你的跟新(一般是 developer,当然,优秀的你迟早 maintainer)

疑难杂症

cherry-pick

Merge branch 'feature/pro/merge-35' of git.cloud2go.cn:cloud/b_d into feature/pro/merge-35

cherry-pick 这种类型的提交报错:

error: commit fe3c6a5023c56403aeeff3e7b93f60b71c45b9ab is a merge but no -m option was given.

在 Git 中,合并提交有两个父提交,所以试图 cherry-pick 一个合并提交时,需要使用-m选项来指定想要的父提交。

例如,如果你想要 cherry-pick 合并提交fe3c6a5023c56403aeeff3e7b93f60b71c45b9ab,并且想要的是第一个父提交,可以这样做:

git cherry-pick -m 1 fe3c6a5023c56403aeeff3e7b93f60b71c45b9ab

please clean your repository working tree before checkout

暂时到 stash 中