一、Git的基本原理
1.Git的三层架构(Git是一个 版本管理 协议)
暂存区临时储存最新版本的更改,而库的含义是包含所有历史版本的该项目的所有信息。
可以理解为 代码——1个版本——版本库 的三层结构

2.Github的定位
Github是一个免费的可以把“库”保存在云端的网站,同时Github设立的初衷是为了代码开源。
国内相似定位的有Gitee等。
3.git相关下载
Git下载【必装】:https://git-scm.com/downloads 安装无脑下一步即可
Github桌面版下载:https://desktop.github.com 不如Sourcetree热门,两者可互相替代
Git可视化管理软件Sourcetree:https://www.sourcetreeapp.com
GitIDE插件和其他:https://www.cnblogs.com/sexintercourse/p/16280412.html
二、Git的本地操作
首先我们不考虑,库和库之间的操作,单从本地的三层架构谈谈Git的基本用法
git init
执行该命令后,会在当前目录下创建一个名为当前文件夹名称的项目。
例如:新建一个gitstudy的文件夹后,进入该文件夹,执行git init后自动生成一个名为gitstudy的库。库内有一个默认分支Master
是否生成成功可以根据是否生成一个名为.git(该项目所有git相关文件都放在这个文件夹内)的隐藏文件夹
git add . //更新所有文件
git add [file名]或[dir名] //更新指定文件或文件夹,如 git add a.txt更新a.txt
git status //查看暂存区的版本和 上次提交的暂存区版本 有哪些文件不同
git status -s //作用同上但其输出更简洁 较常用
执行add命令后,会从工作区更新暂存区。也就是说会生成一个版本,但该版本还没有提交到本地库中。该版本的具体信息可以用status命令查看
git commit -m [message] //把[message]作为版本说明上传
执行该命令后,会在本地库里正式生成一个新的版本
三、Git的版本管理
这里说的版本管理,暂时特指一个库内部的版本管理(而不是多个库之间的)。git对于个人开发者来说最大的用处就是其版本管理。具体怎么使用分支因人而异,也有很多成熟的使用分支控制不同版本的方法,下图是一种比较有效率的分支方式。
首先结合下面这张图 介绍一下各个对象的寻找和命名方式:
1.下图中每一个点(A、B、C……),正式专业名词叫 一个commit对象 ,用一个<sha-1编码>表示。(如A的真实commit id可能是3e92c19)
2.每一个branch(分支)是严格按照时间线的,所以当我们说 Master分支的版本时,其实就是指P点这个版本。
3.我们用Head*指向当前需要操作的点(commit对象),也就是说我们下面要介绍的命令都有一个隐含条件,即对Head*进行操作。正常状态下,Head*指向的是当前分支的最新提交。

git branch
没有参数时,git branch 会列出你在本地的分支。
git branch [branchname] //新建一个名为branchname的分支
$ git branch testing //假设我们本来只有一个master分支
$ git branch //现在我们有了两个分支 切通过*位置看出head仍指向master * master testing
git checkout [分支名或Sha1值] //把Head指针切换到指定commit对象
虽然该命令实际本质是切换Head指针指向的对象,但我们在本节开头提过,我们说testing分支时没有歧义的表示testing分支的最新提交。所以我们可以通过以下命令达到分支切换的效果(切记其本质是切换Head指向的点)
git checkout testing //切换到testing分支
git branch -d 【branchname】
git有两种合并分支的方法,merge和rebase,其中merge是较常用和保险的方法
git merge [branchname] //当前分支合并branchname分支的内容
git rebase [branchname] //当前分支合并branchname分支内容
两种方式的异同和解释如下,假设Head指针现在E处(frature),如下图所示。
执行git merge develop之后 :
生成了一个新节点F。C、D、E没有改变,该方法较为安全,但会额外产生一个节点,不太美观。
执行git rebase develop之后 :
C、D、E都分别与B进行了合并,C、D、E都发生了改变,没有生成新节点。该方法不用额外生成节点,但C、D、E的原版本没有保留,这是比较危险的。
一般来讲在远程仓库特别是协作项目,不使用rebase合并。而一般在本地的项目(C、D、E)并没有做太多工作,而develop分支频繁更新时,不为了C、D、E的少量工作额外生成新的节点,直接rebase。
有合并就有冲突,理想的情况是fetchA修改文件A,fetchB修改文件B,两个fetch直接合并,得到修改的A和B。但fetchA和fetchB可能都修改了文件C,这就会产生冲突,合并请求会被挂起。
git merge --abort //可以执行此命令中止合并
git会自动在原文件冲突位置标识,在修改文件后。执行git add和git commit(即更新版本之后),自动进行未完成的merge操作
git reset --hard HEAD #恢复当前版本,删除工作区和缓存区的修改
git reset --soft HEAD^ #恢复上一个版本,保留工作区,缓存区准备再次提交commit
git reset --mixed HEAD #恢复当前版本,保留工作区,清空缓存区
git reset --hard 1094a #切换到特定版本号,并删除工作区和缓存区的修改
git reset --hard HEAD~2 #回滚2个版本
回滚后,末端的提交(如回滚两个版本就是末端的两个提交)就变成了孤儿提交,Git执行垃圾清理时会删除
四、Git的远程仓库管理
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。
也就是说我们需要管理远程仓库和本地仓库之间的关系

git clone [仓库url(以.git为结尾的地址或ssh]
//从https://github.com/xiaoming/test.git克隆一个仓库并命名为myname
git clone https://github.com/xiaoming/test.git myname
如果我们只是单纯的想下载最新的一个版本,加快下载速度,而不是整个包含所有历史版本的库可以用
git clone --depth 1 [url]
克隆完成后,远程仓库的名字会被默认命名为origin。origin就相当于[仓库url]的别名,该别名只可在本地使用(因为这是你自己起的名字,别人不认)。如果我们不想用origin这个名字,可以使用
git remote rename [旧仓库名] [新仓库名]//将指定地址仓库url命名
$ git remote add [远程仓库别名] [仓库url] //添加别名
$ git remote rm [远程仓库别名]//删除别名
git有两种获取更新的方法,fetch和pull,其中fetch是较常用和保险的方法
git fetch [仓库名] //从指定仓库获取更新 git fetch [仓库名] [分支名] //只更新指定仓库的指定分支
git pull [仓库名] //从指定仓库获取更新
git pull [仓库名] [分支名] //只更新指定仓库的指定分支
首先我们先用一张图看fetch干了什么,当你做git fetch时,它从远程仓库获取所有的变化,并将其存储在本地仓库的一个单独分支中,其命名为[仓库名/分支名]。下图两个仓库的同名分支(master)并没有完全合并,而是把远端仓库不同的分支保留了下来,重命名为了(origin/master)。
当然接下来我们就可以手动进行merge操作,合并master和origin/master。pull则是fetch+merge的结合体,获取更新时,直接完全合并两个同名分支。相比fetch,虽然减少了一步merge操作,但无疑是更危险的
git push [远程仓库名] [本地分支名]:[远程分支名]
git push [远程仓库名] [本地分支名] //自动匹配同名远程分支,没有则新建一个分支
push可以理解为pull的反向操作,同样有合并的问题。
为避免上传的分支有冲突,实际使用时我们会先pull/fetch一下远程仓库,获取远程仓库的最新数据,再push上传。
五、配置Github作为远程仓库
第四节我们讲的所有操作都是针对url链接,如果这个url仅在局域网范围内使用,无疑是安全的。但显然我们不可能让所有人都能直接通过url修改远程仓库。所以我们要使用ssh代替url链接(但只单纯 读取github 如 git clone是可以用url的)。
Git和Github连接的具体图文配置详见:https://m.runoob.com/git/git-remote-repo.html,这里只做简单介绍。
如果我们使用Github客户端管理Git可以省下这一步(不推荐)
1.任意地址执行:
//youremail@example.com为github注册邮箱 ssh-keygen -t rsa -C "youremail@example.com"
2.生成的ssh key输入到github网页
3.可以正常使用自己的git地址了
//如添加别名 git remote add [远程仓库别名] [url]
0 条评论