在游戲中學(xué)習(xí)Git之Githug(Windows版)
1. githug安裝
- 首先剂买,下載Git工具付呕,并配置Git工具安裝目下面的cmd目錄到環(huán)境變量的PATH中公般,這樣我們就可以在cmd下面使用git了秘噪。
- 其次厦酬,githug是運(yùn)行在ruby上的迈勋,所以我們還要安裝ruby炬灭,下載ruby,安裝時(shí)勾選“Add Ruby executables to your PATH”靡菇,忘了勾選的要配置Ruby安裝目錄下面的bin目錄到環(huán)境變量的PATH中重归。
- 再次,安裝githug厦凤,在安裝githug先確認(rèn)ruby好了嗎鼻吮,然后在安裝githug
- 在cmd下面輸入ruby --version查看ruby是否安裝好了,若沒有较鼓,則說明環(huán)境變量還沒有生效椎木,注銷戶用再登錄
- 在cmd下面輸入gem install githug安裝githug
2. githug相關(guān)說明
1. githug是用來干什么的
githug是設(shè)計(jì)給你學(xué)習(xí)Git的實(shí)用方法违柏。它有一系列的關(guān)卡,每一關(guān)都需要你用git命令得到一個(gè)正確的答案香椎。
2. githug關(guān)卡說明
githug一共有55關(guān):
#1: init
#2: config
#3: add
#4: commit
#5: clone
#6: clone_to_folder
#7: ignore
#8: include
#9: status
#10: number_of_files_committed
#11: rm
#12: rm_cached
#13: stash
#14: rename
#15: restructure
#16: log
#17: tag
#18: push_tags
#19: commit_amend
#20: commit_in_future
#21: reset
#22: reset_soft
#23: checkout_file
#24: remote
#25: remote_url
#26: pull
#27: remote_add
#28: push
#29: diff
#30: blame
#31: branch
#32: checkout
#33: checkout_tag
#34: checkout_tag_over_branch
#35: branch_at
#36: delete_branch
#37: push_branch
#38: merge
#39: fetch
#40: rebase
#41: repack
#42: cherry-pick
#43: grep
#44: rename_commit
#45: squash
#46: merge_squash
#47: reorder
#48: bisect
#49: stage_lines
#50: find_old_branch
#51: revert
#52: restore
#53: conflict
#54: submodule
#55: contribute
3. githug常用命令
-
githug
: 開始闖關(guān)或進(jìn)入下一關(guān) -
githug hint
: 過關(guān)提示 -
githug levels
: 顯示關(guān)卡列表 -
githug reset [關(guān)卡名]
: 重啟本關(guān)或者重啟到指定關(guān)卡名的關(guān)卡
4. 開始闖關(guān)
1. 第1關(guān)
- 關(guān)卡描述:
有一個(gè)新的目錄“git_hug”被創(chuàng)建了漱竖,在它里面初始化一個(gè)倉庫
- 通關(guān)操作:
git init
2. 第2關(guān)
- 關(guān)卡描述:
設(shè)置你的有戶名與電子郵箱,這很重要畜伐,只有這樣你的提交才會(huì)被識別
- 通關(guān)操作:
git config --local user.name lavor
git config --local user.email lavor@qq.com
3. 第3關(guān)
- 關(guān)卡描述:
有一個(gè)名叫“README”的文件夾馍惹,你要將它加入到暫存區(qū)。
注意:每一關(guān)都是一個(gè)新倉庫玛界,不要在前面的關(guān)卡找文件讼积。
- 通關(guān)操作:
git add README
4. 第4關(guān)
- 關(guān)卡描述:
“README”文件已經(jīng)被加入到暫存區(qū),現(xiàn)在提交它脚仔。
- 通關(guān)操作:
git commit -m "add README"
5. 第5關(guān)
- 關(guān)卡描述:
從“https://github.com/Gazler/cloneme”克隆倉庫勤众。
- 通關(guān)操作:
git clone https://github.com/Gazler/cloneme
6. 第6關(guān)
- 關(guān)卡描述:
從“https://github.com/Gazler/cloneme”克隆倉庫到“my_cloned_repo”目錄。
- 通關(guān)操作:
git clone https://github.com/Gazler/cloneme my_cloned_repo
7. 第7關(guān)
- 關(guān)卡描述:
文本編輯器“vim”為所有文件創(chuàng)建以“.swp”結(jié)尾的文件鲤脏,這些文件當(dāng)前都被打開了们颜。我們不希望他們潛入到倉庫。讓倉庫忽略“.swp”文件猎醇。
- 通關(guān)操作:
//由于沒有裝vim窥突,直接用記事本打開“.gitignore”文件,在文件末尾換行并加上“*.swp”硫嘶。
8. 第8關(guān)
- 關(guān)卡描述:
注意一些文件以“.a”為擴(kuò)展名阻问。我們希望忽略這些文件除了“l(fā)ib.a”文件。
- 通關(guān)操作:
//由于沒有裝vim沦疾,直接用記事本打開“.gitignore”文件称近,在文件末尾換行并加上“*.a”,再換行哮塞,在文件末尾加上“!lib.a”刨秆。
9. 第9關(guān)
- 關(guān)卡描述:
倉庫中有一些文件,其中一個(gè)沒有被跟蹤忆畅,它是哪個(gè)文件衡未。
- 通關(guān)操作:
git status
10. 第10關(guān)
- 關(guān)卡描述:
倉庫中有一些文件。多少文件將要被提交家凯。
- 通關(guān)操作:
git status
11. 第11關(guān)
- 關(guān)卡描述:
一個(gè)文件從工作樹上面移除了缓醋,但是沒有從倉庫中移除。找到這個(gè)文件并移除它绊诲。
- 通關(guān)操作:
git status
git add deleteme.rb
12. 第12關(guān)
- 關(guān)卡描述:
一個(gè)文件以外地加入到你的暫存區(qū)送粱,找出這個(gè)文件并將它從暫存區(qū)移除。
*注意*:不要將它從文件系統(tǒng)中移除驯镊,僅僅將它git中移除葫督。
- 通關(guān)操作:
git status
git rm --cached deleteme.rb
13. 第13關(guān)
- 關(guān)卡描述:
你做了一些修改竭鞍,并且向稍后再它們上面工作。你應(yīng)該保存它們橄镜,但是不提交它們偎快。
- 通關(guān)操作:
git stash
14. 第14關(guān)
- 關(guān)卡描述:
我們有一個(gè)名為“oldfile.txt”的文件。我們想要將它重命名為“newfile.txt”并保存該修改洽胶。
- 通關(guān)操作:
git mv oldfile.txt newfile.txt
15. 第15關(guān)
- 關(guān)卡描述:
你添加了一些文件到你的倉庫晒夹,但現(xiàn)在知道你的項(xiàng)目需要進(jìn)行調(diào)整。創(chuàng)建一個(gè)新的文件夾命名為“src”,使用git將所有的".html"文件到該文件夾中姊氓。
- 通關(guān)操作:
git mv about.html contact.html index.html src
16. 第16關(guān)
- 關(guān)卡描述:
你將要尋找最新提交的哈希丐怯,為此你將研究該倉庫的日志。
- 通關(guān)操作:
git log
17. 第17關(guān)
- 關(guān)卡描述:
我們有一個(gè)git倉庫翔横,并且我們想用“new_tags”來標(biāo)記當(dāng)前的提交读跷。
- 通關(guān)操作:
git tag "new_tag"
18. 第18關(guān)
- 關(guān)卡描述:
倉庫中有一些標(biāo)記沒有被推送到遠(yuǎn)程倉庫,現(xiàn)在推送它們禾唁。
- 通關(guān)操作:
git push --tags origin master
19. 第19關(guān)
- 關(guān)卡描述:
“README”文件被提交了效览,但是“forgotten_file.rb”文件好像忘了提交。添加這個(gè)文件荡短,并改正上次提交使之包含該文件丐枉。
- 通關(guān)操作:
git add forgotten_file.rb
git commit --amend -m "改正后提交"
20. 第20關(guān)
- 關(guān)卡描述:
用未來的時(shí)間日期(比如明天)來提交改變。
- 通關(guān)操作:
git commit --date=06.13.2016T09:00:00 -m "指定提交時(shí)間為2016年6月13日9點(diǎn)整"
21. 第21關(guān)
- 關(guān)卡描述:
有兩個(gè)文件要提交掘托,目標(biāo)是將每個(gè)文件添加為單獨(dú)提交瘦锹,但意外地兩個(gè)文件都被添加到暫存區(qū)了。用“reset”命令將“to_commit_second.rb”文件從暫存區(qū)移除(不做提交操作)闪盔。
- 通關(guān)操作:
git reset HEAD to_commit_second.rb
22. 第22關(guān)
- 關(guān)卡描述:
你提交太快了⊥湓海現(xiàn)在你要撤消最后一次提交,同時(shí)保持索引锭沟。
- 通關(guān)操作:
git reset --soft HEAD~1
23. 第23關(guān)
- 關(guān)卡描述:
文件已經(jīng)被修改了抽兆,但是你不想保存該修改。從最后一次提交中檢出“config.rb”文件族淮。
- 通關(guān)操作:
git checkout config.rb
24. 第24關(guān)
- 關(guān)卡描述:
項(xiàng)目有一個(gè)遠(yuǎn)程倉庫,找到它凭涂。
- 通關(guān)操作:
git remote -v
25. 第25關(guān)
- 關(guān)卡描述:
遠(yuǎn)程倉庫有一個(gè)與之關(guān)聯(lián)的url祝辣。輸入遠(yuǎn)程倉庫“remote_location” 的url。
- 通關(guān)操作:
git remote -v
26. 第26關(guān)
- 關(guān)卡描述:
你需要從“origin”倉庫拉下改變到本地倉庫切油。
- 通關(guān)操作:
git pull origin master
27. 第27關(guān)
- 關(guān)卡描述:
添加一個(gè)url為“https://github.com/githug/githug”的遠(yuǎn)程倉庫蝙斜,并為該遠(yuǎn)程倉庫命名為“origin”。
- 通關(guān)操作:
git remote add origin https://github.com/githug/githug
28. 第28關(guān)
- 關(guān)卡描述:
你的本地“master”分支與遠(yuǎn)程倉庫“origin”的“master” 分支不一致澎胡,請用遠(yuǎn)程倉庫“origin”的“master” 分支來改變你的提交孕荠,并將提交推送到遠(yuǎn)程倉庫娩鹉。
- 通關(guān)操作:
git rebase origin/master
git push origin master
29. 第29關(guān)
- 關(guān)卡描述:
自最后一次提交后,“app.rb”文件發(fā)生了一些改變稚伍。找出該文件那些行被改變了弯予。
- 通關(guān)操作:
git diff
30. 第30關(guān)
- 關(guān)卡描述:
有人將密碼放進(jìn)了“config.rb”文件中,找出是誰个曙。
- 通關(guān)操作:
git blame config.rb
31. 第31關(guān)
- 關(guān)卡描述:
有一個(gè)新的目錄“git_hug”被創(chuàng)建了锈嫩,在它里面初始化一個(gè)倉庫
- 通關(guān)操作:
git init
32. 第32關(guān)
- 關(guān)卡描述:
你想在一段可能打破一些東西的代碼上工作,創(chuàng)建一個(gè)“test_code”分支垦搬。
- 通關(guān)操作:
git branch test_code
33. 第33關(guān)
- 關(guān)卡描述:
你需要在“1.2”版本的應(yīng)用程序上修復(fù)一個(gè)bug呼寸。檢出“v1.2”標(biāo)記。
- 通關(guān)操作:
git checkout v1.2
34. 第34關(guān)
- 關(guān)卡描述:
你需要在“1.2”版本的應(yīng)用程序上修復(fù)一個(gè)bug猴贰。檢出“v1.2”標(biāo)記(注意:有一個(gè)名為“v1.2”的分支)对雪。
- 通關(guān)操作:
git checkout tags/v1.2
35. 第35關(guān)
- 關(guān)卡描述:
在前一個(gè)提交你忘了創(chuàng)建分支,并在該分支上進(jìn)行提交操作米绕。在最后一次提交前創(chuàng)建一個(gè)名為“test_branch”的分支瑟捣。
- 通關(guān)操作:
git branch test_branch HEAD~1
36. 第36關(guān)
- 關(guān)卡描述:
在你的項(xiàng)目中創(chuàng)建了太多的分支。有一個(gè)舊的名為“delete_me”的分支义郑,你應(yīng)該刪除它蝶柿。
- 通關(guān)操作:
git branch -d delete_me
37. 第37關(guān)
- 關(guān)卡描述:
在本地分支上你做了一些改變,并且想共享它非驮,但是不準(zhǔn)備將它合并到“master”分支上交汤。
- 通關(guān)操作:
git push origin test_branch:test_branch
38. 第38關(guān)
- 關(guān)卡描述:
在“feature”分支上有一個(gè)文件,讓我們將它合并到“master”分支上劫笙。
- 通關(guān)操作:
git merge feature
39. 第39關(guān)
- 關(guān)卡描述:
好像有一個(gè)新的分支被推送到了遠(yuǎn)程倉庫助琐。得到與本地倉庫的改變,但是不合并它們益兄。
- 通關(guān)操作:
git fetch origin
40. 第40關(guān)
- 關(guān)卡描述:
我們用“git rebase”工作流與“feature”分支準(zhǔn)備進(jìn)入“master”分支燕垃。將“feature”分支上的改變合并到“master”上。
- 通關(guān)操作:
git rebase master feature
41. 第41關(guān)
- 關(guān)卡描述:
優(yōu)化你的倉庫是如何包裝的允华,確保多余的包被刪除圈浇。
- 通關(guān)操作:
git repack -d
42. 第42關(guān)
- 關(guān)卡描述:
你的新功能是不值得花時(shí)間的,你將要?jiǎng)h除它靴寂。但是它有一個(gè)提交填充了“README”文件磷蜀,你想要將這個(gè)提交同樣應(yīng)用到“master”分支上。
- 通關(guān)操作:
git log --all
git cherry-pick ca32a6dac7b6f97975edbe19a4296c2ee7682f68
43. 第43關(guān)
- 關(guān)卡描述:
你項(xiàng)目的截止日期快到了百炬,你想評估你的代碼中還有多少“TODO”剩下褐隆。
- 通關(guān)操作:
git grep TODO
44. 第44關(guān)
- 關(guān)卡描述:
改正你第一次(非根)提交信息中的錯(cuò)誤。
- 通關(guān)操作:
git log
git rebase -i a3d1ecb
45. 第45關(guān)
- 關(guān)卡描述:
你做了幾次提交剖踊,但是想將這些修改都合并到一個(gè)提交中庶弃。
- 通關(guān)操作:
git log
git rebase -i 9760312
46. 第46關(guān)
- 關(guān)卡描述:
合并“l(fā)ong-feature-branch”分支中所有的提交到一個(gè)提交中衫贬。
- 通關(guān)操作:
git merge --squash long-feature-branch
git commit -m "merge squash"
47. 第47關(guān)
- 關(guān)卡描述:
你做了幾次提交,但是順序錯(cuò)了歇攻。請為你的提交重新排序固惯。
- 通關(guān)操作:
git log
git rebase -i b49d328
git log
48. 第48關(guān)
- 關(guān)卡描述:
一個(gè)bug在某個(gè)地方被引進(jìn),你知道運(yùn)行“ruby prog.rb 5”應(yīng)該輸出“15”掉伏。你同樣可以運(yùn)行“make test”缝呕。進(jìn)入bug的提交的哈希的前7個(gè)字母是什么。
- 通關(guān)操作:
git log
git bisect start master f608824
git bisect run make test
PS:雖然操作正確斧散,也找到了錯(cuò)誤的提交供常,但是卻不能通過本關(guān),應(yīng)該是沒有“make”命令的原因鸡捐。直接利用“githug reset stage_lines”調(diào)到第49關(guān)栈暇,之后即使闖過了第49關(guān)進(jìn)入下一關(guān)時(shí)還是會(huì)進(jìn)入第48關(guān),所以第49關(guān)及以后箍镜,都需要通過“githug reset 關(guān)卡名”來進(jìn)入指定關(guān)卡源祈。
49. 第49關(guān)
- 關(guān)卡描述:
你在一個(gè)單獨(dú)的文件里做了一些修改,這些修改屬于兩個(gè)功能色迂。但是這些修改都沒有被暫存香缺,暫存屬于第一個(gè)功能的修改。
- 通關(guān)操作:
git status
git add feature.rb -p
e
50. 第50關(guān)
- 關(guān)卡描述:
你一直在一個(gè)分支工作歇僧,被一個(gè)主要問題弄得心煩意亂图张,并且你忘了這個(gè)分支的名字。切換回那個(gè)分支诈悍。
- 通關(guān)操作:
git reflog
git checkout solve_world_hunger
51. 第51關(guān)
- 關(guān)卡描述:
你做了多次提交祸轮,但是想要撤銷中間的提交。所有的提交已經(jīng)被推送侥钳,你不能改變現(xiàn)存的歷史适袜。
- 通關(guān)操作:
git log
git revert 59f058e
git log
52. 第52關(guān)
- 關(guān)卡描述:
你決定通過運(yùn)行“git reset --hard HEAD^”來刪除最新的一次提交(這是不明智的)。
稍后你改變了想法舷夺,你想要回滾那次提交苦酱。重新存儲(chǔ)被刪除的提交。
- 通關(guān)操作:
git reflog
git checkout e185df9
53. 第53關(guān)
- 關(guān)卡描述:
你需要合并“mybranch”分支到當(dāng)前分支(“master”分支)给猾。
但是“mybranch”分支中可能有一些錯(cuò)誤的改變躏啰,這可能引起沖突。
解決合并中你遇到的沖突耙册,并完成合并操作。
- 通關(guān)操作:
git merge mybranch
vim poem.txt
git add poem.txt
git commit -m "add poem.txt"
54. 第54關(guān)
- 關(guān)卡描述:
你想要將“https://github.com/jackmaney/githug-include-me”倉庫的文件放進(jìn)“./githug-include-me”目錄毫捣。
這樣做详拙,不通過克隆倉庫或者復(fù)制遠(yuǎn)程倉庫文件到本地倉庫帝际。
- 通關(guān)操作:
git submodule add https://github.com/jackmaney/githug-include-me githug-include-me
55. 第55關(guān)
- 關(guān)卡描述:
這是最后一關(guān),目標(biāo)是通過在Github上發(fā)出一個(gè)pull request請求來為該倉庫做貢獻(xiàn)饶辙。
注意這一關(guān)是被設(shè)計(jì)用來鼓勵(lì)你為Githug做有效的貢獻(xiàn)蹲诀,而不是用來測試你創(chuàng)建 pull request請求的能力。
可以被接受的貢獻(xiàn)有關(guān)卡弃揽,bug修復(fù)脯爪,文檔改進(jìn)。
更過精彩內(nèi)容盡在我的github倉庫:https://github.com/lavor-zl/Github-Git