@lunar
2016-03-30T04:01:34.000000Z
字数 5204
阅读 2325
版本控制
程序员的自我修养
git是什么已经不必累述了,但是大家真的都能用好git吗?未必,许多人除了简单的pull,push和分支之外也就不会啥了,遇到一些简单的问题也不知如何是好。的确,有许多git的教程,但是我想看过一遍之后能记住并加以运用的究竟是少数,所以这里githug就派上了用场,它给初学者一个个使用git的关卡,在实际操作中逐渐上手git。
要安装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
。
设置你的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
添加文件进入git追踪。
s:git add README
由于前面你添加了readme文件,所以你的暂存区和工作区不一致,通过commit来提交更改,提交commit时需要附上提交信息,一般认为好的提交信息需要用简明的语句说明改动。
s:git commit -m "Add README"
从github上clone一个repo
s:git clone https://github.com/Gazler/cloneme
s:git clone http://github.com/Gazler/cloneme my_cloned_repo
设置git对某些文件的忽略,这样git就不会追踪这些文件,在.gitignore
文件中可以看到具体的设置。这里要新增对.swp
文件的忽略。
s:打开.gitignore
文件,在里面新加一行*.swp
这里我们要忽略所有.a
文件除了lib.a
。
s:在.gitignore
中加上
*.a
!lib.a
现在要查看当前那个文件没被追踪。
s:git status
然后就发现database.yml
没有被追踪。
同上
文件在计算机中被手动删除后依旧会留存在git中,所以我们需要在git 中移除它。
s:`git rm deleteme.rb
从git中移除但是并不删除该文件。
s:git rm --cached deleteme.rb
这里我们需要保存目前的工作进度但是不想提交它。
s:git stash
s:git mv oldfile.txt newfile.txt
你添加了一些文件到你的repo,但是刚刚发现他们没有很好的结构化,都散乱在一个文件夹中。现在你要把所有的.html
文件放到\src
文件夹中
s:
mkdir src
git mv index.html src
git mv about.html src
git mv contact.html src
这里应该是可以用通配符的。。但是不知道为啥总是提示bad source
需要你查看某次提交的hash值.
s: git log
为此次提交加上"new_tag"的标签。
s:git tag new_tag
这次需要把所有的标签同步到远程仓库。
s:git push --tags origin master
有时我们在commit之后才发现有个文件没有add(是我。。),如果为这个文件单独commit会显得提交记录很凌乱,特别是对于经常丢三落四的。。所以我们可以追加提交,将这次提交追加到上一次,算作一次提交。
s:
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 后加文件名的话就和add的作用相反。
s:git reset to_commit_second.rb
你想要撤销上一次提交,但是同时不改变工作目录。这时候一般用到reset进行回滚,因为不想改变文件,只是更改git记录,所以这里用--soft
模式。
s:git reset --soft HEAD^
这里HEAD^
表示当前记录往前一个commit,如果是2个3个或是n个用HEAD~2
,HEAD~3
,HEAD~n
。
一个文件被修改了,但是你不想保存这些修改,使用checkout使其回滚到上一次commit。注意和reset file的不同,reset是文件操作,这里是内容操作。
s:git checkout config.rb
git除了在本机上有仓库外还有远程仓库,这里需要你找出远程仓库名。
s:git remote
每个remote对应一个url,请找出,这里重复以上命令并开启啰嗦模式(冗长verbose)。
s:git remote -v
在知道你的远程仓库后你就可以从远程仓库拉取改动,这就为异地/多人协作提供方便。利用pull加你的远程仓库名以及分支(除非有默认分支,否则必须要有分支名,一般都有master分支)。
s:git remote
得知远程仓库为origin.
git pull origin master
如题。
s:git git remote add origin https://github.com/githug/githug
将改动推送到远程仓库,这里先拉取改动,和本地仓库合并后再推送到远程仓库。咦,这样怎么不行呢?这是因为这里你的commit在远程分支最新的commite之前,也就是说你的代码要插在remote master中间了。这里就要用到重定基rebase。即以当前最新的远程master为基础。关于rebase具体用法,可以看这里。
s:git rebase origin/master master
git push origin master
直接键入git diff
可以看到上次commit后的改动。
s:git diff
将文件中每行代码信息平白地展示出来。
s:git blame config.rb
看清题目要求,要你给出设置密码的人,不是给出密码。。啊喂。。为什么是蜘蛛侠呀。
s:git branch test_code
这里不同于上面利用签出回滚,这里是要签到另一个分支去。
s:
git branch my_branch
git checkout my_branch
这里要签到某个tag上。
s:git checkout v1.2
天哪噜,tag和分支重名了都叫v1.2。现在要签到tagv1.2而不是分支v1.2。
s:git checkout tags/v1.2
这次你需要回到上次commit之前创建分支。
s:
git checkout HEAD^
git branch test_branch
s:git branch -d delete_me
将分支推送到远程那里,如果远程无此分支会自动创建。
s:git push origin test_branch
将另一分支的改动合并到当前分支。
s:git merge feature
拉取远程仓库改动但不合并到本地。
s:git fetch origin
这里不用加master因为origin仓库有默认分支new_branch而无master分支。
重定基在第28关有说明,可以回头看看。
s:
git branch // 发现有master和feature两个分支
git checkout feature // 签到要重定基的分支
git rebase master
这里在打包过程中要移除重复文件,所以要加上-d
。
s:git repack -d
这里你要废弃一个分支但是这个分支中的某个commit的改动需要得到保留。需要先到那个分支去查看那个commit的hash值。
s:
git checkout new-feature
git log
git checkout master
git cherry-pick ca32a6dac7b6f97975edbe19a4296c2ee7682f68
你的deadline临近了,你需要查看你的代码中有多少TODO。
s:git grep "TODO"
s:
git log
git rebase -i <HASH value>
你要把几次commit压缩为一次commit
git rebase -i
将另一分支上的commit压缩合并为一个commit
git merge --squash long-feature-branch
git commit
打不动了。。先玩到这儿吧。。基本上也就够用了。