git原理

远程仓库:一般是开源的网站

本地仓库:自己电脑的.git目录,每次commit会存到这里,每次是一个快照,有个commit id。

缓存区:git add添加工作区改动内容到缓存区,准备commit到本地仓库的

工作区:修改添加删除文件的地方,需要提交的内容,可以先git add到缓存区,最后一起commit到本地仓库。

分支(branch)

指向某个快照的指针,分支名就是指针名。哈希值是无法记忆的,分支使得用户可以为快照起别名。而且,分支会自动更新,如果当前分支有新的快照,指针就会自动指向它。比如,master 分支就是有一个叫做 master 指针,它指向的快照就是 master 分支的当前快照。

Git 有一个特殊指针HEAD, 总是指向当前分支的最近一次快照。另外,Git 还提供简写方式,HEAD^指向 HEAD的前一个快照(父节点),HEAD~6则是HEAD之前的第6个快照。

每一个分支指针都是一个文本文件,保存在.git/refs/heads/目录,该文件的内容就是它所指向的快照的二进制对象名(哈希值)。

相关操作:

git会将文件以SHA1 哈希值(长度40的字符串)作为文件名,保存在.git/objects目录,采用HashTable的方式进行查找。

git fetch只是将远程仓库更新拉到本地仓库,这时候不会有冲突,merge的时候才可能会有冲突。

git pull 等于fetch和merge2个操作。

冲突处理:1、用拉取到本地仓库的代码强制覆盖工作区,git checkout head .  (注意: 别遗漏 "head" 后的 " ." 

                  2、git stash丢弃本地修改,然后git pull,然后合并git stash pop,解决冲突。

git reset:

--soft参数告诉Git重置HEAD到另外一个之前的commit,会暂存更改,还可以保留之前内容 来重新提交。

--mixed是reset的默认参数,也就是当你不指定任何参数时的参数。它将重置HEAD到另外一个commit,并且重置index以便和HEAD相匹配,但不会暂存更改。还可以保留之前内容 来重新提交。

--hard参数将会blow out everything.它将重置HEAD返回到另外一个commit(取决于~12的参数),重置index以便反映HEAD的变化,并且重置working copy也使得其完全匹配起来。这是一个比较危险的动作,具有破坏性,数据因此可能会丢失!如果真是发生了数据丢失又希望找回来,那么只有使用:git reflog命令了

git revert:

Git revert用来撤销某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交。git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。

Git revert和git reset都可以进行版本的回退,将工作区回退到历史的某个状态,二者有如下的区别:

  • git revert是用一次新的commit来回滚之前的commit,而git reset是直接删除指定的commit(并没有真正的删除,通过git reflog可以找回),这是二者最显著的区别;

  • git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容;

Git fork:不是命令,是工作流,大概是复制服务端仓库,合作开发各自提交到自己服务端仓库;(见百度)

Git rebase:衍合,(见百度)

git checkout命令用于切换到某个快照;

git show命令用于展示某个快照的所有代码变动。

 

各个ide关于git的集成操作,和命令差不多, 有一个git history可以查看历史记录、分支和commit情况

 

待研究:不同分支之间的操作,以及不同特殊场景下命令的作用范围?

关于git秘钥配置自行百度。

 

### Git 的工作原理 Git 是一种分布式版本控制系统,其核心设计理念在于支持高效的代码管理和团队协作。以下是关于 Git 工作原理及其流程的详细介绍: #### 1. **Git 的基本结构** Git 使用对象数据库来存储所有的历史记录和元数据。这些对象主要包括三种类型: - **Blob 对象**:用于保存文件的实际内容。每次提交都会生成一个新的 Blob 对象[^1]。 - **Tree 对象**:表示目录结构,指向多个 Blob 或其他 Tree 对象。 - **Commit 对象**:代表一次提交的历史快照,包含树对象的哈希值、作者信息以及父 Commit 的指针。 通过这种设计,Git 能够高效地追踪每一次更改,并允许开发者轻松回溯到任何特定的时间点或状态。 #### 2. **Git 的三大区域** 理解 Git 的工作机制离不开对其三个主要区域的认识: - **工作区(Working Directory)**:这是用户实际编辑文件的地方。 - **暂存区(Staging Area/Index)**:当执行 `git add` 后,改动会被放入这里等待最终确认进入版本库。 - **版本库(Repository)**:包含了所有已提交的数据及完整的变更历史记录[^3]。 #### 3. **Git 的典型操作流程** ##### (1)初始化与配置 首次使用前需设置用户名邮箱等基本信息以便后续标记贡献者身份: ```bash git config --global user.name "Your Name" git config --global user.email "your_email@example.com" ``` ##### (2)创建/克隆仓库 可以新建一个空的本地仓库或者从远程服务器复制现有项目下来作为起点: ```bash # 创建新的本地仓库 git init # 克隆已有项目至本地 git clone https://github.com/example/repo.git ``` ##### (3)日常开发中的增删改查动作 假设我们已经处于某个项目的根路径下,则可按如下方式管理源码变化: - 查看当前状态差异情况:`git status` - 添加单个或多份待处理文档至索引列表:`git add filename(s)` - 提交更新后的成果并附带描述说明:`git commit -m "Message"` 对于那些暂时不想立即解决却又不愿丢失进度的部分,还可以利用 stash 功能将其隐藏起来稍后再恢复继续作业[^2]: ```bash # 存储未完成的任务 git stash # 完成其他事务后重新加载之前搁置的东西 git stash pop ``` ##### (4)分支管理策略 为了更好地促进多人合作模式下的分工效率提升,合理运用分支机制显得尤为重要。例如针对功能模块划分独立线路开展实验性质尝试而不影响主线稳定性[^4]: ```bash # 新建名为feature_x的新支路同时切换过去 git checkout -b feature_x # ...在此期间自由实施各种调整... # 当准备就绪时合并回到master主干线上去 git checkout master git merge feature_x ``` 如果遇到不可避免的分歧现象也不要惊慌失措,按照提示逐步定位具体位置然后手动修正即可[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值