全流程git操作命令

git -v 或者git --version查看版本号

查看每个文件 / 文件夹的真实总占用大小:du -sh * | sort -hr

git config --global user.name "lyh"

git config --global user.email "2012043702@qq.com"

一、创建git仓库

1.将文件初始化为git文件

命令:git init

当你使用git init初始化一个项目,或者用git clone下载一个项目时,Git 会在你的项目根目录下创建一个名为.git的隐藏文件夹。

  • 你的工作区:也就是你平时肉眼能看到的、用来写代码的那些文件和文件夹。

  • 本地仓库(真正的归宿):当你执行git addgit commit时,Git 会把你当前代码的状态(快照)经过高度压缩后,偷偷存放到这个.git文件夹里面的objects目录中。

所以,本地 Git 仓库本质上就是你项目目录下的一个隐藏文件夹,它充当了一个“本地小型数据库”的角色,记录了你代码所有的历史版本。

2.从其他服务器上克隆git仓库

二、git的三个区域

工作区、暂存区、版本库

git add . 到暂存区

git ls-files 查看暂存区文件

git commit -m " 要写清楚该版本内容" 生成快照版本,记录

git log --oneline 查看提交历史(可以回退到已经提交过的版本)

三、git文件状态

git文件状态:未跟踪U和已跟踪(新添加A(第一次被git暂存),未修改",已修改M)

git status -s 查看暂存区和工作区的文件状态

四、清除暂存区

检查暂存区状态

git status

1.为了将多个代码的修改一次进行提交到版本区

2.暂存区可以覆盖工作区,也就是你修改的代码不想要了,直接用之前提交到暂存区的版本

git restore 目标文件(刚刚在工作区的修改不想要了,该修改没有git add)

git rm --cached 目标文件 (从暂存区删除文件,并且该文件的状态变成未跟踪(文件还在工作区))

git rm -r --cached .清除当前目录下所有文件的 Git 暂存缓存

五、回退版本

查看提交历史

git log --oneline

git reflog --oneline 完整的记录,包含回退造成的消失的记录

想要查看的内容对应的 Git 命令
已提交的历史版本列表git log --oneline
某次已提交版本的代码详情git show <commit-id>
哪些文件在暂存区(待提交)git status
暂存区里具体的代码改动git diff --cached

回退版本

git reset --soft 版本号 (在不属于该版本的其他文件也会在工作区和暂存区被保留,并且状态改为A)

git reset --mixed 版本号 (在不属于该版本的其他文件会在工作区被保留,并且状态改为U,但是在暂存区就没有)

常用:git reset --hard 版本号(在不属于该版本的其他文件会在工作区和暂存区被覆盖)

六、删除文件

需求:删除某文件,并产生一次版本记录

做法:1.在工作区删除该文件,然后git add . 覆盖原本的暂存区,最后提交

2.在工作区删除该文件,然后删除暂存区的文件 git rm --cached 目标文件,最后提交

七、忽略文件

项目根目录新建.gitignore文件,填入相应文件名(无论在任意文件夹下,只写文件或者文件夹的名字就行)也要提交.gitignore文件(add commit)

node_modules
dist
.vscode
*.log

八、分支

介绍

在 Git 中,创建一个新分支,就相当于给你当前所在的代码状态拍了一张快照,或者说是做了一次“另存为”。新分支会完美继承你创建它那一瞬间的所有代码。

下面是具体的情况说明:

情况一:你当前就在main分支上(最常见)

如果你在终端里看到类似(main)的提示符,然后你敲下这个命令来创建并切换到新分支:

git checkout -b lyh

新版命令:

git switch -c lyh

创建名为lyh的新分支,并立刻切换到该分支工作

结果:你的lyh分支会自动包含main分支当前所有的代码。这就好比你打开了main.doc,然后点击“另存为”生成了lyh.doc。此时两边的内容一模一样。

情况二:你当前在别的分支上(比如dev

如果你当前在dev分支上,然后直接运行了git checkout -b lyh

结果:你的lyh分支继承的是dev分支的代码,而不是main的代码。因为 Git 默认是基于你“当前所在的位置”来分叉的。

情况三:无论你在哪,强制基于main创建新分支

如果你不想管自己现在在哪个分支,就想明确地基于main创建一个一模一样的lyh分支,你可以直接在命令后面加上基础分支的名字:

git checkout -b lyh main

结果:无论你当前在哪,Git 都会去找到main,然后基于main的代码克隆出一个全新的lyh分支。

核心总结:新分支总是脱胎于一个“母体”。只要你的“母体”选的是main,那么新分支lyh刚诞生时,里面的代码和main就是完全一样的。之后你在lyh里修改代码、提交(commit),就只会影响lyh本身,不会再影响到main了。

创建

HEAD指针

创建分支命令: git branch 分支名

切换分支命令: git checkout 分支名

在切换分支以后,提交的代码根据分支

合并与删除

步骤

1.切回要合入的分支上 git checkout 分支名 (被合并的,主分支)

2.合并其他分支 git merge 分支名(合并的,你的分支业务)

3.删除分支 git branch -d 分支名

多个分支合并到主分支时,按照提交的顺序合并而不是合并的先后

合并冲突

不同分支中,会同一个文件的同一个部分修改,git无法干净合并,产生合并冲突

找到冲突文件并手动解决(vscode给出四种方式),解决后需要继续提交记录

lunyi@lyh MINGW64 /d/git_test (main|MERGING)

避免冲突:

不同分支,公共代码在统一文件夹下维护,软件库的版本统一

九、git远程仓库

一、需求

创建远程版本库,并把本地 Git 仓库推送上去保存

二、操作步骤

  1. 注册第三方托管平台网站账号
  2. 新建仓库得到远程仓库 Git 地址
  3. 已有本地 Git 仓库添加远程仓库原点地址
    • 基础命令:git remote add 远程仓库别名 远程仓库地址
    • 示例:git remote add origin ***.git
  4. 本地 Git 仓库推送版本记录到远程仓库
    • 基础命令:git push -u 远程仓库别名 本地和远程分支名
    • 简写示例:git push -u origin master
    • 完整写法:git push --set-upstream origin master:master

三、流程示意图逻辑

本地电脑仓库 → 执行git push命令 → 云端远程仓库,完成本地代码上传至远程托管平台。

git remote -v 查看仓库地址

git remote remove 仓库别名 删除远程仓库,重新配置远程仓库,一个本地仓库最好对应一个远程仓库

四、Gitee HTTPS 分步解决方案(按顺序执行)

  • Gitee HTTPS 推送不支持账号登录密码,必须使用「私人访问令牌」作为密码
  • 本地已缓存了错误的账号 / 密码,Git 反复复用错误凭证,不会弹出新的输入框

步骤 1:清空本地缓存的错误 Gitee 凭证(二选一即可,推荐方法 B)

方法 A:Git Bash 命令行清除(直接复制执行)
# 清除gitee.com域名下所有缓存的凭证 printf "protocol=https\nhost=gitee.com\n" | git credential reject
方法 B:Windows 图形化清除(最稳妥,不会出错)
  1. 按下Win + R,输入control keymgr.dll回车,打开凭据管理器
  2. 切换到「Windows 凭据」,找到所有名称包含gitee.com的条目
  3. 逐个点击「删除」,清空所有 Gitee 相关凭证

步骤 2:生成 Gitee 私人访问令牌(必须,不能用登录密码)

  1. 浏览器登录 Gitee 官网,点击右上角头像 → 「设置」
  2. 左侧菜单栏找到「私人令牌」,点击「生成新令牌」
  3. 填写令牌描述(如git-push),权限至少勾选projects(仓库读写权限)
  4. 点击提交,复制生成的令牌字符串并保存(仅显示一次,关闭后无法查看)

步骤 3:重新推送 main 分支

回到 Git Bash 执行推送命令:

git push <远程仓库别名> <本地分支名>
  • food(远程仓库别名):也就是你的目的地。你想把代码推送到project-handover.git,而你已经把这个仓库地址命名为了food

  • main(本地分支名):也就是你要推送的内容来源。从你的终端提示符(main)可以看出,你当前所在的分支叫main

git push -u origin main

执行后会弹出账号密码输入框:

  • 用户名:填写你的 Gitee 正确用户名YH--L
  • 密码:粘贴上一步复制的私人令牌(不要填登录密码)

可选:永久记住凭证,不用每次输入

推送成功后执行,后续无需重复输入:

git config --global credential.helper manager-core

多人协同开发

首先需要clone仓库代码到本地,后续进行拉取最新版本git pull 要拉取的仓库别名 要拉取的仓库分支

git clone https://gitee.com/YH--L/git_study.git

git pull originmain

推送失败

情况1:远程仓库(Gitee)上存在你本地没有的提交(Commit)

报错提示非常直白:

hint: Updates were rejected because the remote contains work that you do not have locally.

(更新被拒绝,因为远程仓库包含你本地没有的工作/提交。)

原因

  1. 线上生成了新文件/修改:你在 Gitee 上手动修改了文件(比如直接在网页上编辑了README.md),或者在创建仓库时勾选了“初始化 README”/“添加 .gitignore”。

  2. 多端提交:你在其他电脑上向这个仓库提交并推送过代码。

Git 为了防止你本地的代码直接覆盖远程已有的修改,所以强制拦截并要求你先拉取合并远程代码,再推送

解决方案

推荐按照以下步骤执行:

方法一:先 Pull 再 Push(推荐,安全标准做法)

在终端中依次运行以下命令:

  1. 拉取远程代码并合并

    git pull route main --rebase

    💡参数说明

    • route是你的远程仓库别名,main是分支名。

    • --rebase可以让你的提交(“添加详细注释”)树状图更加整洁,避免产生额外的 Merge Commit。

    • 如果出现冲突,按提示解决冲突后执行git rebase --continue即可;若无冲突则会自动合并。

  2. 重新推送到远程

    git push -u route main
方法二:强制推送(⚠️ 谨慎使用)

如果你确定远程仓库里多出来的东西(比如网页端自动生成的README.md)不重要,或者确定要完全以你本地的代码为准,可以使用强制推送直接覆盖远程分支:

git push -u route main -f

⚠️注意-f/--force直接抹去远程仓库中领先于本地的提交,如果是团队协作项目千万不要滥用;如果是你个人新建的空仓库,此操作是快捷有效的。

情况二,大量残余文件

解决方案

1. 彻底删除本地旧的 Git 历史文件夹
rm -rf .git

2. 把写错名字的 gitignore 重命名为标准的 .gitignore(确保有个“.”)
mv gitignore .gitignore

3. 重新初始化一个全新、干净的 Git 本地仓库
git init

4. 重新添加所有内容进暂存区(此时正确的 .gitignore 会完美把 data 拦截在外)
git add .

5. 检查暂存状态
git status
⚠️ 注意:此时绿色的文件列表中应该只有你的几 KB 脚本文件,绝对不能有 data/ 的影子!

6. 提交这个完全干净的首次版本
git commit -m "initial commit: 提交识别核心代码"

7. 重新关联你的 Gitee 远程仓库
git remote add origin https://gitee.com/YH--L/dietary_milvus7_14.git

8. 强制推送(秒速成功)
git push -u origin "master" -f