- Githug介绍
- Githug安装
- 游戏开始
- 第1关(git init 初始化)
- 第2关(git config 设置信息)
- 第3关(git add 添加到暂存区)
- 第4关(git commit 提交到分支)
- 第5关(git clone 远程仓库克隆到本地)
- 第6关(git clone 克隆指定文件夹)
- 第7关(.gitignore 排除文件)
- 第8关(.gitignore 保留文件)
- 第9关(git status 查看未追踪文件)
- 第10关(git status 查看未提交文件)
- 第11关(git rm 移出版本库并删除文件)
- 第12关(git rm —cached 移出版本库但不删除文件)
- 第13关(git stash 没改完回头再改)
- 第14关(git mv 修改文件名)
- 第15关(git mv 调整目录结构)
- 第16关(git log 查看提交记录)
- 第17关(git tag 给提交做标记)
- 第18关(git push origin —tags 推送标签到远程仓库)
- 第19关(git commit —amend 修改最近一次提交)
- 第20关(git commit [时间] 指定提交时间)
- 第21关(git reset HEAD [文件名] 将文件取回到暂存区)
- 第22关(git reset 撤销上一次提交)
- 第23关(git checkout 恢复到上一次)
- 第24关(git remote 查看远程仓库)
- 第25关(git remote -v 查看远程仓库及地址)
- 第26关(git pull origin [远程分支])
- 第27关(git remote add origin [远程仓库地址])
- 第28关(git rebase 变基 && git push 推送到远程仓库)
- 第29关(git diff 查看代码变动)
- 第30关(git blame 查看文件修改人)
- 第31关(git branch 创建分支)
- 第32关(git checkout 切换分支)
- 第33关(git checkout [标签名] 按标签名切换分支)
- 第34关(git checkout tags over branch)
- 第35关(git branch 为指定提交创建分支)
- 第36关(git branch -d 删除分支)
- 第37关(git push 将分支推送到远程仓库)
- 第38关(git merge 合并分支)
- 第39关(git fetch 获取)
- 第40关(git rebase 变基)
- 第41关(git rebase —onto 变基到指定分支)
- 第42关(git repack ???)
- 第43关(未完待续)
Githug介绍
- Githug让你可以在实践中学习Git,如果你还没玩过,推荐你去体验一下。
- 这里是它的Github地址
- 它的作者是这样介绍Githug的:
Githug的目的是想让你可以通过实践学习git操作,你需要输入正确的git命令来闯关。
Githug安装
Githug的安装方法很简单,首先确认你的电脑上已经安装了Ruby,然后只需要执行以下的命令:
$ gem install githug
如果提示权限不够,需要加上sudo重新执行并输入密码:
$ sudo gem install githug
游戏开始
- 直接输入
githug
就可以开始游戏了。
- Githug为你提供了几个命令来帮助你完成游戏挑战:
githug play
:查看你已经完成的命令是否正确,如果正确会进入到下一关;githug hint
:给你一些小提示;githug reset
:重置本关;githug levels
:显示所有关卡;
第1关(git init 初始化)
【题目】
- 一个新的名为git_hug的目录已经创建了,现在你需要对它进行初始化。
【解答】
- 使用
git init
进行git仓库的初始化
第2关(git config 设置信息)
【题目】
- 设置你的用户名和邮箱
【解答】
- 使用
git config [字段] [值]
加上对应字段来设置。我这里使用了--local
使得设置仅在库内生效,全局生效需要使用--global
。
第3关(git add 添加到暂存区)
【题目】
- 文件夹中有一个名为
README
的文件,请将它添加到你的暂存区。
【解答】
- 使用
git add [文件名]
将文件添加到暂存区。
第4关(git commit 提交到分支)
【题目】
README
文件已经在暂存区中了,现在需要将暂存区中的文件提交到当前分支。
【解答】
- 使用
git commit -m [备注]
将暂存区的所有文件提交到当前分支。
第5关(git clone 远程仓库克隆到本地)
【题目】
- 将一个远程仓库克隆到本地。
【解答】
- 使用
git clone [远程仓库地址]
可以将远程仓库克隆到本地。
第6关(git clone 克隆指定文件夹)
【题目】
- 将一个远程仓库克隆到本地指定文件夹。
【解答】
- 使用
git clone [远程仓库地址] [指定文件夹名]
将远程仓库克隆到指定文件夹。
第7关(.gitignore 排除文件)
【题目】
- 将带有
.swp
后缀的文件排除在需要提交的文件之外。
【解答】
- 添加一个
.gitignore
文件,然后在文件中加入要排除的文件名称。
.gitignore
文件内容如下,我们在最后一行添加了一个*.swp
第8关(.gitignore 保留文件)
【题目】
- 将带有
.a
后缀的文件排除在需要提交的文件之外,但是要保留lib.a
这个文件。
【解答】
- 同上一个问题一样,我们需要通过修改
.gitignore
来实现
- 在
.gitignore
文件中使用![文件名]
可以保留某个特定的文件
第9关(git status 查看未追踪文件)
【题目】
- 查看未被git追踪的文件。
【解答】
- 使用
git status
查看,Untracked files下面红色的文件就是未被git追踪的。
第10关(git status 查看未提交文件)
【题目】
- 查看处于暂存区且未被提交的文件。
【解答】
- 仍然是使用
git status
查看,Changes not staged for commit下面的绿色文件就是处于暂存区中的未被提交的文件。
第11关(git rm 移出版本库并删除文件)
【题目】
- 有一个文件从硬盘中删除了,但是并未从 git 仓库中删除,找到它并从 git 仓库中删除。
【解答】
- 有时我们在文件管理器中将一个文件删除了,但是该文件并没有从版本库中删除。这时如果需要从版本库中删除该文件,那么就可以使用
git rm
命令。
第12关(git rm —cached 移出版本库但不删除文件)
【题目】
- 一个文件不小心被添加到你的git版本库中了,找到它并将它从暂存区中移除。注意只是将这个文件从版本库中移除,不要删除文件。
【解答】
- 使用
git rm --cached
只会将文件从版本库中移除,而不会删除文件。
【小结】
git rm
对比git rm --cached
git rm
:删除文件,同时将文件移出git版本库;git rm --cached
:将文件移出git版本库,但是不删除文件;
第13关(git stash 没改完回头再改)
【题目】
- 做了一些改动但是暂时不想提交,希望之后再回来进行一些改动。
【解答】
- 可以使用 git stash 将一些改动暂存起来,之后回过头来再继续修改。
第14关(git mv 修改文件名)
【题目】
- 修改文件名,并将修改提交到暂存区。
【解答】
- 使用
git mv [旧文件名] [新文件名]
可以实现修改文件名,并将修改提交到暂存区。
第15关(git mv 调整目录结构)
【题目】
- 新建一个名为src的文件夹,将所有的.html后缀的文件都移入这个文件夹中。
【解答】
- 使用 git mv [文件名] [路径] 将指定文件移入指定路径,并将修改加入暂存区。
第16关(git log 查看提交记录)
【题目】
- 查看提交记录,给出最近一次提交的hash值。
【解答】
- 使用
git log
查看提交记录。
- 提交记录如下:
第17关(git tag 给提交做标记)
【题目】
- 将当前提交标记为“new_tag”
【解答】
- 使用
git tag [标记名称]
给当前提交标记一个名称,也可以使用git tag [标记名称] [id]
给特定某个id的提交标记一个名称。
- 可以使用
git log
查看一下,可以看到tag: new_tag
。
第18关(git push origin —tags 推送标签到远程仓库)
【题目】
- 将本地标签(tags)全部推送到远程git仓库。
【解答】
- 使用
git push origin [标签名]
可以将某个标签推送到远程仓库,使用git push origin --tags
可以将所有本地标签都推送到远程仓库。
需要这样做的原因是:默认情况下,
git push
不会将标签推送到远程仓库,因此需要显式推送。
第19关(git commit —amend 修改最近一次提交)
【问题】
- 上一次提交时,有一个文件忘记加入了,希望能修改最近一次提交,把这个文件提交进去。
【解答】
- 我们先使用 git log 打印一下提交记录
- 然后尝试用 git commit —amend 修改最近一次提交。
- 我们使用 git log 将最近的提交打出来。
第20关(git commit [时间] 指定提交时间)
【问题】
- 指定提交的时间(未来某个时间)
【解答】
- 使用
git commit --date=" "
指定提交时间
第21关(git reset HEAD [文件名] 将文件取回到暂存区)
【问题】
- 有两个文件被提交了,但是事实上我们希望先提交其中的一个,再去提交另外一个。我们希望将其中一个先放回暂存区。
【解答】
- 使用
git reset HEAD [文件名]
将指定文件取回到暂存区。
第22关(git reset 撤销上一次提交)
【问题】
- 上一次提交太快了,希望可以撤回。
【解答】
- 我们先使用
git log
看一下目前的提交记录:
- 我们使用
git reset --soft
将上一次的提交放入暂存区
- 再次使用 git log 查看一下提交记录:
- 使用 git status 查看一下暂存区的情况:
【小结】撤销上一次提交有三种方式:
- 将上一次提交放入暂存区:
--soft
- 将上一次提交放回工作区:
--mixed
- 直接抛弃:
--hard
第23关(git checkout 恢复到上一次)
【问题】
- 放弃当前修改,使用上一次提交的结果。
【解答】
- 使用
git checkout [文件名]
第24关(git remote 查看远程仓库)
【问题】
- 查看一下远程仓库。
【解答】
- 使用
git remote
第25关(git remote -v 查看远程仓库及地址)
【问题】
- 查看远程仓库以及它们的地址。
【解答】
- 使用
git remote -v
第26关(git pull origin [远程分支])
【问题】
- 拉取远程仓库中分支到本地
【解答】
- 使用
git pull origin [远程分支]
第27关(git remote add origin [远程仓库地址])
【问题】
- 添加远程仓库地址
【解答】
- 使用
git remote add origin [远程仓库地址]
第28关(git rebase 变基 && git push 推送到远程仓库)
【问题】
- 先变基再推送
【解答】
- 先使用 git rebase 变基,再使用 git push 推送到远程仓库。
第29关(git diff 查看代码变动)
【问题】
- 查看代码和上一次提交相比有哪些变动。
【解答】
- 使用
git diff
【git diff 更多用法】
git diff
:比较工作区和暂存区git diff --cached
:比较暂存区和git仓库git diff HEAD
:查看工作目录和最近一次提交的内容差异
第30关(git blame 查看文件修改人)
【问题】
- 查看文件修改人。
【解答】
- 使用 git blame 可以列出文件中每行的修改人
- 使用
git blame
命令后,会显示每行的修改人。
第31关(git branch 创建分支)
【问题】
- 创建一个新的分支
【解答】
- 使用
git branch [分支名]
创建一个新的分支
- 使用
git branch
查看分支
第32关(git checkout 切换分支)
【问题】
- 创建一个新的分支,并切换过去
【解答】
- 使用 git branch 创建分支,使用 git checkout 切换分支
第33关(git checkout [标签名] 按标签名切换分支)
【问题】
- 切换到某个标签名的分支
【解答】
- 使用
git tag
查看所有标签
- 使用
git checkout [标签名]
切换到某个标签名的分支
第34关(git checkout tags over branch)
【问题】
- 切换到某个特定的分支,但是分支名和标签名重叠了。
【解答】
- 命令还是git checkout,可以使用tags指定标签名。
- 先使用git log 查看一下提交记录。
- 然后使用 git checkout tags/[标签名] 切换到特定标签名的分支。
第35关(git branch 为指定提交创建分支)
【问题】
- 为当前提交的前一个提交创建一个分支。
【解答】
- 使用
git branch [分支名] [位置]
- 使用
git log
可以看到添加后的分支 test_branch
【
~
和^
】 参考资料:~ 和 ^ 的区别是什么? - Stack Overflow 简单总结一下:
~n
: 获取第n代的祖先提交;^n
:获取第n个父提交;有一个非常经典的例子:
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
A = = A^0
B = A^ = A^1 = A~1
C = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2
第36关(git branch -d 删除分支)
【问题】
- 删除一个古老的分支
【解答】
- 使用
git branch -d [分支名]
删除一个分支
第37关(git push 将分支推送到远程仓库)
【问题】
- 将一个分支推送到远程仓库
【解答】
- 先使用 git branch 查看一下本地分支
- 使用
git push [远程仓库名] [本地分支名]:[远程分支名]
将本地分支推送到远程仓库
第38关(git merge 合并分支)
【问题】
- 将 feature 分支合并到 master 分支
【解答】
- 使用
git merge [分支名]
【
git merge
和git rebase
的区别】 参考资料:【掘金】Git merge 和 rebase 分支合并命令的区别 - 富途Web开发团队
第39关(git fetch 获取)
【问题】
- 获取远程仓库中的修改,但不合并到当前分支。
【解答】
- 使用
git fetch
git pull
=git fetch
+git merge
第40关(git rebase 变基)
【问题】
- 将一个分支通过变基的方式合并到master分支。
【解答】
- 先使用
git log --graph --all
查看一下提交记录:
- 然后我们切换到feature分支,执行变基操作
- 完成后再查看一下提交记录,可以发现其中的变化
- 完成!
【关于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上,需要执行一次变基操作。
【解答】
- 使用
git rebase --onto [新分支] [原分支]
第42关(git repack ???)
【问题】
- 优化仓库打包结构?去除冗余包?
【解答】
- 使用
git repack -d
这题我确实没搞懂,以后懂了再回来更新。
第43关(未完待续)
后面的东西越来越难了。。。