Githug介绍

  • Githug让你可以在实践中学习Git,如果你还没玩过,推荐你去体验一下。
  • 这里是它的Github地址
  • 它的作者是这样介绍Githug的:

    Githug的目的是想让你可以通过实践学习git操作,你需要输入正确的git命令来闯关。

Githug安装

  • Githug的安装方法很简单,首先确认你的电脑上已经安装了Ruby,然后只需要执行以下的命令:

    1. $ gem install githug
  • 如果提示权限不够,需要加上sudo重新执行并输入密码:

    1. $ sudo gem install githug

游戏开始

  • 直接输入githug就可以开始游戏了。

image.png

  • Githug为你提供了几个命令来帮助你完成游戏挑战:
    • githug play:查看你已经完成的命令是否正确,如果正确会进入到下一关;
    • githug hint:给你一些小提示;
    • githug reset:重置本关;
    • githug levels:显示所有关卡;

第1关(git init 初始化)

【题目】

  • 一个新的名为git_hug的目录已经创建了,现在你需要对它进行初始化。

image.png
【解答】

  • 使用 git init 进行git仓库的初始化

image.png

第2关(git config 设置信息)

【题目】

  • 设置你的用户名和邮箱

image.png
【解答】

  • 使用 git config [字段] [值] 加上对应字段来设置。我这里使用了 --local 使得设置仅在库内生效,全局生效需要使用 --global

image.png

第3关(git add 添加到暂存区)

【题目】

  • 文件夹中有一个名为 README 的文件,请将它添加到你的暂存区。

image.png
【解答】

  • 使用 git add [文件名] 将文件添加到暂存区。

image.png

第4关(git commit 提交到分支)

【题目】

  • README 文件已经在暂存区中了,现在需要将暂存区中的文件提交到当前分支。

image.png
【解答】

  • 使用 git commit -m [备注] 将暂存区的所有文件提交到当前分支。

image.png

第5关(git clone 远程仓库克隆到本地)

【题目】

  • 将一个远程仓库克隆到本地。

image.png
【解答】

  • 使用 git clone [远程仓库地址] 可以将远程仓库克隆到本地。

image.png

第6关(git clone 克隆指定文件夹)

【题目】

  • 将一个远程仓库克隆到本地指定文件夹。

image.png
【解答】

  • 使用 git clone [远程仓库地址] [指定文件夹名] 将远程仓库克隆到指定文件夹。

image.png

第7关(.gitignore 排除文件)

【题目】

  • 将带有 .swp 后缀的文件排除在需要提交的文件之外。

image.png
【解答】

  • 添加一个 .gitignore 文件,然后在文件中加入要排除的文件名称。

image.png

  • .gitignore 文件内容如下,我们在最后一行添加了一个 *.swp

image.png

第8关(.gitignore 保留文件)

【题目】

  • 将带有 .a 后缀的文件排除在需要提交的文件之外,但是要保留 lib.a 这个文件。

image.png
【解答】

  • 同上一个问题一样,我们需要通过修改 .gitignore 来实现

image.png

  • .gitignore 文件中使用 ![文件名] 可以保留某个特定的文件

3.4 - 【整理】Githug 游戏全攻略 - 图19

第9关(git status 查看未追踪文件)

【题目】

  • 查看未被git追踪的文件。

image.png
【解答】

  • 使用 git status 查看,Untracked files下面红色的文件就是未被git追踪的。

image.png

第10关(git status 查看未提交文件)

【题目】

  • 查看处于暂存区且未被提交的文件。

image.png
【解答】

  • 仍然是使用 git status 查看,Changes not staged for commit下面的绿色文件就是处于暂存区中的未被提交的文件。

image.png

第11关(git rm 移出版本库并删除文件)

【题目】

  • 有一个文件从硬盘中删除了,但是并未从 git 仓库中删除,找到它并从 git 仓库中删除。

image.png
【解答】

  • 有时我们在文件管理器中将一个文件删除了,但是该文件并没有从版本库中删除。这时如果需要从版本库中删除该文件,那么就可以使用 git rm 命令。

image.png

第12关(git rm —cached 移出版本库但不删除文件)

【题目】

  • 一个文件不小心被添加到你的git版本库中了,找到它并将它从暂存区中移除。注意只是将这个文件从版本库中移除,不要删除文件。

image.png
【解答】

  • 使用 git rm --cached 只会将文件从版本库中移除,而不会删除文件。

image.png

【小结】git rm 对比 git rm --cached git rm :删除文件,同时将文件移出git版本库; git rm --cached :将文件移出git版本库,但是不删除文件;

第13关(git stash 没改完回头再改)

【题目】

  • 做了一些改动但是暂时不想提交,希望之后再回来进行一些改动。

image.png
【解答】

  • 可以使用 git stash 将一些改动暂存起来,之后回过头来再继续修改。

image.png

第14关(git mv 修改文件名)

【题目】

  • 修改文件名,并将修改提交到暂存区。

image.png
【解答】

  • 使用 git mv [旧文件名] [新文件名] 可以实现修改文件名,并将修改提交到暂存区。

image.png

第15关(git mv 调整目录结构)

【题目】

  • 新建一个名为src的文件夹,将所有的.html后缀的文件都移入这个文件夹中。

image.png
【解答】

  • 使用 git mv [文件名] [路径] 将指定文件移入指定路径,并将修改加入暂存区。

image.png

第16关(git log 查看提交记录)

【题目】

  • 查看提交记录,给出最近一次提交的hash值。

image.png
【解答】

  • 使用 git log 查看提交记录。

image.png

  • 提交记录如下:

image.png

第17关(git tag 给提交做标记)

【题目】

  • 将当前提交标记为“new_tag”

image.png
【解答】

  • 使用 git tag [标记名称] 给当前提交标记一个名称,也可以使用git tag [标记名称] [id] 给特定某个id的提交标记一个名称。

image.png

  • 可以使用 git log 查看一下,可以看到 tag: new_tag

image.png

第18关(git push origin —tags 推送标签到远程仓库)

【题目】

  • 将本地标签(tags)全部推送到远程git仓库。

image.png
【解答】

  • 使用 git push origin [标签名] 可以将某个标签推送到远程仓库,使用 git push origin --tags 可以将所有本地标签都推送到远程仓库。

image.png

需要这样做的原因是:默认情况下,git push不会将标签推送到远程仓库,因此需要显式推送。

第19关(git commit —amend 修改最近一次提交)

【问题】

  • 上一次提交时,有一个文件忘记加入了,希望能修改最近一次提交,把这个文件提交进去。

image.png
【解答】

  • 我们先使用 git log 打印一下提交记录

image.png
image.png

  • 然后尝试用 git commit —amend 修改最近一次提交。

image.png

  • 我们使用 git log 将最近的提交打出来。

image.png
image.png

第20关(git commit [时间] 指定提交时间)

【问题】

  • 指定提交的时间(未来某个时间)

image.png
【解答】

  • 使用 git commit --date=" " 指定提交时间

image.png
image.png

第21关(git reset HEAD [文件名] 将文件取回到暂存区)

【问题】

  • 有两个文件被提交了,但是事实上我们希望先提交其中的一个,再去提交另外一个。我们希望将其中一个先放回暂存区。

image.png
【解答】

  • 使用 git reset HEAD [文件名] 将指定文件取回到暂存区。

image.png

第22关(git reset 撤销上一次提交)

【问题】

  • 上一次提交太快了,希望可以撤回。

image.png
【解答】

  • 我们先使用 git log 看一下目前的提交记录:

image.png

  • 我们使用 git reset --soft 将上一次的提交放入暂存区

image.png

  • 再次使用 git log 查看一下提交记录:

image.png

  • 使用 git status 查看一下暂存区的情况:

image.png

【小结】撤销上一次提交有三种方式:

  • 将上一次提交放入暂存区:--soft
  • 将上一次提交放回工作区:--mixed
  • 直接抛弃:--hard

第23关(git checkout 恢复到上一次)

【问题】

  • 放弃当前修改,使用上一次提交的结果。

image.png
【解答】

  • 使用 git checkout [文件名]

image.png

第24关(git remote 查看远程仓库)

【问题】

  • 查看一下远程仓库。

image.png
【解答】

  • 使用 git remote

image.png

第25关(git remote -v 查看远程仓库及地址)

【问题】

  • 查看远程仓库以及它们的地址。

image.png
【解答】

  • 使用 git remote -v

image.png

第26关(git pull origin [远程分支])

【问题】

  • 拉取远程仓库中分支到本地

image.png
【解答】

  • 使用 git pull origin [远程分支]

image.png

第27关(git remote add origin [远程仓库地址])

【问题】

  • 添加远程仓库地址

image.png
【解答】

  • 使用 git remote add origin [远程仓库地址]

image.png

第28关(git rebase 变基 && git push 推送到远程仓库)

【问题】

  • 先变基再推送

image.png
【解答】

  • 先使用 git rebase 变基,再使用 git push 推送到远程仓库。

image.png

第29关(git diff 查看代码变动)

【问题】

  • 查看代码和上一次提交相比有哪些变动。

image.png
【解答】

  • 使用 git diff

image.png
image.png

【git diff 更多用法】 git diff :比较工作区和暂存区 git diff --cached :比较暂存区和git仓库 git diff HEAD :查看工作目录和最近一次提交的内容差异

第30关(git blame 查看文件修改人)

【问题】

  • 查看文件修改人。

image.png
【解答】

  • 使用 git blame 可以列出文件中每行的修改人

image.png

  • 使用 git blame 命令后,会显示每行的修改人。

image.png

第31关(git branch 创建分支)

【问题】

  • 创建一个新的分支

image.png
【解答】

  • 使用 git branch [分支名] 创建一个新的分支

image.png

  • 使用 git branch 查看分支

image.png

第32关(git checkout 切换分支)

【问题】

  • 创建一个新的分支,并切换过去

image.png
【解答】

  • 使用 git branch 创建分支,使用 git checkout 切换分支

image.png

第33关(git checkout [标签名] 按标签名切换分支)

【问题】

  • 切换到某个标签名的分支

image.png
【解答】

  • 使用 git tag 查看所有标签

image.png
image.png

  • 使用 git checkout [标签名] 切换到某个标签名的分支

image.png

第34关(git checkout tags over branch)

【问题】

  • 切换到某个特定的分支,但是分支名和标签名重叠了。

【解答】

  • 命令还是git checkout,可以使用tags指定标签名。
  • 先使用git log 查看一下提交记录。

image.png
image.png

  • 然后使用 git checkout tags/[标签名] 切换到特定标签名的分支。

image.png

第35关(git branch 为指定提交创建分支)

【问题】

  • 为当前提交的前一个提交创建一个分支。

image.png
【解答】

  • 使用 git branch [分支名] [位置]

image.png

  • 使用 git log 可以看到添加后的分支 test_branch

image.png

~^】 参考资料:~ 和 ^ 的区别是什么? - Stack Overflow 简单总结一下:

  • ~n: 获取第n代的祖先提交;
  • ^n:获取第n个父提交;

有一个非常经典的例子:

  1. G H I J
  2. \ / \ /
  3. D E F
  4. \ | / \
  5. \ | / |
  6. \|/ |
  7. B C
  8. \ /
  9. \ /
  10. A
  11. A = = A^0
  12. B = A^ = A^1 = A~1
  13. C = A^2
  14. D = A^^ = A^1^1 = A~2
  15. E = B^2 = A^^2
  16. F = B^3 = A^^3
  17. G = A^^^ = A^1^1^1 = A~3
  18. H = D^2 = B^^2 = A^^^2 = A~2^2
  19. I = F^ = B^3^ = A^^3^
  20. J = F^2 = B^3^2 = A^^3^2

第36关(git branch -d 删除分支)

【问题】

  • 删除一个古老的分支

image.png
【解答】

  • 使用 git branch -d [分支名] 删除一个分支

image.png

第37关(git push 将分支推送到远程仓库)

【问题】

  • 将一个分支推送到远程仓库

【解答】

  • 先使用 git branch 查看一下本地分支

image.png
image.png

  • 使用 git push [远程仓库名] [本地分支名]:[远程分支名] 将本地分支推送到远程仓库

image.png

第38关(git merge 合并分支)

【问题】

  • 将 feature 分支合并到 master 分支

image.png
【解答】

  • 使用 git merge [分支名]

image.png

git mergegit rebase 的区别】 参考资料:【掘金】Git merge 和 rebase 分支合并命令的区别 - 富途Web开发团队

第39关(git fetch 获取)

【问题】

  • 获取远程仓库中的修改,但不合并到当前分支。

image.png
【解答】

  • 使用 git fetch

image.png

git pull = git fetch + git merge

第40关(git rebase 变基)

【问题】

  • 将一个分支通过变基的方式合并到master分支。

image.png
【解答】

  • 先使用 git log --graph --all 查看一下提交记录:

image.png
image.png

  • 然后我们切换到feature分支,执行变基操作

image.png

  • 完成后再查看一下提交记录,可以发现其中的变化

image.png

  • 完成!

image.png

【关于git rebase】 关于变基,可以查看资料变基 - git 【变基做了什么】总结一下,变基所做的就是找到这两个分支的最近共同祖先,然后对比历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底,最后将之前另存为零时文件的修改依次应用。 【git rebase 和 git merge 异同】git rebase 和 git merge 最终的结果代码是相通的,但是提交记录确实不同的。使用 git rebase 的提交历史记录会更加整洁 【什么时候使用git rebase】例如向某个其他人维护的项目贡献代码时,首先在自己的分支里开发,开发完成后,将自己的代码变基到origin/master上,再提交给主项目,会方便项目的维护者快速整合。 【什么时候别用git rebase】如果提交存在于你的仓库之外,别人可能基于这些提交进行开发,那么请不要变基。否则会遭到唾弃!

第41关(git rebase —onto 变基到指定分支)

【问题】

  • 本来要从master分支穿件的新分支不小心被创建成了wrong_branch上,需要执行一次变基操作。

image.png
【解答】

  • 使用 git rebase --onto [新分支] [原分支]

image.png

第42关(git repack ???)

【问题】

  • 优化仓库打包结构?去除冗余包?

image.png
【解答】

  • 使用 git repack -d

image.png

这题我确实没搞懂,以后懂了再回来更新。

第43关(未完待续)

后面的东西越来越难了。。。