2.8.1Git项目管理

总目录:https://www.jianshu.com/p/e406a9bc93a9

Python-后端 - 子目录:https://www.jianshu.com/p/29d6539d6554

官方手册:https://git-scm.com/docs

参考:https://morvanzhou.github.io/tutorials/others/git/1-1-why/

为什么需要git

当你正在变成码农的路上,或者已经是码农的时候,就需要git了。

他会将同一个文件的不同历史版本变成一个文件。

下载路径:https://git-scm.com/downloads

一路默认参数下一步安装即可。


创建/修改版本库


创建版本库

首先找到 git bash,打开它。

然后添加用户标识,我们添加两个标识,分别是user.name和user.email

建立用户标识
查看用户标识

在git bash中,它遵循shell的命令。

我们新建一个文件夹用来当版本库。

建立版本库

我们可以看到他生成了一个.git的隐藏文件夹,我们看看他里面都是什么

git内容

这里面的数据不要随意修改。


添加文件管理

之后我们就要往版本库里面添加文件了

添加文件

我们直接在版本库内新建一个文件。

查看

但是查看发现,这个文件并没有被纳入版本库。

我们看到提示中让我们使用一个命令  git add。

提交改变

这样,这个文件才算被纳入版本库。

提交改变

这样,文件才算真正提交上去了。

提交改变

流程图:



记录修改

查看当前的log

并对cs.py作出修改。


这时查看状态,cs.py的状态变成了未纳入。

纳入版本库

提交,再次查看log

log从1个变成了2个。

如果我们想要查看一下刚才进行的修改是什么,可以通过git diff  前提是没有进行add操作将修改后的文件纳入版本库。

如果已经进行了add操作,那么不要着急,我们还有一个cached参数。

这样就OK了。

我么先别提交,我们在修改一下cs.py。之后使用一个新的参数查看一下。

第三次修改
三种不同的方法


回到从前


回到 add 之前

有时我们添加 add 了修改, 但是又后悔, 并想补充一些内容再 add. 这时, 我们有一种方式可以回到 add 之前. 

我们添加add后,查看状态是绿色的M,就是已添加(staged),使用reset,删除掉这次添加,就变成了红色的M,就是未添加(unstaged)。


 回到 commit 之前

每个 commit 都有自己的 id 数字号, HEAD 是一个指针, 指引当前的状态是在哪个 commit. 最近的一次 commit 在最右边, 我们如果要回到过去, 就是让 HEAD 回到过去并 reset 此时的 HEAD 到过去的位置.

不管我们做了什么add操作,这一步直接回到上一个commit。

让我们回到change1,同样也可以使用id号返回。

查看log。

那么怎么回到change2呢。

首先查看最近我们做了哪些操作,然后找到  moving to HEAD 的id号,回到这个id。


改写文件 

我们首先拷贝一个cs1.py,然后追加到change2中。

我们先看一下我们的log。

我们指定cs.py回到 3ad86f5 的这个log。

之后将cs.py提交上去。


分支管理


创建分支

使用branch创建一个分支,使用checkout来切换分支。

使用checkout -b 参数可以直接创建+切换。

dev01 分支中的 cs.py 和 cs1.py 和 master 中的文件是一模一样的. 因为当前的指针 HEAD 在 dev01 分支上, 所以现在对文件夹中的文件进行修改将不会影响到 master 分支.

我们在 cs.py 上加入一些东西, 然后再 commit(-am代表add+commit)

将 dev01 的修改推送到 master

我们先切换回master,之后使用merge合并他们。

之后就可以我们合并了他。

要注意的是, 如果直接 git merge dev, git 会采用默认的 Fast forward 格式进行 merge, 这样 merge 的这次操作不会有 commit 信息. log 中也不会有分支的图案. 我们可以采取 --no-ff 这种方式保留 merge 的 commit 信息.

分支冲突

merge(合并分支冲突)

情况是这样, 想象不仅有人在做开发版 dev 的更新, 还有人在修改 master 中的一些 bug. 当我们再 merge dev 的时候, 冲突就来了. 因为 git 不知道应该怎么处理 merge 时, 在 master 和 dev 的不同修改.

当创建了一个分支后, 我们同时对两个分支都进行了修改:

master 中的 cs.py 加上 # edited in master.

dev 中的 cs.py 加上 # edited in dev.


master的log
dev的log

当我们想要 merge dev 到 master 的时候,git 发现的我们的 cs.py 在 master 和 dev 上的版本是不同的, 所以提示 merge 有冲突. 具体的冲突, git 已经帮我们标记出来, 我们打开 cs.py 就能看到:

我们随便修改一下cs.py,让里面的内容在当前HEAD统一。


然后进行提交

冲突就会解决掉:

rebase(重新划分分支冲突)

假设共享的分支是branch B,我而在branch A上工作,一天有我发现branch B已经有一些小更新,我也想试试我的程序和这些小更新兼不兼容,我也我想合并,就这时可以用rebase来补充我的分支branch B的内容。补充完以后,和后面那张图的merge不同,我还是继续在C3上工作,不过此时C3的本质却不一样了,因为吸收了那些小更新。我们所以用C3'来代替。




可以抛光rebase改变了C3的属性,C3已经不是从C1衍生而来的了。这一点和merge不一样。merge在合并的时候创造了一个新的C5 commit。这一点不同,使得在共享分支中使用rebase变得危险。如果是共享分支的历史被改写。别人之前共享内容的commit就被你的rebase修改掉了。


只能在你自己的分支中使用rebase,而别人共享的部分是不能用 。如果你不小心弄错了了。没事,我们还能用reflog恢复原来的样子。为了验证在共享分支上使用rebase的危险性,我们在下面的示例中也验证一下。


我们先将master和dev中的cs1.py修改为不同内容。

然后进行合并:

这时HEAD并没有指向master或者dev,甚至停在了rebase模式上

然后手动合并,再次rebase,这时必须使用  --continue 参数。查看log。

这个例子也说明了使用rebase要万分小心,千万不要在共享的branch中rebase,不然就像上面那样,现在master的历史已经被rebase改变了。其中master别人提交的change就被你无情地修改掉了,所以千万不要在共享分支中使用rebase。


临时修改

假如我们正在进行任务a,突然有一个紧急任务b介入,需要先停下手里的工作来完成任务b,但是不能将任务a和任务b同时commit,所以就有了暂存,也就是临时修改。

我们来dev这个分支来做。

我们修改了一下cs.py文件,然后先不add,用stash来暂存他。之后查看他的状态,发现是另外一种情况。

然后我们来做任务b

介入其他任务

创建并进入taskb

完成taskb任务并且提交。

回到master进行合并,如果有冲突则先修改文件进行合并。

查看log


恢复工作

先切换回dev分支,之后查看一下stash的缓存。

通过pop提取他,继续工作。

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

推荐阅读更多精彩内容

  • (参照莫烦教程morvanzhou.github.io/tutorials/others/git/) 1.wind...
    忆江南_1569阅读 248评论 0 1
  • 前言 Git使用教程 Git是什么 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 ...
    90后的思维阅读 906评论 0 0
  • Git飞行规则(Flight Rules) 前言 英文原版README 翻译可能存在错误或不标准的地方,欢迎大家指...
    骑摩托马斯阅读 1,630评论 0 8
  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,421评论 0 7
  • 小明年纪轻轻,却长了一头白发。 白发是染的,还烫过,主要程序是:洗、剪、吹。 人民群众都亲情的称呼他:杀马特贵族龙...
    李罗苏阅读 327评论 0 0