git是什么已经不必累述了,但是大家真的都能用好git吗?未必,许多人除了简单的pull,push和分支之外也就不会啥了,遇到一些简单的问题也不知如何是好。的确,有许多git的教程,但是我想看过一遍之后能记住并加以运用的究竟是少数,所以这里githug就派上了用场,它给初学者一个个使用git的关卡,在实际操作中逐渐上手git。

安装 Installation

要安装githug需要先安装ruby,如果不知道如何安装可以戳这里。接着在命令行中输入gem install githug,安装完成后再键入githug就可以开始游戏啦。

玩法

这里有四条命令可以在游戏中使用,它们是游戏的基本玩法。

  1. githug play这条指令用于检测你当前操作是否正确,每次操作完后输入,如果正确会进入下一关卡。
  2. githug hint输入该指令,游戏会给你一些关于当前关卡的提示。
  3. githug reset如果git操作中做了一些蠢事儿,又不知道如何回滚,那么该指令可以重置当前关卡。
  4. githug levels这条指令会将所有的关卡列出来。

    具体关卡

    大家自己玩哦,不要看攻略。。。这里只是记下来免得我自己忘掉。只有”s:”后面是通关操作,其他都是备忘的碎碎念。

    初始化

    这里它提示已经创建了名为git_hug的文件夹,需要你初始化这个仓库。
    s:进入目录后git init

    设置 config

    设置你的gitname 和 email
    这里通过git help config可以查看如何设置。
    在设置具体属性前加--global表示使用全局设置,--system表示系统设置,--local表示使用本地设置,即该repo设置,-f后加文件名表示通过文件读取设置。
    在每个repo的.git文件夹中会有config文件存贮了该repo的设置。
    简单而常用的命令
  • git confgi -l 列出你的所有设置
  • git config --get [key]获取你对key这项的设置,比如git config --get user.name会返回你的用户名 属性有多项那么用--get-all可以获得所有值。
  • git config unset [key]去除某项设置,如有多项设置只会去除最新那项,追加-all可以去除所有。
  • git config add [key] value新增某项设置,设置key的值为value
    s:git config -add user.name Zhangzhe
    git config -add user.email xxx@xx.xx

    添加文件 add

    添加文件进入git追踪。
    s:git add README

    提交更改 commit

    由于前面你添加了readme文件,所以你的暂存区和工作区不一致,通过commit来提交更改,提交commit时需要附上提交信息,一般认为好的提交信息需要用简明的语句说明改动。
    s:git commit -m "Add README"

    克隆 clone

    从github上clone一个repo
    s:git clone https://github.com/Gazler/cloneme

    克隆到指定子文件夹

    s:git clone http://github.com/Gazler/cloneme my_cloned_repo

    忽略 ignore

    设置git对某些文件的忽略,这样git就不会追踪这些文件,在.gitignore文件中可以看到具体的设置。这里要新增对.swp文件的忽略。
    s:打开.gitignore文件,在里面新加一行*.swp

    忽略2

    这里我们要忽略所有.a文件除了lib.a
    s:在.gitignore中加上
    1
    2
    *.a
    !lib.a

    状态 status

    现在要查看当前那个文件没被追踪。
    s:git status然后就发现database.yml没有被追踪。

    提交文件数量

    同上

    移除文件 rm

    文件在计算机中被手动删除后依旧会留存在git中,所以我们需要在git 中移除它。
    s:`git rm deleteme.rb

    移除缓存

    从git中移除但是并不删除该文件。
    s:git rm --cached deleteme.rb

    暂存 stash

    这里我们需要保存目前的工作进度但是不想提交它。
    s:git stash

    重命名 rename

    s:git mv oldfile.txt newfile.txt

    重构 restructure

    你添加了一些文件到你的repo,但是刚刚发现他们没有很好的结构化,都散乱在一个文件夹中。现在你要把所有的.html文件放到\src文件夹中
    s:
    1
    2
    3
    4
    mkdir src
    git mv index.html src
    git mv about.html src
    git mv contact.html src
    这里应该是可以用通配符的。。但是不知道为啥总是提示bad source

    日志 log

    需要你查看某次提交的hash值.
    s: git log

    标签 tag

    为此次提交加上”new_tag”的标签。
    s:git tag new_tag

    同步标签 push tags

    这次需要把所有的标签同步到远程仓库。
    s:git push --tags origin master

    追加提交 commit amend

    有时我们在commit之后才发现有个文件没有add(是我。。),如果为这个文件单独commit会显得提交记录很凌乱,特别是对于经常丢三落四的。。所以我们可以追加提交,将这次提交追加到上一次,算作一次提交。
    s:
    1
    2
    git add forgotten_file.rb
    git commit --amend -m"New message"

    来自未来的提交

    这里我们需要篡改提交的时间。一般来说,提交时使用的是系统当前时间,有时我们需要自己更改该时间,比如说骗老板自己周六也在写代码。。。
    s:git commit -m"Wow" --date "2016-03-30 15:25:25"

    重置 reset

    有时我们在一次提交中多提交了文件,需要撤回,这里就用到reset,reset 后加文件名的话就和add的作用相反。
    s:git reset to_commit_second.rb

    软重置 reset soft

    你想要撤销上一次提交,但是同时不改变工作目录。这时候一般用到reset进行回滚,因为不想改变文件,只是更改git记录,所以这里用--soft模式。
    s:git reset --soft HEAD^
    这里HEAD^表示当前记录往前一个commit,如果是2个3个或是n个用HEAD~2,HEAD~3,HEAD~n

    签出 checkout

    一个文件被修改了,但是你不想保存这些修改,使用checkout使其回滚到上一次commit。注意和reset file的不同,reset是文件操作,这里是内容操作。
    s:git checkout config.rb

    远程仓库 remote

    git除了在本机上有仓库外还有远程仓库,这里需要你找出远程仓库名。
    s:git remote

    远程仓库2 remote url

    每个remote对应一个url,请找出,这里重复以上命令并开启啰嗦模式(冗长verbose)。
    s:git remote -v

    拉取 pull

    在知道你的远程仓库后你就可以从远程仓库拉取改动,这就为异地/多人协作提供方便。利用pull加你的远程仓库名以及分支(除非有默认分支,否则必须要有分支名,一般都有master分支)。
    s:git remote得知远程仓库为origin.
    git pull origin master

    增加远程仓库 add remote

    如题。
    s:git git remote add origin https://github.com/githug/githug

    推送 push

    将改动推送到远程仓库,这里先拉取改动,和本地仓库合并后再推送到远程仓库。咦,这样怎么不行呢?这是因为这里你的commit在远程分支最新的commite之前,也就是说你的代码要插在remote master中间了。这里就要用到重定基rebase。即以当前最新的远程master为基础。关于rebase具体用法,可以看这里
    s:git rebase origin/master master
    git push origin master

    差异 diff

    直接键入git diff可以看到上次commit后的改动。
    s:git diff

    平白 blame

    将文件中每行代码信息平白地展示出来。
    s:git blame config.rb
    看清题目要求,要你给出设置密码的人,不是给出密码。。啊喂。。为什么是蜘蛛侠呀。

    分支 branch

    s:git branch test_code

    签出2 checkout

    这里不同于上面利用签出回滚,这里是要签到另一个分支去。
    s:
    1
    2
    git branch my_branch
    git checkout my_branch

    签出3 checkout

    这里要签到某个tag上。
    s:git checkout v1.2

    签出4 checkout

    天哪噜,tag和分支重名了都叫v1.2。现在要签到tagv1.2而不是分支v1.2。
    s:git checkout tags/v1.2

    分支2 branch

    这次你需要回到上次commit之前创建分支。
    s:
    1
    2
    git checkout HEAD^
    git branch test_branch

    删除分支 delete branch

    s:git branch -d delete_me

    推送分支 push branch

    将分支推送到远程那里,如果远程无此分支会自动创建。
    s:git push origin test_branch

    合并 merge

    将另一分支的改动合并到当前分支。
    s:git merge feature

    拉取 fetch

    拉取远程仓库改动但不合并到本地。
    s:git fetch origin
    这里不用加master因为origin仓库有默认分支new_branch而无master分支。

    重定基 rebase

    重定基在第28关有说明,可以回头看看。
    s:
    1
    2
    3
    git branch // 发现有master和feature两个分支
    git checkout feature // 签到要重定基的分支
    git rebase master

    重打包 repack

    这里在打包过程中要移除重复文件,所以要加上-d
    s:git repack -d

    捡樱桃 cherry-pick

    这里你要废弃一个分支但是这个分支中的某个commit的改动需要得到保留。需要先到那个分支去查看那个commit的hash值。
    s:
    1
    2
    3
    4
    git checkout new-feature
    git log
    git checkout master
    git cherry-pick ca32a6dac7b6f97975edbe19a4296c2ee7682f68

    查找 grep

    你的deadline临近了,你需要查看你的代码中有多少TODO。
    s:git grep "TODO"

    重命名commit rename commit

    s:
    1
    2
    git log
    git rebase -i <HASH value>

    压缩 squash

    你要把几次commit压缩为一次commit
    git rebase -i

    合并压缩 merge squash

    将另一分支上的commit压缩合并为一个commit
    1
    2
    git merge --squash long-feature-branch
    git commit
    打不动了。。先玩到这儿吧。。基本上也就够用了。