GIT 最简介易懂的入门笔记

一、序言

一句话解释GIT是什么:GIT是一个可以帮助你云备份代码的工具(GIT是个工具)

一句话解释你为什么要用GIT:开发应用时,帮助你云备份代码,还可以多人合作云备份

一句话解释GIT和GitHub和Gitee(码云)的关系:GIT一个是推送到云仓库的工具,GitHub和Gitee是云仓库

三句话看完后你可以决定你是否想看本篇博文了,另外不得不推荐一下官方的视频【码云官方推荐】8小时入门Git之团队合作讲的非常易懂,建议看完第四章再配合食用更佳

二、阐述GIT的最基础架构

用户端(本地)

工作区

程序员进行开发改动的地方,是你当前看到的,也是最新的。
平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。

暂存区

.git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、时间戳(timestamp)…),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。
当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。

本地仓库

保存了对象被提交过的各个版本代码,比起工作区和暂存区的内容,它要更旧一些。
git commit后同步index的目录树到本地仓库,方便从下一步通过git push推送本地仓库与远程仓库的同步。

云仓库(云端)

远程仓库

远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。

三、很重要的一个操作和一个指令

Frok操作 Clone命令
Web端的操作 本地执行的命令(git clone + 仓库地址)
从别人远程仓库拷贝到自己远程仓库 从(无论谁的)远程仓库下载到自己电脑
偷到自己仓库想怎么改怎么改 偷到本地想怎么用怎么用
要合并自己的代码需要pull requests操作 不是项目成员不能推送自己的修改回原仓库

四、一幅图看完基础GIT指令

工作区 暂存区 本地仓库 远程仓库 git add git commit git push git commit -a git clone git fetch git merge git pull git checkout 工作区 暂存区 本地仓库 远程仓库

五、分别用一段话解释基本用法

从云端到本地

刚开始工作区本地仓库远程仓库里面的内容都空的

扫描二维码关注公众号,回复: 11178679 查看本文章

利用git clone加远程仓库地址拉取你的远程仓库内容到本地仓库和本地工作区(clone是从无到有的过程)

此时工作区本地仓库远程仓库里面的内容都同步了,后面合作者提交新的代码

用git fetch来更新本地仓库,与远程仓库保持同步

这时本地仓库远程仓库里面的内容都同步了,工作区的代码还没有同步

更新好的的本地仓库需要利用git merge更新到工作区

工作区本地仓库远程仓库里面的内容都同步了

当我们这个分支完成后切换到其它分支的时候就用git checkout

git pull = git fetch + git merge

从本地到云端

刚开始工作区本地仓库远程仓库里面的内容都是一致

当git管理的文件夹里面的内容出现改变后(自己的写入或者删除)

此时工作区的內容就会跟本地仓库远程仓库里的不一致

当我们执行 git add 后,会将这些改变的文件内容加入暂存区

暂存区是用来暂时保存文件

接着执行 git commit 后,将Git索引中所有改变的文件内容提交至 本地仓库 中,

所以此时工作区本地仓库的内容是一致的,但他们与远程仓库内容不一致

最后使用git push同步远程仓库本地仓库

这时工作区本地仓库远程仓库里面的内容都同步了

git commit -a = git add + git commit

六、进阶理解

前提(对本地仓库的理解)

实际上我们看到的保存文件的文件夹不是仓库,还是工作区如下图
本地仓库
你所有的文件都是工作区,而暂存区和本地仓库是在.git下的文件,这些文件也不是我们看到的文件而是对于文件的快照

约定

后文中以下面的形式解释指令的作用
约定
绿色的5位字符表示提交的ID,分别指向父节点。分支用橘色显示,分别指向特定的提交。当前编辑的分支由附在其上的HEAD标识。 这张图片里显示最后5次提交,ed489是最新提交。 master分支指向此次提交,另一个maint分支指向祖父提交节点。commit的实际是向上提交文件的hash值,hash值可以看成每次提交的历史纪录

命令详解

git diff

查看两次提交之间的变动
git diff

git commit

从暂存区提交到本地仓库,变更后会产生新的hash值,可以理解陈产生新的产生新的历史纪录
git commit
如果在某个历史版本的某个分支中产生了新的更改,git会同样操作。 这样,从a47c3开始历史版本产生了两个节点,maint分支就不再是master分支的祖父节点。此时,合并 (或者 衍合) 是必须的
git commit
如果想更改一次提交记录,使用 git commit --amend。git会使用与当前提交记录相同的父节点进行一次新提交(4ca87),旧的提交记录(ed489)会被取消。
git commit -amend

git checkout

当给定某个文件名时,git会从指定的提交中拷贝文件到暂存区域和工作目录。比如,git checkout HEAD~ foo.c会将提交节点HEAD~(即当前提交节点的父节点)中的foo.c内容复制到工作目录并且加到暂存区域中。(如果命令中没有指定提交节点,则会从暂存区域中拷贝内容),注意当前分支不会发生变化。
git checkout HEAD~ file
当不指定文件名,而是给出一个(本地)分支时,那么HEAD标识会移动到那个分支(也就是说,我们“切换”到那个分支了),然后暂存区域和工作目录中的内容会和HEAD对应的提交节点一致。新提交节点(下图中的a47c3)中的所有文件都会被复制(到暂存区和工作目录中);只存在于ed489节点中的文件会被删除;不属于上述两者的文件会被忽略,不受影响。
git checkout maint
如果既没有指定文件名,也没有指定分支名,而是一个标签、远程分支、SHA-1值或者是像master~3(master分支的第三代父类)类似的东西,就得到一个匿名分支,称作detached HEAD(被分离的HEAD标识)。这样可以很方便地在历史版本之间互相切换。比如说你想要编译1.6.6.1版本的git,你可以运行git checkout v1.6.6.1(这是一个标签,而非分支名),编译,安装,然后切换回另一个分支,比如说git checkout master。
git checkout master~3
当HEAD处于分离状态(不依附于任一分支)时,git commit提交操作可以正常进行,但是不会更新任何已命名的分支。(你可以认为这是在更新一个匿名分支。)
git commit
在上面的情况下,一旦此后你切换到别的分支,比如说master,那么这个提交节点(2eecb)再也不会被引用到,然后就会被丢弃掉了。
git checkout master
但是,如果你想保存这个状态,可以用命令git checkout -b name来创建一个新的分支。如下使用了git checkout -b new生成了新的分支new
git checkout -b new

git reset

reset命令把当前分支指向另一个位置,并且有选择的变动工作区和暂存区。也用来在从历史仓库中复制文件到暂存区,而不动工作区。

如果不给选项,那么当前分支指向到那个提交。如果用–hard选项,那么工作区也更新,如果用–soft选项,那么都不变,如下图git reset HEAD~3
git reset HEAD~3
如果没有给出提交点的版本号,那么默认用HEAD。这样,分支指向不变,但是索引会回滚到最后一次提交,如果用–hard选项,工作目录也同样。(下图是 git reset)
git reset
如果给了文件名(或者 -p选项), 那么工作效果和带文件名的checkout差不多,除了暂存区被更新。
git reset --file

git marge

merge 命令把不同分支合并起来。合并前,暂存区必须和当前提交相同。如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做。 另一种情况是如果当前提交是另一个分支的祖父节点,就导致fast-forward合并。指向只是简单的移动,并生成一个新的提交。
git marge master
否则就是一次真正的合并。默认把当前提交(ed489 如下所示)和另一个提交(33104)以及他们的共同祖父节点(b325c)进行一次三方合并。结果是先保存当前目录和索引,然后和父节点33104一起做一次新提交。
git merge other

git cherry-pick

cherry-pick命令"复制"一个提交节点并在当前分支做一次完全一样的新提交。
git cherry-pick 2c233

git rebase

衍合是合并命令的另一种选择。合并把两个父分支合并进行一次提交,提交历史不是线性的。衍合在当前分支上重演另一个分支的历史,提交历史是线性的。 本质上,这是线性化的自动的 cherry-pick
gtt rebase master
上面的命令都在topic分支中进行,而不是master分支,在master分支上重演,并且把分支指向新的节点。注意旧提交没有被引用,将被回收。
要限制回滚范围,使用–onto选项。下面的命令在master分支上重演当前分支从169a6以来的最近几个提交,即2c33a。

git rebase --onto master 169a6
文章部分引用图解Git,如有侵权,立即删除

原创文章 10 获赞 10 访问量 1920

猜你喜欢

转载自blog.csdn.net/qq_42679566/article/details/104726593