Git 相关

Git 是 分布式版本管理工具。因为这里在开发后台时候使用,所以写在后台开发相关的分类下。


1. 简介

Git 是最先进的分布式版本管理工具。具体用起来就像下图这样。可以看到,对于每一个版本,都会有修改的具体说明,这样一来,方便我们进行版本控制、切换等。


Git 最终效果图

2. 使用

安装完成就可以使用了。
这里我在 windows 下使用 git。其实最好还是在 linux 下来用。
word 文件作为二进制的文件,不能被 Git 跟踪。

2.1 建立版本库
git init      // 初始化 版本库 命令

在相应的目录下,使用 git init 命令。可以看到在对应的目录下生成了 一个 .git 隐藏文件,这里面写的就是文件版本管理控制的相关信息,不能被篡改(所以才是隐藏的)。

2.2 添加文件到版本库
git add [FileName1]
git add [FileName2]      // 添加 多个文件
git commit -m "[Description]"   // 提交。 -m 后面是本次提交 的 说明

这里,建立一个 txt 文件,写入 两行 文字,然后add 和 commit


使用结果图
2.3 版本回退

这里修改一哈 test.txt 文件,在第二行最后加入 BEST,然后 使用 git status 命令查看仓库状态。可以看到,当前 test.txt 被修改,但是还没有提交。

仓库状态

如果我们要看 改了 什么内容,使用 git diff 命令。可以看到,红色哪一行代表的是更改之前版本,绿色是更改之后的,所以是在那一句后面 加了 BEST。
查看文件 diff

之后进行提交。
提交更改后版本

之后查看一下 status ,可以看到 working tree clean.
提交后查看 status

再提交一个新的版本。
这时候看一下历史版本,使用

git log //   --pretty=oneline 
git 日志

这时候可以看到我们一共提交了3个版本的文档,对应的有 ID(使用哈希加密算法算出来的一大串数字,为了在分布式工作时候不会产生冲突)、备注等。现在我们想要把版本回退到 "append REEDIT" 的版本。
Git 用 HEAD 表示当前的版本,上一个版本就是 HEAD^,依次类推,HEAD~100

git reset --hard HEAD^  // 回退到上一个版本
回退到上一个版本

版本回退后的 log

这时候还是可以到第三个版本的。只需要找到第三个版本的 ID 号即可。

git reflog  // 记录每一次命令
reflog 查找历史命令

3. 相关知识

3.1 工作区和暂存区

工作区和暂存区示意图

使用 git add 命令就是把 工作区 添加到 暂存区;
使用 git commit 命令就是把 暂存区所有的文件添加到当前分支。

仍然是之前的多次 add , 一次 commit 的关系。

3.2 管理修改

这里要明白一个概念就是说 Git 是管理的修改信息,而不是直接管理文件的。所以如果执行 修改1--> add 1 -->修改2-->commit,这个时候可以看到只是保存了 修改1 对应的内容。

3.3 撤销修改
git checkout -- [FILENAME]    //  用 版本库 里 的版本 替换 工作区 的版本。

这里有两种情况:
一种是 没有 add到 暂存区,这时候撤销就是 回到 .git 版本库中的版本
一种是 没有 commit 之前又 进行了修改,这时候撤销就是 回到 暂存区 的状态。 ( 暂存区也是版本库中的)
总之就是 回到 git commit 或者 git add 的 最近一次有记录的版本。


git reset HEAD test.txt   //  可以把 暂存区 的 test.txt 退回到 工作区

之前说的是版本回退用 git reset HEAD --hard 命令。 这里也可以 进行回退工作。


git rm [FILENAME] 用来删除 .git 版本库中的文件

这里的情景是你手动在文件目录中删除了 test.txt 文件,然后可以查看 status 看到其文件被删除,但是这个时候在版本库中还是有 这个文件的,为了做到对应,用 git rm 命令删除版本库中的文件。

4. 远程仓库

4.1 关联远程仓库

这一部分是最常用的了。
这里用本地仓库来关联 github 上面的远程仓库。
首先申请一个 github 的账号,然后 新建一个 repository。
这里本地关联线上仓库需要 SSH key 用于安全验证,向 github 证明是你自己进行上传。所以需要首先配置一下 SSH key 相关。在本地 配置一个 SSH key,然后在 github 的账号设置里面把 本地的 SSH key 公钥写进去。
windows 下 shift+右键 打开 git bash. 然后 ssh-keygen -t rsa -C "[EmailAddr]" 就生成了 SSH keys. 在 Windows 下就是 c/users/username/.ssh 目录下 就会有 SSH keys 配置文件。id_rsa 是私钥,id_rsa.pub是公钥。


SSH keys

然后进行关联。这里 git remote add [RemoteRepName] [RemoteAddr]。默认用了 origin ,一般看到这个 origin 都知道是远程仓库。


关联仓库

然后可以 push 一哈。push 命令就是把本地仓库的指定分支都 push 到线上仓库。可以看到这里的 git push origin master 把本地 master 分支 push 到 origin.
push

可以看到线上的 Github 已经有了
线上仓库
4.2 分支

分支就好像是在 master 之前跑的一点的一个进度。如果你在开发工程,自己写的代码还没有确定是万无一失的,就需要一个分支,先存下来,而这个分支不会影响 master 中的代码。


分支示意图

我们看一下具体的例子。
在线上建立一个 名为 gitskills 仓库。然后 git clone 下来。
创建一个 dev 分支

git branch dev   // 创建
git checkout dev   // 切换

然后 git branch 查看分支。带 * 的是当前分支


查看分支

然后更改 readme.md,之后提交更改。


在dev分支下做更改

之后切换到 master 分支,发现在 dev 分支里面做的更改,已经看不到了。说明 dev 分支和 master 分支是独立的。
分支相互独立

现在合并分支,可以看到,dev 分支被合并到 master 分支,里面的更改是可见的了。

git merge [BranchName]   #合并分支到当前分支。
合并分支

分支合并之后,删除之前的分支,世界又清净整洁了。


删除分支

解决冲突
建立一个 feature1 分支,然后在该分支下 编辑 readme.md 之后提交;然后在 master 分支下也编辑 提交。两次编辑的内容不同。这时候 merge 就会产生 conflict

两个分支同时编辑产生 conflict

这时候查看 文件。看到了不同的地方,然后手动 更改。
手动清除 conflict

之后再提交,可以看到 conf 解决了,合并成功了。可以删除 feature1 分支了。
冲突解决后提交

git log --graph 可以查看分支合并图
分支合并图

no-ff 模式合并

直接用 merge 都是普通合并模式,采用 fast-foward 方式合并。如果加参数 --no-ff 则是 recursive 方式合并。
这种合并方式要提交一个新的 commit ,所以要加一个 -m 参数。


no-ff 合并分支

no-ff分支图

ff 分支图

no-ff 和普通合并的区别在于,no-ff 方式可以保留分支历史。


区别
分支策略

一张图说明分支策略。即 master 只用来做新版本发布,开发都在 dev,每个人又有自己的分支。


分支策略图

5. 常用操作

add所有变化
git push  #   自然要求是有 remote 仓库的。 这个时候不用指定分支,直接是之前 clone 的分支

git commit 操作之后会自动生成一个版本序列号。然后 git push 把本地仓库的版本序列号同步到远程仓库

git clone # 将远程仓库 clone 下来

这个操作会自动和被克隆的仓库 remote 连接。

git fetch  

首先要了解 FETCH_HEAD:是一个版本链接文件,记录在 .git/ 目录下,记录着 目前已经从远程仓库取下来的分支的末端版本(即取的时候的最新版本)
而 git fetch 命令就是 更新远程仓库中包含分支的最新版本号,记录到本地FETCH_HEAD文件中(即将本地版本和远程最新版本对应起来。)

git pull

其实 git pull 相当于一个复合命令。
首先,基于本地的 FETCH_HEAD 记录,比对本地的 FETCH_HEAD 记录与远程仓库的版本号,然后 git fetch 获取当前指向分支的后续版本数据,然后利用 git merge 将其与本地的当前分支合并。
总之,就是把当前分支的最新的版本从远程仓库拉下来,与本地仓库的版本来 merge 一哈。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Git 是一个很强大的分布式版本控制系统。它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势...
    熊熊要更努力阅读 261评论 0 0
  • 一、新建远程仓库 : 方法一:只是新建了远端仓库,本地 没有 关联 curl -u 'username'https...
    默小柒阅读 677评论 0 1
  • 今天有些不舒服,画的时候头疼的要死,强忍着画完了,巴望着能快些好起来。 最近事情也相当多,我的娱乐时...
    深吉月阅读 303评论 0 1
  • 文|时光恰巧 参赛编号:436 有的人活着他已经死了。有的人死了他还活着。有的人变成虫子,活着亦等于死了。 从来没...
    时光恰巧阅读 406评论 6 15
  • "快点来人救救我们!”这时雪山应急救援队接受到求救信号。队长常风立刻组织队员对这这一信号位置进行核实。 “大家准备...
    提莫慧阅读 275评论 5 6