1、了解版本控制

什么是版本控制?真的需要吗?版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。

什么是分布式版本控制系统分布式版本控制系统( Distributed Version Control System,简称 DVCS )。

在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜 像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份

2、Git常用命令

git-系统配置

  1. git config -l

git-global配置

  1. git config --global --list
  2. # 可以设全局公用识别的 邮箱和用户名
  3. git config --global user.name 'xxxxxx'
  4. git config --global user.email 'xxxxx@xxx.com'

项目单独git配置

  1. # 查看
  2. git config --list
  3. # 为项目设置单独的user.name和user.email
  4. git config user.name 'xxxxxx'
  5. git config user.email 'xxxxx@xxx.com'

Git初始化

本地初始化

  1. git init

远程拉取

  1. git clone 远程仓库地址

本地仓库与远程仓库的关联

  1. # 本地-建立关联-远程
  2. git remote add origin 远程仓库地址
  3. # 本地-取消关联-远程
  4. git remote rm origin

Git保存和提交

查看状态

  1. git status

查看所有文件修改详情

  1. git diff HEAD

查看指定文件的修改详情

  1. git diff HEAD ./README.md

添加保存

“.”:所有修改文件
  1. git add .
  2. git add ./home.vue

添加保存说明(提交到本地仓库)

  1. git commit -m '对这次保存添加说明描述'

拉取代码

多人协作开发的时候,提交之前先拉取下代码,解决可能未来的冲突
  1. git pull origin 分支名

提交代码

  1. git push origin 分支名

Git提交日志

查看提交记录

查看曾经的提交记录 可以显示所有提交过的版本信息,不包括已经被删除的 commit 记录和 reset 的操作
  1. git log --pretty=oneline

控制显示条数

  1. git log -30 --pretty=oneline

图形化展示查看当前分支的版本演变信息

  1. git log --graph

按作者名字查看提交记录

  1. git log --author="John"

搜索提交历史,根据关键词

  1. git log -S 关键词

按日期

  1. git log --after="2023-2-1"

查找项目所有成员提交的情况统计

  1. git shortlog -s -n
结果
  1. (base) liuhaihua@liuhaihuadeMacBook-Pro springcloud-demo % git shortlog -s -n
  2. 60 liuhaihua
  3. 3 Harries

查找某人提交信息

  1. git log --author="liuhaihua" --date=iso --pretty=format:’"%h","%an","%ad","%s"
结果
  1. (base) liuhaihua@liuhaihuadeMacBook-Pro springcloud-demo % git log --author="liuhaihua" --date=iso --pretty=format:’"%h","%an","%ad","%s"
  2. 353c676,liuhaihua,2025-01-03 21:02:49 +0800,spring cloud security
  3. 0be19bb,liuhaihua,2025-01-02 17:07:22 +0800, Spring Cloud security
  4. c5d7c24,liuhaihua,2025-01-02 15:07:07 +0800, Spring Cloud security
  5. 645e007,liuhaihua,2025-01-02 14:56:09 +0800, Spring Cloud security
  6. 8910e22,liuhaihua,2024-12-26 18:14:31 +0800, Spring Cloud security
  7. c619eee,liuhaihua,2024-12-25 18:01:56 +0800, Spring Cloud security
  8. e4e2221,liuhaihua,2024-12-24 18:23:02 +0800, Spring Cloudsecurity
  9. b5a6318,liuhaihua,2024-12-23 16:09:46 +0800, Spring Cloud openfeign
  10. 00a8985,liuhaihua,2024-12-05 10:41:10 +0800, Spring Cloud zooKeeper
将结果导出Excel
  1. git log --author="liuhaihua" --date=iso --pretty=format:’"%h","%an","%ad","%s" >> ~/Desktop/commit-liuhaihua.csv

工作中常用的 Git 命令 - 图1

查找某人修改的文件(去重)

  1. git log --author=liuhaihua --name-only --pretty=format: --all | sort | uniq
结果
  1. (base) liuhaihua@liuhaihuadeMacBook-Pro springcloud-demo % git log --author=liuhaihua --name-only --pretty=format: --all | sort | uniq
  2. LeaderElection/docker/run.md
  3. LeaderElection/pom.xml
  4. LeaderElection/src/main/java/com/et/LeaderElectionApplication.java
  5. LeaderElection/src/main/java/com/et/LeaderElectionConfig.java
  6. LeaderElection/src/main/resources/application-node1.properties
  7. LeaderElection/src/main/resources/application-node2.properties
  8. README.md
  9. Spring-Cloud-Function/pom.xml
  10. Spring-Cloud-Fun
  11. 。。。。

按时间查询某人提交记录

  1. git log --author=liuhaihua --since='2024-07-01' --until='2024-08-01' --no-merges --pretty=format:"%ad %s" --date=short | uniq | sort
结果
  1. (base) liuhaihua@liuhaihuadeMacBook-Pro springcloud-demo % git log --author=liuhaihua --since='2024-07-01' --until='2024-08-01' --no-merges --pretty=format:"%ad %s" --date=short | uniq | sort
  2. 2024-07-16 Spring Cloud hystrix
  3. 2024-07-16 springcoud-with-eureka

查询用户在指定日期内提交的后缀名为 java 或 css 的文件

  1. git log --author=liuhaihua --stat --no-merges --name-only --since='2024-01-20' --until='2024-12-31' | grep -E ".java|.css$" | sort | uniq
结果
  1. (base) liuhaihua@liuhaihuadeMacBook-Pro springcloud-demo % git log --author=liuhaihua --stat --no-merges --name-only --since='2024-01-20' --until='2024-12-31' | grep -E ".java|.css$" | sort | uniq
  2. LeaderElection/src/main/java/com/et/LeaderElectionApplication.java
  3. LeaderElection/src/main/java/com/et/LeaderElectionConfig.java
  4. Spring-Cloud-Function/src/main/java/com/et/DemoApplication.java
  5. Spring-Cloud-Function/src/main/java/com/et/controller/FunctionController.java
  6. Spring-Cloud-Function/src/main/java/com/et/function/CustomFunctions.java
  7. 。。。。

搜索过滤合并提交

  1. git log --no-merges
  2. or
  3. git log --merges

按提交信息

比如说,团队规范要求在提交信息中包括相关的issue编号,可以用下面这个命令来显示这个 issue 相关的所有提交
  1. git log --grep="JRA-224:"

查看当前 版本标志位

<font style="color:black;">git reflog</font>是Git操作的一道安全保障,它能够记录几乎所有本地仓库的改变,包括所有分支的commit提交,以及已经被删除的commit

  1. git reflog

Git回退到某个版本

回退到上一个版本

  1. git reset --hard HEAD^ # 回退上一个版本
  2. git reset --hard HEAD~3 # 回退上上上一个版本
  3. git reset --hard bae128 # 回退到某个版本回退点之前的所有信息。

HEAD 说明:

  • HEAD 表示当前版本
  • HEAD^ 上一个版本
  • HEAD^^ 上上一个版本
  • HEAD^^^ 上上上一个版本
  • 以此类推…
可以使用 ~数字表示
  • HEAD~0 表示当前版本
  • HEAD~1 上一个版本
  • HEAD^2 上上一个版本
  • HEAD^3 上上上一个版本
  • 以此类推…

Git分支指令

查看素有分支

  1. git branch -a

切换分支

  1. git checkout 分支名

创建本地分支

  1. git branch 新分支名
  2. # 创建并切换到新分支
  3. git checkout -b 新分支名

根据指定版本号创建分支

  1. git checkout -b 分支名 提交ID

推送本地分支到远程仓库

  1. git push origin 新分支名

删除本地某个分支

这是一个“安全”操作,因为 Git 会阻止删除具有未合并更改的分支
  1. git branch -d 分支名

强制删除本地某个分支

即使它有未合并的更改。如果想永久丢弃与特定开发线相关的所有提交,则可以使用此命令
  1. git branch -D 分支名

删除远程仓库的某个分支

  1. git push origin --delelte 分支名

显示所有远程仓库

查看仓库源名称
  1. git remote -v

更新远程分支列表

  1. git remote update origin(仓库源名称) --prune

推送所有分支到远程仓库

  1. git push origin(仓库源名称) --all

强行推送当前分支到远程仓库,即使有冲突

  1. git push origin(仓库源名称) --force

Git合并分支

想将develop分支合并到master分支
  1. git checkout master # 首先切换到master分支上
  2. git pull origin master # 如果是多人开发的话 需要把远程master上的代码pull下来
  3. git merge --no-ff develop # 然后把develop分支的代码合并到master上
关于 git merge develop 和 git merge —no-ff develop 的区别
  1. git merge develop
  2. ==== > 结果就会变成
  3. A---B---C develop
  4. / master
  5. D---E---F
执行此句话后,因为 develop 就在 master 的下游,所以直接移动了 master 的指针,master 和 develop 都指向了 C 而如果执行了 <font style="color:black;">git merge --no-ff feature</font> 的话,是下面的结果:
  1. git merge --no-ff develop
  2. ==== > 结果就会变成
  3. A---B---C develop
  4. / \
  5. D---E---F-----------G master
  6. 由于 --no-ff 禁止了快进,所以会生成一个新的提交,master 指向 G
从合并后的代码来看,结果其实是一样的,区别就在于 —no-ff 会让 Git 生成一个新的提交对象,通常把 master 作为主分支,上面存放的都是比较稳定的代码,而 feature 是用来开发特性的,上面会存在许多零碎的提交,快进式合并会把 feature 的提交历史混入到 master 中,搅乱 master 的提交历史

Git标签

查看tag列表

  1. git tag -l

本地添加tag

  1. git tag -a 标签名 -m '版本说明'

查看tag信息

  1. git show 标签名

本地删除某个tag

  1. git tag -D 标签名
  2. or
  3. git tag -d 标签名

推送本地tag到远程仓库

  1. git push origin 标签名

删除远程仓库tag

  1. git push origin --delete 标签名

小记

  • cmd中使用log命令,不会自动退出,需要手动按下英文状态下的q退出

Git常见错误

1、修改最后一次提交消息 - 提交消息写错了

(按 i 进行编辑,编辑后,按 ESC,如果保存退出使用 :wq,只退出输入 :q,如果出错,退出不保存使用 :qa!)
  1. git commit --amend #该命令将打开编辑器,并允许更改最后一次提交消息

2、Git 撤回 commit,但未 push 的内容

  1. git log
  2. git reset e102c05227bca7517554777f589f130305b69427 #保留提交之前的更改到工作区

3、让单个文件回退到指定版本

  1. git log vue.config.js #拿到文件提交记录ID
  2. git checkout e102c05227bca7517554777f589f130305b69427(commitID) vue.config.js #将文件还原到你想要还原的版本

4、解决冲突

只要所有开发者都遵守这个规则,那么解决冲突是一件非常容易的事情
  1. 例如当前的分支叫做dev分支。把代码修改完成了,现在不知道有没有冲突。
  2. 在 dev 分支里面,执行命令<font style="color:rgb(30, 107, 184);">git merge origin/master</font>,把远程的master分支合并到当前dev分支中。如果没有任何报错,那么直接转到第5步。
  3. 如果有冲突,根据提示,把冲突解决,保存文件。然后执行命令git add xxx把修改的文件添加到缓存区。然后执行命令<font style="color:rgb(30, 107, 184);">git commit -m "xxx"</font>添加 commit 信息。
  4. 执行如下命令,切换到 master 分支:<font style="color:rgb(30, 107, 184);">git checkout master</font>
  5. 执行命令git pull确保当前 master 分支是最新代码。
  6. 把dev分支的代码合并回 master 分支:<font style="color:rgb(30, 107, 184);">git merge dev</font>
  7. 提交代码:<font style="color:black;">git push</font>