git基本了解、常用基本命令与使用

什么是git

Git 是一个分布式版本控制系统,用于跟踪文件变化,协调多人协作开发,帮助开发者管理代码历史和协作开发的工具。

版本控制

text 复制代码
时间线:版本1 → 版本2 → 版本3 → 版本4
          │         │         │        │
        初稿      添加图表   修改结论   最终版

-随时可以回到任意版本

查看每次修改的内容

知道"谁在什么时候改了什么地方"

分支管理(最重要的功能!)

text 复制代码
          主分支(main)
          /         \
   功能A分支        功能B分支
    (开发中)         (开发中)
          \         /
          合并到主分支

主分支:稳定可运行的代码

功能分支:开发新功能,不影响主分支

修复分支:紧急修复bug

协作开发

多人同时工作,不会互相覆盖

清晰的责任追踪

代码审查(Pull Request)

工作原理

text 复制代码
你的电脑             Git仓库
  ↓                    ↓
工作区 → 暂存区 → 本地仓库 → 远程仓库(GitHub)
 编写      暂存      提交      分享
复制代码
工作区(Working Directory) → 暂存区(Staging Area) → 仓库(Repository)
      ↓                           ↓                        ↓
   编辑文件                     git add                 git commit

基本配置

bash 复制代码
# 设置用户名(提交记录显示的名字)
git config --global user.name "你的用户名"

# 设置邮箱(用于识别提交者)
git config --global user.email "你的邮箱@example.com"

# 查看配置是否生效
git config --global --list

# 编辑器选择
git config --global core.editor 编辑器的名字 eg:emacs

# 设置默认分支名,默认为master
$ git config --global init.defaultBranch 分支名 eg:main

# 解决中文乱码问题(Windows)
# 1.解决提交信息乱码
git config --global core.quotepath false

# 2.解决ls命令中文乱码
echo "export LANG=zh_CN.UTF-8" >> ~/.bashrc
source ~/.bashrc

基本操作

获取 Git 仓库

直接创建

bash 复制代码
# 进入仓库目录
cd D:/Goproject/git-project
# 1、可以直接初始化,是以当前目录为仓库目录并创建一个.git隐藏文件
git init
# 2、可以指定目录,是以git-project下的newgit为仓库目录并创建一个.git隐藏文件
git init newgit

从远程仓库克隆

bash 复制代码
# 从现有的Git仓库中拷贝项目、克隆仓库
git clone <repo>(Git 仓库)
# 克隆到指定的目录
git clone <repo> <directory>
# eg:
git clone https://github.com/rfhdw0102/onlineChatRoom.git  git-clone

基本命令

提交与修改

git add: 把文件添加到本地仓库的暂存区

bash 复制代码
git add *.go
git add README
# 以上命令将当前目录下以 .go 结尾(不会递归子目录)及 README 文件提交到缓存区

# 递归匹配所有目录(包括子目录)中的 .go 文件
git add **/*.go  
# 精确添加 tool 包下的 tool.go
git add tool/tool.go  

# 如果想添加当前目录下所有文件(包括子目录),可以简化为 :
git add .   #(. 表示当前目录)

git commit: 把文件提交到本地仓库,注意必须加 -m 后面跟着本次提交的内容说明

bash 复制代码
git commit -m "提交说明"
# 在 Linux 系统中,commit 信息使用单引号 ',Windows 系统,commit 信息使用双引号 "。

# 如果提交说明写错了,可通过 git commit --amend 修正最近一次的提交说明
git commit --amend

git status:查看缓存区状态

git diff:比较暂存区和工作区的差异

bash 复制代码
# 暂存区和工作区的差异
git diff
# 直接对比两次提交的所有文件差异
git diff a1b2c3d d4e5f6g
# 如果只想看某个个文件(比如 main.go)在两次提交中的差异
git diff a1b2c3d d4e5f6g -- main.go

git range-diff:比较两个提交范围的差异

bash 复制代码
# 比较 (c4e5f6g 相对于 a1b2c3d 的变化) 与 (d1e2f6e 相对于 a1b2c3d 的变化) 的差异
git range-diff a1b2c3d..c4e5f6g  a1b2c3d..d1e2f6e

git reset:回退版本

bash 复制代码
# 回退到指定版本
git reset --hard commitID
# 查看已经删除的记录
git reflog 
1ecb58f (HEAD -> main) HEAD@{0}: reset: moving to 1ecb58f
1ecb58f (HEAD -> main) HEAD@{1}: commit (amend): first commit
3ab1ea0 HEAD@{2}: commit (initial): first commit

.gitignore:有些文件不想被跟踪时,将其写入.gitignore

bash 复制代码
# 创建一个.gitignore文件、vim编辑,将不想被跟踪的文件写进去或者匹配进去
eg:  .idea
	 *.c

git mv:移动或重命名工作区文件

git notes:添加注释

git restore:恢复或撤销文件的更改

git shwo:显示 Git 对象的详细信息

日志

命令 说明
git log 查看历史提交记录
git blame <file> 以列表形式查看指定文件的历史修改记录
git shortlog 生成简洁的提交日志摘要
git describe 生成一个可读的字符串,该字符串基于 Git 的标签系统来描述当前的提交
bash 复制代码
# 以简洁的一行格式显示当前分支上所有的提交记录
git log --oneline 
# 显示所有分支的提交记录,而不仅限于当前分支
git log --all
git log --oneline --all
git log --oneline --all --graph

远程操作

命令 说明
git remote 远程仓库操作
git fetch 从远程获取代码库
git pull 下载远程代码并合并
git push 上传远程代码并合并
git submodule 管理包含其他 Git 仓库的项目
bash 复制代码
# 添加远程仓库
git remote add <远端名称> <仓库路径>
git remote add git@github.com:rfh0102/git.git
# 查看远程仓库
git remote
# 推送到远程仓库
git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名] ]
# 如果远程分支名和本地分支名称相同,则可以只写本地分支
# -f 表示强制覆盖,一般不用
# -u: --set-upstream 推送到远端的同时并且建立起和远端分支的关联关系。
git push -u origin master
# 如果当前分支已经和远端分支关联,则可以省略分支名和远端名。
git push  # 将master分支推送到已关联的远端分支

# 查看关联关系我们可以使用: 
git branch -vv 

# 抓取指令就是将仓库里的更新都抓取到本地,不会进行合并、如果不指定远端名称和分支名,则抓取所有分支。
git fetch [remote name] [branch name]
git fetch origin main
# 拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge、如果不指定远端名称和分支名,则抓取所有并更新当前分支。
git pull [remote name] [branch name]
git pull

解决合并冲突

在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。

A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要

推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分

,如下图所示。

在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲

突。

远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同

分支管理

git switch:更清晰地切换分支

bash 复制代码
# 切换到已存在的分支、效果:工作区文件会更新为目标分支的最新版本,HEAD 指针指向该分支。
git switch <分支名>
# eg: 从 main 分支切换到 dev 分支
git switch dev

# 切换到上一个分支、用 - 代替分支名,快速返回上一个分支(类似 cd -):
git switch -

# 创建并切换到新分支
# 基于当前分支创建新分支
git switch -c <新分支名>
# 基于指定分支 / 提交 创建新分支
git switch -c <新分支名> <基础分支名/提交ID>
# eg:
# 基于 dev 分支创建 feature/pay 分支:
git switch -c feature/pay dev
# 基于某个历史提交(ID:a1b2c3d)创建修复分支:
git switch -c hotfix a1b2c3d

# git switch 可以丢弃工作区中未暂存的修改,将文件恢复到「暂存区版本」或「当前分支的最新提交版本」
# 恢复单个文件
git switch -- <文件名>
# 丢弃 main.go 的未暂存修改(恢复到最近一次 commit 或 add 的状态)
git switch -- main.go
命令 说明 用法示例
git branch 列出、创建或删除分支。它不切换分支,只是用于管理分支的存在。 git branch:列出所有分支 git branch new-branch:创建新分支 git branch -d/-D(强制删除) old-branch:删除分支
git checkout 切换到指定的分支或恢复工作目录中的文件。也可以用来检出特定的提交。 git checkout branch-name:切换分支 git checkout file.txt:恢复文件到工作区 git checkout <commit-hash>:检出特定提交
git switch 专门用于切换分支,相比 git checkout 更加简洁和直观,主要用于分支操作。 git switch branch-name:切换到指定分支 git switch -c new-branch:创建并切换到新分支
git merge 合并指定分支的更改到当前分支。 git merge branch-name:将指定分支的更改合并到当前分支
git mergetool 启动合并工具,以解决合并冲突。 git mergetool:使用默认合并工具解决冲突 git mergetool --tool=<tool-name>:指定合并工具
git log 显示提交历史记录。 git log:显示提交历史 git log --oneline:以简洁模式显示提交历史
git stash 保存当前工作目录中的未提交更改,并将其恢复到干净的工作区。 git stash:保存当前更改 git stash pop:恢复最近保存的更改 git stash list:列出所有保存的更改
git tag 创建、列出或删除标签。标签用于标记特定的提交。 git tag:列出所有标签 git tag v1.0:创建一个新标签 git tag -d v1.0:删除标签
git worktree 允许在一个仓库中检查多个工作区,适用于同时处理多个分支。 git worktree add <path> branch-name:在指定路径添加新的工作区并切换到指定分支 git worktree remove <path>:删除工作区

解决冲突

当两个分支上对文件的修改可能会存在冲突,例如同时修改了一个文件的同一行,这时就需要手动解决冲突,解决冲突的步骤如下:

1、处理文件中冲突的地方

打开文件会看到提示:

修改成我们想要的样子,比如:

count=15

2、将解决完冲突的文件加入暂存区

3、提交到仓库

分支使用流程

删除分支

bash 复制代码
# 删除时必须切换到别的分支再删除
git branch -d dev01
# 强制删除,当在dev02分支中做了操作且没有合并到别的分支上,就不能 -d 删除
git branch -D dev02

标签

Git 标签(Tag)用于给仓库中的特定提交点加上标记,通常用于发布版本(如 v1.0, v2.0)

bash 复制代码
# 标签语法格式:
git tag <tagname>
# -a 选项、选项意为"创建一个带注解的标签",Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
git tag -a v1.0 
# 可以事后追加标签
git tag -a v0.9 85fc7e7
# -m:指定注解消息的内容、两者配合使用可以避免打开编辑器,直接在命令行完成操作
git tag -a <tagname> -m "message" # 不会再打开编辑器了
# 查看标签的信息
git show <tagname>
# 查看标签
git tag
# 但是当执行git log --decorate 时 也可以看到标签

# 推送标签,git push 默认不会推送标签,需要显示推送
git push origin <tagname>
# 推送所有标签
git push origin --tags
# 删除,本地删除
git tag -d <tagname>
# 远程删除
git push origin --delete <tagname>

在编辑器里面配置github地址

这里有一篇博客写的不错,可以直接看这一篇 点这里

相关推荐
java1234_小锋2 小时前
Spring IoC的实现机制是什么?
java·后端·spring
喵个咪2 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:JWT 集成指南
后端·go
绝不收费—免费看不了了联系我3 小时前
Fastapi的单进程响应问题 和 解决方法
开发语言·后端·python·fastapi
喵个咪3 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:OPA 集成指南:从原理到实践
后端·go
Victor3563 小时前
Netty(11) Netty的心跳机制是什么?为什么需要它?
后端
Victor3564 小时前
Netty(12)Netty支持哪些协议和传输方式?
后端
无限大64 小时前
为什么电脑需要"内存"和"硬盘"?——存储金字塔的秘密
后端
ovensi5 小时前
Docker+NestJS+ELK:从零搭建全链路日志监控系统
后端·nestjs
武子康5 小时前
大数据-184 Elasticsearch Doc Values 机制详解:列式存储如何支撑排序/聚合/脚本
大数据·后端·elasticsearch