mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
2226 字
6 分钟
Git从入门到放弃
2026-03-31

从入门到放弃——Git#

一、前言#

当我们在自己的编辑器比如vscode写代码时,一不小心就写出了世界上最强大的操作系统内核,完美实现进程调度,进程通信,虚拟内存管理· · · · · ·等功能😋

但是由于一个人写内核需要非常大的精力和投入,并且你得防范邻居家的小孩偷偷在你的磁盘里搞些小动作,比如为了他喜欢的动画片而删除你的代码文件。

我知道,这是一件很令人崩溃的事情😭

所以,利用git来进行版本控制是必要的,他既可以当存档,又能让你和同事分工合作。

aaa

二、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克隆别人的仓库。

Terminal window
mkdir your-project #创建文件项目
cd your-project #进入对应文件夹
git init

初始化完成后,我们需要绑定一下远程仓库,在github项目上拿到ssh后,输入以下命令

Terminal window
git remote add origin 你的ssh

2.克隆现有的仓库#

通过git clone命令来克隆现有的仓库,下面展示的是通过ssh方法。

Terminal window
git clone git@github.com:username/repo.git

3.参加开源贡献#

如果你是参加开源项目,那么你还得在github fork一下对应仓库

这时候你的账号底下会多一个一模一样的仓库。

接着使用git clone命令把他克隆下来。

接着添加关联项目,目的是为了同步作者的跟新,你的操作依然在main分支里。

Terminal window
cd 项目名
# 把原项目地址添加为 upstream (上游)
git remote add upstream https://github.com/原作者用户名/项目名.git

接着如果你想合并作者的更新,那么可以进行如下操作

这里为什么不用pull?pull是拉取并合并,但是我推荐你先拉下来看看,然后自己决定要不要合并。🤔

Terminal window
# 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 Request
5. 代码审查
6. 合并到主分支
7. 删除功能分支

五、提交文件至远程仓库#

首先使用git add命令将文件添加至暂存区

git add <file> # 添加特定文件
git add . # 添加所有修改

查看状态git status

这里可以看到各个文件的状态

git status

提交更改git commit这会将暂存区内容添加至本地仓库

Terminal window
git commit -m "提交信息"
git commit -am "直接提交修改的文件" # 不添加新文件时使用
#我们最好在“提交信息”那里写上 状态-具体描述,这是一个好习惯!
#比如 feat: 添加用户登录功能

查看提交历史git log

Terminal window
git log
git log --oneline # 简洁显示
git log --graph # 图形化显示

取消暂存区文件git reset ,HEAD是个指针,不过你并不需要了解他🐧

Terminal window
git reset HEAD <file>

撤销暂存区修改git restore,这里主要推荐使用这个,checkout属于兼容旧版本,具有多功能

git checkout -- <file> # Git < 2.23
git restore <file> # Git >= 2.23

提交至远程仓库

Terminal window
git pull
#如果是第一次提交则需要加上origin main
git pull origin main

六、分支管理操作#

利用好分支,可以提高协作效率!

1.查看分支#

Terminal window
git branch # 本地分支
git branch -a # 所有分支(包括远程)
git branch -v # 查看最后提交

2.创建分支#

Terminal window
git branch 分支名
git checkout -b 分支名 # 创建并切换

3.切换分支#

我们推荐使用switch,官方也是这么做的!😎

Terminal window
git checkout branch-name
git switch branch-name#推荐!

4.删除分支#

Terminal window
git branch -d branch-name # 安全删除
git branch -D branch-name # 强制删除

5.合并分支#

Terminal window
git switch main
git 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 # 重命名

拉取与推送

Terminal window
# 拉取更新
git pull origin main # 拉取并合并
git fetch origin # 只拉取不合并
# 推送分支
git push origin branch-name
git push -u origin branch-name # 设置上游分支
# 强制推送(谨慎使用!)
git push --force-with-lease # 安全强制推送

出现冲突

Terminal window
# 1. 拉取最新代码
git pull origin main
# 2. 出现冲突时,Git会提示
<<<<<<< HEAD
你的代码
=======
别人的代码
>>>>>>> branch-name
#3.如何解决?
#通过协商来选择较合适的代码,接着就是提交合并

八、常见问题处理#

后悔药——旮旯给木回档操作大全😭#

1.误删恢复#

Terminal window
# 找到删除的提交,只显示包含删除操作(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.txt

2.重置#

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使用如下

Terminal window
#查看提交历史,拿到对应哈希,假设a1b2c3d
git log --oneline
git revert a1b2c3d

3.找回丢失的提交#

Terminal window
# 查看所有操作记录
git reflog
# 恢复特定提交
git checkout <commit-hash>

分支提交错误#

# 1. 查看日志
git log --oneline
# 2. 切回正确分支并应用
git checkout correct-branch
git cherry-pick <commit-hash>
# 3. 回退错误分支
git checkout wrong-branch
git 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 .

这个移除操作本身也是一次代码变更,需要提交。

Terminal window
git commit -m "删除文件" #提交文件到本地仓库
git push #推送到远程仓库,注意这样的操作会删除github远程仓库里的文件,但是本地文件依然存在

但是利用这种操作方法,并不会清除掉github上的历史,敏感信息依旧不会被清除。

所以你最好事先配置.gitignore

gitignore配置#

# 依赖目录
node_modules/
vendor/
# 构建输出
dist/
build/
*.exe
*.dll
# 配置文件(包含敏感信息)
.env
config.local.js
# 编辑器文件
.vscode/
.idea/
*.swp
# 系统文件
.DS_Store
Thumbs.db
# 日志文件
*.log
logs/

不小心把公司数据明文上传了?#

哦,那可太不小心了。🤔别怕,还有救!

首先先本地备份一个,万无一失!😚

如果你已经修改本地git历史,并想要同步远程,那么就得强制推送!

Terminal window
#查看是哪个笨比哪次提交的,拿到哈希值
git log
#适用于删除最近的提交,且未推送到远程仓库的情况。N表示最近N次
git rebase -i HEAD~N
#强制推送到远程仓库(如已推送过):
git push origin <branch-name> --force

彻底移除

Terminal window
git filter-repo --path <file-path> --force
#强制推送
git push --force --all

例如

# --path 指定要删除的路径,--invert-paths 表示反向选择(即剔除该路径)
# --force 用于强制执行(防止工具提示非全新 clone 而拒绝工作)
git filter-repo --path tinyLinuxISO --invert-paths --force
git filter-repo --path raidConfigure_linux --invert-paths --force
git filter-repo --path .idea --invert-paths --force

git-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://git-scm.com/doc

https://blog.csdn.net/u013488276/article/details/159572078

https://www.cnblogs.com/binlicoder/p/19358566

https://try.github.io/

九、总结#

Git对于新手来说确实很难用!但是我们只有多次尝试才能熟练掌握他!

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Git从入门到放弃
https://fatdog.20060113.xyz/posts/git/
作者
神秘大胖狗
发布于
2026-03-31
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00