Git简介

Git是分布式代码管理工具
git.png

我的理解呢,就是一个给代码做备份的,更新迭代项目的时候可以随时回退找到以前的版本。

Git中分为三种状态:已修改、已暂存、已提交

关键词解释

1、commit节点
在Git中每次提交都会生成一个节点,多次提交就会生成一个线性节点(不考虑merge的情况)

git2.png
C2节点包含C1提交内容,C3节点包含C1、C2提交的内容

2、HEAD
HEAD可以看做是指针,指针指向的节点始终是当前工作目录。
(HEAD指向C2,那当前的工作目录对应的就是C2节点)

3、远程仓库
github,gitee等就是远程仓库,可以作为中介。你可以在本地上开发,把项目提交到远程仓库上,然后在服务器上拉取。也可以直接提交到服务器上的远程仓库。

4、分支
分支的概念和HEAD类似,可以视为指针或引用,不同的是分支可以存在多个,HEAD只有一个。通常会根据功能或版本建立不同的分支。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Git命令

0、创建仓库
使用当前目录作为Git仓库,我们只需使它初始化

git init

使用我们指定目录作为Git仓库:

git init 目录

1、提交相关

添加文件到暂存区:

git add 文件路径

添加所有文件到暂存区:

git add .

撤销工作区改动:

git checkout -- 文件名

清空暂存区:

git reset HEAD 文件名

提交

git commit -m "该节点的描述信息"

2、分支相关

创建分支:
创建一个分支后该分支会与HEAD指向同一节点,

git branch 分支名

切换分支:

git checkout 分支名

创建一个分支后立即切换:

git checkout -b 分支名

删除分支:

git branch -d 分支名

3、合并相关
常用的合并命令大概有三个merge、rebase、cherry-pick

  • merge
    将某个分支或者某个节点的代码合并至当前分支
git merge 分支名/节点哈希值

在这里插入图片描述
(如果C3、C4同时修改了同一个文件中的同一句代码,这个时候合并会出错,因为Git不知道该以哪个节点为标准,所以这个时候需要我们自己手动合并代码)

  • rebase
git rebase 分支名/节点哈希值

与merge不同的是rebase合并看起来不会产生新的节点(实际上是会产生的,只是做了一次复制),而是将需要合并的节点直接累加

在这里插入图片描述

  • cherry-pick
git cherry-pick 节点哈希值

在这里插入图片描述
4、回退相关

  • 分离HEAD
    默认情况下HEAD是指向分支的,但也可以将HEAD从分支上取下来直接指向某个节点
git checkout 节点哈希值
//也可以直接脱离分支指向当前节点
git checkout --detach

相对引用:

//HEAD分离并指向前一个节点
git checkout 分支名/HEAD^

//HEAD分离并指向前N个节点
git checkout 分支名~N

如果开发过程发现之前的提交有问题,此时可以将HEAD指向对应的节点,修改完毕后再提交,此时你肯定不希望再生成一个新的节点,而你只需在提交时加上--amend即可,具体命令如下:

git commit --amend
  • 回退

将代码回到前一个提交

//回退N个提交
git reset HEAD~N

reset会使分支和HEAD一并回退

5、远程相关

  • clone
    远程仓库上拉取项目:
git clone 仓库地址
  • fetch
    fetch命令就是一次下载操作,它会将远程新增加的节点以及引用(分支/HEAD)的状态下载到本地
git fetch 远程仓库地址/分支名
  • pull
    pull命令可以从远程仓库的某个引用拉取代码,pull的本质就是fetch+merge
git pull 远程分支名

pull命令也可以通过rebase进行合并:

git pull --rebase 远程分支名
  • push

push命令可以将本地提交推送至远程

git push 远程分支名

push到github仓库的main上(github是自己指定的名字)

git push github main

6、配置远程仓库

显示所有远程仓库:

git remote -v

查看某个仓库信息:

git remote show 仓库名称

添加远程版本库:

git remote add 【自定义名称】【库的url】

删除修改远程版本库:

git remote rm name  # 删除远程仓库
git remote rename old_name new_name  # 修改仓库名

Git工作流程

功能驱动式开发:先有需求,再有功能分支或者补丁分支,完成开发后,该分支就合并到主分支,然后被删除

1、Git flow

长期分支:

  • 主分支 master
  • 开发分支 develop

短期分支:

  • 功能分支
  • 补丁分支
  • 预发分支

短期分支一旦开发完成,就会被合并进develop或master,然后被删除

Git遇到的问题解决方法

1、删除已经push的文件
情景:有一些文件已经push到Gitlab上了,但是发现debug文件不小心也push上去,我想要删除所有文件夹里面的debug文件
解决:
本地仓库中查找并删除所有debug文件

 find . -name "*debug*" -exec git rm -rf {} \;
  • find .:這是find命令,用於在文件系統中查找文件。.表示從當前目錄開始搜索
  • -name "*debug*":這是一個選項,指定要查找的文件名模式
  • *debug*表示任何包含"debug"字符串的文件名
  • -exec:這是一個選項,它允許對每個匹配的文件執行一個命令
  • git rm -rf {}:這是要執行的命令。git rm -rf用於強制刪除一個或多個文件。 {} 是一個特殊符號,代表find命令找到的每個匹配文件
  • \;:這標志着-exec選項的結束。注意前面有一個反斜槓,這是因爲分號在shell中有特殊含義,需要轉義
git commit -m "Remove all debug files"

学习的链接:
https://mp.weixin.qq.com/s/AlV50I6FLxUwKi-F6802Aw
https://www.runoob.com/git/git-remote.html
git工作流程
gitLab pull request工作流

最后编辑:2024年02月17日 ©著作权归作者所有