[关闭]
@lunar 2016-03-29T20:01:34.000000Z 字数 5204 阅读 2187

githug 不完全通关攻略

版本控制 程序员的自我修养


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:"后面是通关操作,其他都是备忘的碎碎念。

1.初始化

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

2.设置 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

3. 添加文件 add

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

4. 提交更改 commit

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

5. 克隆 clone

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

6. 克隆到指定子文件夹

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

7. 忽略 ignore

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

8. 忽略2

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

  1. *.a
  2. !lib.a

9. 状态 status

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

10. 提交文件数量

同上

11. 移除文件 rm

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

12. 移除缓存

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

13. 暂存 stash

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

14. 重命名 rename

s:git mv oldfile.txt newfile.txt

15. 重构 restructure

你添加了一些文件到你的repo,但是刚刚发现他们没有很好的结构化,都散乱在一个文件夹中。现在你要把所有的.html文件放到\src文件夹中
s:

  1. mkdir src
  2. git mv index.html src
  3. git mv about.html src
  4. git mv contact.html src

这里应该是可以用通配符的。。但是不知道为啥总是提示bad source

16. 日志 log

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

17. 标签 tag

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

18. 同步标签 push tags

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

19. 追加提交 commit amend

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

  1. git add forgotten_file.rb
  2. git commit --amend -m"New message"

20. 来自未来的提交

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

21. 重置 reset

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

22. 软重置 reset soft

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

23. 签出 checkout

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

24. 远程仓库 remote

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

25. 远程仓库2 remote url

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

26. 拉取 pull

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

27. 增加远程仓库 add remote

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

28. 推送 push

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

29. 差异 diff

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

30. 平白 blame

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

31. 分支 branch

s:git branch test_code

32. 签出2 checkout

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

  1. git branch my_branch
  2. git checkout my_branch

33. 签出3 checkout

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

34. 签出4 checkout

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

35. 分支2 branch

这次你需要回到上次commit之前创建分支。
s:

  1. git checkout HEAD^
  2. git branch test_branch

36. 删除分支 delete branch

s:git branch -d delete_me

37. 推送分支 push branch

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

38.合并 merge

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

39. 拉取 fetch

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

40. 重定基 rebase

重定基在第28关有说明,可以回头看看。
s:

  1. git branch // 发现有master和feature两个分支
  2. git checkout feature // 签到要重定基的分支
  3. git rebase master

41. 重打包 repack

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

42. 捡樱桃 cherry-pick

这里你要废弃一个分支但是这个分支中的某个commit的改动需要得到保留。需要先到那个分支去查看那个commit的hash值。
s:

  1. git checkout new-feature
  2. git log
  3. git checkout master
  4. git cherry-pick ca32a6dac7b6f97975edbe19a4296c2ee7682f68

43. 查找 grep

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

44. 重命名commit rename commit

s:

  1. git log
  2. git rebase -i <HASH value>

45. 压缩 squash

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

46. 合并压缩 merge squash

将另一分支上的commit压缩合并为一个commit

  1. git merge --squash long-feature-branch
  2. git commit

打不动了。。先玩到这儿吧。。基本上也就够用了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注