为了账号安全,请及时绑定邮箱和手机立即绑定

Git 游戏攻略(上篇)- 基础&高级&整理提交记录

标签:
WebApp

一、基础篇:循序渐进地介绍 Git 主要命令

1. Git Commit

如果说一个项目开发过程中所有的提交记录构成一个树,那么commit 命令就是树的一个个节点。首先游戏界面是这样的,第一关要求我们提交两次,也就是创建两个节点。


https://img1.sycdn.imooc.com//5d8f400a000198d006530148.jpg



git commit -m "提交记录,创建节点c2": 执行后就创建了c2节点


https://img1.sycdn.imooc.com//5d8f404e0001f3e206530169.jpg



git commit -m "提交记录,创建节点c3": 执行后就创建了c3节点


https://img1.sycdn.imooc.com//5d8f405e0001bbba06520205.jpg


OK ,你成功通过第一副本的第一关卡


2. Git Branch

如果说commit 提交出一个个节点,一直下去,那他就是一柱擎天。树嘛,总是要开枝散叶,branch 就能让它发一个枝


https://img1.sycdn.imooc.com//5d8f406d0001af8006540167.jpg



git branch bugFix:这样我们的树就在master中发芽了,但也只是萌发


https://img1.sycdn.imooc.com//5d8f40790001d5c106540164.jpg



git checkout bugFix:通过checkout切换到当前枝,然后bugFix枝就可以生长了


https://img1.sycdn.imooc.com//5d8f408a00017c0206550173.jpg



虽然关卡,这里就结束了,不过为了更形象,这里在bugFix枝中提交一次看看


https://img1.sycdn.imooc.com//5d8f40a20001536606510187.jpg



3. Git Merge

当一个bug被修复后,一条枝的使命就完成了,这时就可以将它合并到主支上。
该副本过程是新建一个分支,然后将其合并到主支上。


https://img1.sycdn.imooc.com//5d8f40ad0001b71706520155.jpg



git checkout -b bugFix: 可以直接checkout -b来创建分支并切至


https://img1.sycdn.imooc.com//5d8f40b90001a8a406560170.jpg



git commit -m "修复bug":当bug修复完毕,就可以将其提交


https://img1.sycdn.imooc.com//5d8f40c80001ec0706510187.jpg



git checkout master:然后切回主支


https://img1.sycdn.imooc.com//5d8f40d200015da706510201.jpg



git commit -m "bug修复完毕,主线提交":在主支提交后出现c3节点


https://img1.sycdn.imooc.com//5d8f40e20001961106520183.jpg



git merge bugFix: 通过merge命令可以指定分支合并到当前支m主分支会产生c4

https://img1.sycdn.imooc.com//5d8f40ee0001d14e06530207.jpg



4. Git rebase

第二种合并分支的方法是 git rebase。Rebase实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

git checkout -b bugFix
git commit -m "修复bug"
git checkout master
git commit -m "bug修复完毕,主线提交"
git checkout bugFix
git rebase master


https://img1.sycdn.imooc.com//5d8f410d00010aa406530145.jpg



https://img1.sycdn.imooc.com//5d8f41190001f1c206530155.jpg



https://img1.sycdn.imooc.com//5d8f412a00013e6706550184.jpg



https://img1.sycdn.imooc.com//5d8f413700018f4906540175.jpg



https://img1.sycdn.imooc.com//5d8f414c0001395a06530175.jpg



https://img1.sycdn.imooc.com//5d8f4159000128b006520187.jpg



https://img1.sycdn.imooc.com//5d8f4165000162b506520217.jpg



二、高级篇

HEAD 总是指向当前分支上最近一次提交记录。
1.分离HEAD : 从 bugFix 分支中分离出 HEAD 并让其指向一个提交记录

使用checkout 可以切换到一个节点,此时记录头HEAD指向该节点

https://img1.sycdn.imooc.com//5d8f41870001219006520208.jpg


git checkout C4: 记录头HEAD指向C4


https://img1.sycdn.imooc.com//5d8f419600016fa206520198.jpg



虽然该副本就此结束,但是我还是忍不住再提交一个记录看看,可见生成了C5并且头下移


https://img1.sycdn.imooc.com//5d8f41a300016cf506540248.jpg



2.相对引用^

每个节点都有一个SHA1值与之对应,而我们可以通过该SHA1值回到某个节点,但SHA1太长了,可以使用^上移一步。
该副本需要:切换到 bugFix 的父节点,初始如下:


https://img1.sycdn.imooc.com//5d8f41b00001bbf106520206.jpg



git checkout bugFix^:切换到 bugFix 的父节点


https://img1.sycdn.imooc.com//5d8f41bc00018a2d06510203.jpg



虽然该副本就此结束,但是我还是忍不住再提交一个记录看看,可见下该头之下生成了C5并且头下移


https://img1.sycdn.imooc.com//5d8f41c70001ba0e06520175.jpg



3.相对引用~

如果要移动多步,用^就比较繁琐,这时可以使用~来指定上移多少步
该副本需要:移动 HEAD,master 和 bugFix 到目标所示的位置。

https://img1.sycdn.imooc.com//5d8f41d60001ed5206510291.jpg


可见结果中master指到C6,bugFix移到C0,HEAD指向C1


git branch -f master C6:会将 master 分支强制指向C6

https://img1.sycdn.imooc.com//5d8f41e10001270e06550239.jpg



git checkout HEAD~1:会将头标上移一个到C1

https://img1.sycdn.imooc.com//5d8f41eb0001541406540246.jpg



git branch -f bugFix HEAD~1: 会将 bugFix 分支强制指向头标的上一位,即C0。本关通过。


https://img1.sycdn.imooc.com//5d8f41f90001f6b406500246.jpg



4.撤销变更
git reset 通过把分支记录回退几个提交记录来实现撤销改动(远程分支是无效)
git revert 为了撤销更改并分享给别人,需要使用 git revert

该副本需要:分别撤销 local(本地) 分支和 pushed(远程) 分支上的最近一次提交。  初始如下:


https://img1.sycdn.imooc.com//5d8f42130001dc0806540298.jpg



git reset HEAD~1 :local(本地) 分支撤销一步到达C1


https://img1.sycdn.imooc.com//5d8f421c0001c4b606580184.jpg



git checkout pushed:将分支切到pushed(远程) 分支


https://img1.sycdn.imooc.com//5d8f42270001becf06510177.jpg



git revert HEAD: 此时 C2' 的状态与 C1 是相同的,达到撤销目的


https://img1.sycdn.imooc.com//5d8f42340001960706570206.jpg


Ok,这样你就会了Git的90%,就像天才是百分之九十九的努力和百分之一的灵感,然而那百分之一却是你最大的门槛....


三、整理提交记录

1.Git cherry-pick
git cherry-pick <提交号>...
如果你想将一些提交复制到当前所在的位置(HEAD)下面的话,记住 cherry-pick

该副本需要: 将三个分支中的提交记录复制到 master 上,下面看起来挺复杂,不过别怕:


https://img1.sycdn.imooc.com//5d8f424b00016efe06540285.jpg



git cherry-pick C3 C4 C7: 将 C3 C4 C7复制到,当前所在的位置(master)


https://img1.sycdn.imooc.com//5d8f42580001402406510221.jpg


怎么样,就这么简单。


2.Git rebase
你知道录提交记录的SHA1值时, 用 cherry-pick 再好不过。 but, 但是如果不清楚你想要的提交记录的哈希值呢? 记住: rebase 交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i 复制代码

该副本需要:将C3,C5,C4节点依次拷贝至C1下


https://img1.sycdn.imooc.com//5d8f42630001257306590301.jpg



git rebase -i overHere:就可以打开一个交互面板。


https://img1.sycdn.imooc.com//5d8f426f0001143b06530288.jpg



https://img1.sycdn.imooc.com//5d8f4279000122b106500392.jpg


OK ,讲得也挺多的,之后的知识。


四、写个小例子

经过上篇,你一定对git 有所了解了,本文不再是攻略,而是一个实际测试:

1.初始化git仓库

git init mixed: 将mixed文件夹使用git管理

https://img1.sycdn.imooc.com//5d8f429e0001918306560203.jpg




2.添加文件到git仓库

git add HelloWorld.java:添加文件,git add .会添加文件夹内所有文件

---->[在mixed文件夹创建HelloWorld.java文件]----
public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

3.提交文件到git仓库
toly:mixed mac$ git commit -m "HelloWorld 初始项目"
[master(根提交) 0eb09bc] HelloWorld 初始项目
 1 file changed, 7 insertions(+)
 create mode 100644 HelloWorld.java

git commit -m "提交的描述"下面是提交后的反馈,0eb09bc代表唯一的SHA1,用于节点的身份标识
可见第一次提交之后会形成一个master主支和HEAD节点。


https://img1.sycdn.imooc.com//5d8f42c10001659106610173.jpg



在代码里添加一个string2Int的方法,然后进行测试。

public class HelloWorld {

    public static void main(String[] args) {
        int result = string2Int("1994");
        System.out.println(result);
    }

    private static int string2Int(String num) {
        return Integer.parseInt(num);
    }
}

结果表现良好,现在你要去睡觉了。每晚躺床第一句,代码没提赶快去
看到了节点增加完成,你就安心地睡觉了

toly:mixed mac$ git add .
toly:mixed mac$ git commit -m "增加字符串转数字功能"
[master 0c4056a] 增加字符串转数字功能
 1 file changed, 6 insertions(+), 1 deletion(-)


https://img1.sycdn.imooc.com//5d8f432e000158bb06450178.jpg

然后你思来想去,不行,还没加注释呢,明早起来看不懂了怎么办

public class HelloWorld {

    public static void main(String[] args) {
        int result = string2Int("1994");//使用方法
        System.out.println(result);//打印
    }
    /**
    * 将一个字符串转化成数字
    * @param num 待转字符串
    * @return 数字
    */
    private static int string2Int(String num) {
        return Integer.parseInt(num);
    }
}

于是你修改了文件,添加注释,再提交,成功出现第三个节点,终于可以安心睡觉了。

toly:mixed mac$ git add .
toly:mixed mac$ git commit -m "增加注释"
[master dcf9cd3] 增加注释
 1 file changed, 7 insertions(+), 3 deletions(-)

https://img1.sycdn.imooc.com//5d8f43a40001a27106030223.jpg



4.创建分支

这时你发现有bug,转换"aaa"有异常。修复bug,先建分支,以免改废了影响主支。
git checkout -b bugFix ,这样就可以创建分支,并切换到该分支,你就可以愉快地抓小虫了,用导弹,大炮,原子弹什么的轰炸bug,都不会影响到你的主支。

toly:mixed mac$ git checkout -b bugFix
切换到一个新分支 'bugFix'

之后经过不懈努力,修复了bug,其间提交了两次,加了异常捕捉。

toly:mixed mac$ git add .
toly:mixed mac$ git commit -m "修复bug提交点1"
[bugFix 246b11f] 修复bug提交点1
 1 file changed, 13 insertions(+), 5 deletions(-)
toly:mixed mac$ git add .
toly:mixed mac$ git commit -m "修复bug提交点2"
[bugFix f9299a6] 修复bug提交点2
 1 file changed, 1 insertion(+)

https://img1.sycdn.imooc.com//5d8f43be000117a006610225.jpg


public class HelloWorld {

    public static void main(String[] args) {
        int result = string2Int("1994");//使用方法
        System.out.println(result);//打印
    }
    /**
     * 将一个字符串转化成数字
     * @param num 待转字符串
     * @return 数字
     */
    private static int string2Int(String num) {
        int result =0;

        try {
            result = Integer.parseInt(num);
        } catch (NumberFormatException e) {
            System.out.println("喵了个咪,给老子传数字");
            e.printStackTrace();
        } finally {
        }
        return result;
    }
}

5.切换分支与合并分支,查看分支与删除分支

现在仍在bugFix分支,既然bug已修复,那就回到master主支继续开发,并且将bugFix支合并到主支上

toly:mixed mac$ git checkout master
切换到分支 'master'

toly:mixed mac$ git merge bugFix
更新 dcf9cd3..f9299a6
Fast-forward
 HelloWorld.java | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

通过git branch可以查看当前分支情况,如果想看更多信息,加-v

toly:mixed mac$ git branch
  bugFix
* master

toly:mixed mac$ git branch -v
  bugFix f9299a6 修复bug提交点2
* master f9299a6 修复bug提交点2

一个bug解决了,该分支也没有必要了,就可以删除分支。

toly:mixed mac$ git branch -d bugFix
已删除分支 bugFix(曾为 f9299a6)。


https://img1.sycdn.imooc.com//5d8f443100016cd406620239.jpg


这样一套流程下来,bugFix既不会影响主线的代码,在bug修复后合并删除,也就相当于bugFix从未出现过一样。bug 如此,feature 也一样,在某种意义上,两者是非常类似的。(从不写bug的人,手动滑稽)


6.git reflog 和 git log

如果你想查看日志,可以通过git refloggit log

toly:mixed mac$ git reflog
f9299a6 (HEAD -> master) HEAD@{0}: merge bugFix: Fast-forward
dcf9cd3 HEAD@{1}: checkout: moving from bugFix to master
f9299a6 (HEAD -> master) HEAD@{2}: commit: 修复bug提交点2
246b11f HEAD@{3}: commit: 修复bug提交点1
dcf9cd3 HEAD@{4}: checkout: moving from master to bugFix
dcf9cd3 HEAD@{5}: commit: 增加注释
0c4056a HEAD@{6}: commit: 增加字符串转数字功能
0eb09bc HEAD@{7}: commit (initial): HelloWorld 初始项目
toly:mixed mac$ git log
commit f9299a6fe2e1e04fe5e334288fee737ebbf8d7b5 (HEAD -> master)
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:45:36 2019 +0800

    修复bug提交点2

commit 246b11fac86392f55a83feb41f6e674d644074a3
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:43:53 2019 +0800

    修复bug提交点1

commit dcf9cd3244926e2e3113713bc1465b823038fcdc
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:31:08 2019 +0800

    增加注释

commit 0c4056af93721074324544ba4b562061e442dccd
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:21:11 2019 +0800

    增加字符串转数字功能

commit 0eb09bc5abc9c4f42401cf543306fe485e17acfa
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:04:16 2019 +0800

    HelloWorld 初始项目

7.版本回溯

git 最强大的功能之一在于可以版本回溯,让你能在前线奋勇杀敌,没有后顾之忧。
大不了搞不好,再退回来呗。如果你debug搞得一团糟,轻轻来一句:

git reset --hard 0c4056a


https://img1.sycdn.imooc.com//5d8f44830001d8fa06260211.jpg


Git还有非常多的特性,这里主要是想让你对Git一个形象的认识,后面的路,还要自己走。



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
20
获赞与收藏
56

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消