从入门到放弃——Git
一、前言
当我们在自己的编辑器比如vscode写代码时,一不小心就写出了世界上最强大的操作系统内核,完美实现进程调度,进程通信,虚拟内存管理· · · · · ·等功能😋
但是由于一个人写内核需要非常大的精力和投入,并且你得防范邻居家的小孩偷偷在你的磁盘里搞些小动作,比如为了他喜欢的动画片而删除你的代码文件。
我知道,这是一件很令人崩溃的事情😭
所以,利用git来进行版本控制是必要的,他既可以当存档,又能让你和同事分工合作。

二、git的安装与配置
我们可以通过访问官网https://git-scm.com/?hl=zh-cn来安装git。
安装好后,需要进行一些基本配置!
# 设置用户名和邮箱(提交时显示)git config --global user.name "你的名字"git config --global user.email "你的邮箱@example.com"生成密钥,并将此内容添加到远程仓库比如github
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"三、git里的重要概念
- 工作区:也就是你电脑里本地在操作的文件夹或者文件
- 暂存区:git add后会被放在这里,等待提交
- 本地仓库:git commit后,文件永久保存在本地Git仓库
- 远程仓库:git push后,会同步到的地方,比如github
四、初始化仓库与克隆
1.初始化仓库
简单来讲,就是在你要工作的那个文件夹使用git init命令。
初始化仓库适用于项目最初完全由你来开发,而不是从github克隆别人的仓库。
mkdir your-project #创建文件项目cd your-project #进入对应文件夹git init初始化完成后,我们需要绑定一下远程仓库,在github项目上拿到ssh后,输入以下命令
git remote add origin 你的ssh2.克隆现有的仓库
通过git clone命令来克隆现有的仓库,下面展示的是通过ssh方法。
git clone git@github.com:username/repo.git3.参加开源贡献
如果你是参加开源项目,那么你还得在github fork一下对应仓库
这时候你的账号底下会多一个一模一样的仓库。
接着使用git clone命令把他克隆下来。
接着添加关联项目,目的是为了同步作者的跟新,你的操作依然在main分支里。
cd 项目名# 把原项目地址添加为 upstream (上游)git remote add upstream https://github.com/原作者用户名/项目名.git接着如果你想合并作者的更新,那么可以进行如下操作
这里为什么不用pull?pull是拉取并合并,但是我推荐你先拉下来看看,然后自己决定要不要合并。🤔
# 1. 从原作者那里拉取最新代码git fetch upstream
# 2. 合并到你的本地主分支git merge upstream/main# (注意:现在很多项目主分支叫 main,老项目可能叫 master)
# 3. 推送到你自己的 GitHub 仓库git push origin main最后,当你提交了代码到仓库后,你想让作者采纳你的想法,可以进行PR,也就是pull request。
记得写好单元测试,集成测试,符合代码规范与cicd。
这样作者在进行代码审查时,采纳你的想法的概率会大大提高!😚
以下是流程
1. 从主分支创建功能分支2. 开发功能并提交3. 推送到远程仓库4. 创建 Pull Request5. 代码审查6. 合并到主分支7. 删除功能分支五、提交文件至远程仓库
首先使用git add命令将文件添加至暂存区
git add <file> # 添加特定文件git add . # 添加所有修改查看状态git status
这里可以看到各个文件的状态
git status提交更改git commit这会将暂存区内容添加至本地仓库
git commit -m "提交信息"git commit -am "直接提交修改的文件" # 不添加新文件时使用#我们最好在“提交信息”那里写上 状态-具体描述,这是一个好习惯!#比如 feat: 添加用户登录功能查看提交历史git log
git loggit log --oneline # 简洁显示git log --graph # 图形化显示取消暂存区文件git reset ,HEAD是个指针,不过你并不需要了解他🐧
git reset HEAD <file>撤销暂存区修改git restore,这里主要推荐使用这个,checkout属于兼容旧版本,具有多功能
git checkout -- <file> # Git < 2.23git restore <file> # Git >= 2.23提交至远程仓库
git pull#如果是第一次提交则需要加上origin maingit pull origin main六、分支管理操作
利用好分支,可以提高协作效率!
1.查看分支
git branch # 本地分支git branch -a # 所有分支(包括远程)git branch -v # 查看最后提交2.创建分支
git branch 分支名git checkout -b 分支名 # 创建并切换3.切换分支
我们推荐使用switch,官方也是这么做的!😎
git checkout branch-namegit switch branch-name#推荐!4.删除分支
git branch -d branch-name # 安全删除git branch -D branch-name # 强制删除5.合并分支
git switch maingit merge branch-name以下是最常见的分支名称及作用
# 主分支main # 生产代码develop # 开发分支
# 功能分支命名feature/user-auth # 功能开发bugfix/login-error # bug修复hotfix/critical-bug # 紧急修复release/v1.2.0 # 版本发布七、分工协作流程
关联远程仓库
git remote add origin <url>git remote -v # 查看远程仓库git remote rename origin upstream # 重命名拉取与推送
# 拉取更新git pull origin main # 拉取并合并git fetch origin # 只拉取不合并
# 推送分支git push origin branch-namegit push -u origin branch-name # 设置上游分支
# 强制推送(谨慎使用!)git push --force-with-lease # 安全强制推送出现冲突
# 1. 拉取最新代码git pull origin main
# 2. 出现冲突时,Git会提示<<<<<<< HEAD你的代码=======别人的代码>>>>>>> branch-name
#3.如何解决?#通过协商来选择较合适的代码,接着就是提交合并八、常见问题处理
后悔药——旮旯给木回档操作大全😭
1.误删恢复
# 找到删除的提交,只显示包含删除操作(D)的提交,并列出被删除的文件名。运行后拿到对应哈希值git log --diff-filter=D --summary
#备选方案:如果你知道具体文件名,也可以用 git log --all -- <file-path> 来查看该文件的历史记录,找到最后一次出现的 commit hash。
# 恢复文件git checkout <commit-hash>^ -- <file-path>
#<commit-hash>:替换为你刚才找到的那串字符(即删除文件的那次提交)。#^:这个符号非常关键! 它代表“该提交的父版本”,也就是删除操作发生之前的那一刻。#<file-path>:替换为你要恢复的文件路径(例如 src/main.js)。举个栗子,假设你找到的删除提交 hash 是 abc1234,被删的文件是 test.txt,那么命令就是:
git checkout abc1234^ -- test.txt2.重置
soft模式——温和
- 效果:只撤销 git commit,将 HEAD 指针移回指定提交,但保留你的修改,并且这些修改依然在暂存区。
- 场景:你提交(commit)后,发现提交信息写错了,或者想再补充几个文件一起提交。
mixed 模式:默认的撤销
- 效果:撤销 git commit 和 git add,将 HEAD 指针移回指定提交,保留你的修改,但会将修改从暂存区移出,放回
- 工作区。这是 git reset 的默认模式。
- 场景:你提交后,觉得这次提交的内容太多太杂,想重新规划哪些文件一起提交。
hard 模式:最彻底的撤销
- 效果:撤销一切!将 HEAD 指针移回指定提交,并且丢弃暂存区和工作区的所有修改,让代码库完全恢复到指定提交的状态。
- 场景:你本地改乱了,想彻底放弃所有未提交的更改,回到某个干净的版本。
- 警告:此操作不可逆,会永久删除你的本地修改,使用时务必小心!🤡🤡🤡
git reset --soft HEAD~1 # 撤销提交,保留更改git reset --mixed HEAD~1 # 默认:撤销提交和暂存git reset --hard HEAD~1 # 危险!删除提交和更改⚠️ 核心警告:不要对已推送的代码使用
git reset 会重写本地的提交历史。如果你的代码已经通过 git push 推送到远程仓库(如 GitHub),千万不要使用 git reset,因为这会导致你的本地历史和远程历史不一致。
如果你需要撤销已推送到远程的提交,应该使用 git revert 命令。它会创建一个新的提交来反向抵消之前的更改,这是一种安全且不会重写历史的撤销方式。
一句话总结:git reset 是你本地的“后悔药”,但一旦代码分享给别人(push 到远程),就应该用 git revert 这种更安全的方式来修正。
- git reset:会直接删除或重写提交历史。这在本地开发时很好用,但如果代码已经推送到远程仓库,就会破坏公共历史,给其他协作者带来麻烦。
- git revert:不改变历史,而是增加一个新的“反向提交”。这个新提交的内容恰好是目标提交的“反面”(比如,原提交添加了代码A,revert提交就会删除代码A)。
git revert使用如下
#查看提交历史,拿到对应哈希,假设a1b2c3dgit log --onelinegit revert a1b2c3d3.找回丢失的提交
# 查看所有操作记录git reflog# 恢复特定提交git checkout <commit-hash>分支提交错误
# 1. 查看日志git log --oneline# 2. 切回正确分支并应用git checkout correct-branchgit cherry-pick <commit-hash># 3. 回退错误分支git checkout wrong-branchgit reset --hard HEAD~1#注意危险!停止追踪
停止追踪一个文件
git rm --cached <file-path># 例如:git rm --cached .env停止追踪整个目录
git rm -r --cached <directory-path># 例如:git rm -r --cached node_modules/清除所有追踪
git rm -r --cached .这个移除操作本身也是一次代码变更,需要提交。
git commit -m "删除文件" #提交文件到本地仓库git push #推送到远程仓库,注意这样的操作会删除github远程仓库里的文件,但是本地文件依然存在但是利用这种操作方法,并不会清除掉github上的历史,敏感信息依旧不会被清除。
所以你最好事先配置.gitignore
gitignore配置
# 依赖目录node_modules/vendor/
# 构建输出dist/build/*.exe*.dll
# 配置文件(包含敏感信息).envconfig.local.js
# 编辑器文件.vscode/.idea/*.swp
# 系统文件.DS_StoreThumbs.db
# 日志文件*.loglogs/不小心把公司数据明文上传了?
哦,那可太不小心了。🤔别怕,还有救!
首先先本地备份一个,万无一失!😚
如果你已经修改本地git历史,并想要同步远程,那么就得强制推送!
#查看是哪个笨比哪次提交的,拿到哈希值git log
#适用于删除最近的提交,且未推送到远程仓库的情况。N表示最近N次git rebase -i HEAD~N
#强制推送到远程仓库(如已推送过):git push origin <branch-name> --force彻底移除
git filter-repo --path <file-path> --force#强制推送git push --force --all例如
# --path 指定要删除的路径,--invert-paths 表示反向选择(即剔除该路径)# --force 用于强制执行(防止工具提示非全新 clone 而拒绝工作)git filter-repo --path tinyLinuxISO --invert-paths --forcegit filter-repo --path raidConfigure_linux --invert-paths --forcegit filter-repo --path .idea --invert-paths --forcegit-filter-repo 出于安全保护机制,在重写历史后,会自动删除你本地关联的远程仓库地址(origin)。如果你直接 push,会报 fatal: ‘origin’ does not appear to be a git repository 的错误。
所以,我们需要重新绑定新仓库,然后单独推送 main 分支
# 1. 重新绑定你新建的纯净远程仓库地址git remote add origin http://你的Git地址/你的项目.git
# 2. 将本地的 main 分支推送到远端(仅推送这一条线,抛弃其他旧分支)git push -u origin main参考文章:
https://blog.csdn.net/u013488276/article/details/159572078
九、总结
Git对于新手来说确实很难用!但是我们只有多次尝试才能熟练掌握他!
部分信息可能已经过时









