通关Githug(一)


原文: 通关Githug(一)
date: 2017-12-25 12:39:04


[TOC]

一. 序言

第一眼看到githug, 以为是把github拼错.

原来… 是个游戏!

关于Git的学习, 大四写过一篇: git小玩 .

虽然很多IDE都有集成git插件, 在了解git命令和使用场景后再去使用IDE才会更加明白

甚至我认为很多操作使用git bash不比IDE效率慢

二. 介绍

当然, githug不是什么RPG, FPS之类的游戏.

而是一个围绕git知识, 每一关都会帮你自动搭建好实验场景, 告诉你任务背景, 来完成这些关卡.

其实这个跟github提供的在线练习很像, 但是我觉得githug更加好玩!

github地址: https://github.com/Gazler/githug

花了一天时间去通关. 当中也有过不去的然后去翻译和查通关攻略了

三. 安装使用

1. 安装

Githug可以使用在Linux, Windows, OS X下.

我以 CentOS 7 为例:

在安装Githug之前首先确认有Ruby环境.

查看是否安装: ruby --version

这里我选择自动安装的方式: sudo yum install ruby

接着通过gem安装githug: gem install githug

安装完成.

2. 使用

Githug只有四个游戏命令, 很简单:

  • githug play: 开始玩, 会验证是否完成当前关卡, 完成则进入下一关(可缩写成githug),

    没完成则会提示你并提示任务要求

  • githug hint: 给你一点当前关卡的提示

  • githug reset: 重置当前关卡

  • githug levels: 列出所有关卡

在第一次输入githug开始游戏时, 会提示No githug directory found, do you wish to create one?

意思要初始化一个游戏目录. 输入y即可创建.

然后会出现一个git_hug目录, 以后所有关卡都会在该目录下生成文件和git对象. 每完成一关都会重新初始化游戏场景.

3. 关卡列表

为了方便查看, 所以列出所有关卡. 这里摘抄一个wiki.

关卡名称 学习内容 Git 命令
第1关 init 初始化仓库 git init
第2关 config 设置用户名和电子邮箱地址 git config
第3关 add 把文件添加到暂存区 git add
第4关 commit 提交 git commit
第5关 clone 克隆远程仓库 git clone
第6关 clone_to_folder 克隆远程仓库,并指定本地目录名 git clone
第7关 ignore 配置不被 Git 管理的文件 vim .gitignore
第8关 include 配置不被 Git 管理的文件 vim .gitignore
第9关 status 查看仓库状态 git status
第10关 number_of_files_committed 查看仓库状态 git status
第11关 rm 删除文件 git rm
第12关 rm_cached 从暂存区中移除文件,系 git add 的逆操作 git rm –cached
第13关 stash 保存而不提交 git stash
第14关 rename 文件改名 git mv
第15关 restructure 整理目录结构
第16关 log 查询日志 git log
第17关 tag 打标签 git tag
第18关 push_tags 把标签推送到远程仓库 git push –tags
第19关 commit_amend 修改最后一次提交 git commit –amend
第20关 commit_in_future 指定提交的日期 git commit –date
第21关 reset 从暂存区中移除文件,系 git add 的逆操作 git reset
第22关 reset_soft 撤销提交,系 git commit 的逆操作 git reset –soft
第23关 checkout_file 撤销对一个文件的修改 git checkout
第24关 remote 查询远程仓库 git remote
第25关 remote_url 查询远程仓库的 URL git remote -v
第26关 pull 从远程仓库拉取更新 git pull
第27关 remote_add 添加远程仓库 git remote
第28关 push 把提交推送到远程仓库 git push
第29关 diff 查看文件被修改的细节 git diff
第30关 blame 查询每一行代码被谁编辑过 git blame
第31关 branch 创建分支 git branch
第32关 checkout 切换分支 git checkout
第33关 checkout_tag 切换到标签 git checkout
第34关 checkout_tag_over_branch 切换到标签 git checkout
第35关 branch_at 在指定的提交处创建分支 git branch
第36关 delete_branch 删除分支 git branch -d
第37关 push_branch 推送分支到远程仓库 git push
第38关 merge 合并分支 git merge
第39关 fetch 从远程仓库抓取数据 git fetch
第40关 rebase 变基合并 git rebase
第41关 repack 重新打包 git repack
第42关 cherry-pick 合并分支上指定的提交 git cherry-pick
第43关 grep 搜索文本 git grep
第44关 rename_commit 修改历史提交的说明 git rebase -i
第45关 squash 把多次提交合并成一次提交 git rebase -i
第46关 merge_squash 合并分支时把多次提交合并成一次提交 git merge –squash
第47关 reorder 调整提交顺序 git rebase -i
第48关 bisect 用二分法定位 bug git bisect
第49关 stage_lines 添加文件的部分行到暂存区 git add –edit
第50关 file_old_branch 查看 Git 上的操作历史 git reflog
第51关 revert 取消已推送到远程仓库的提交 git revert
第52关 restore 恢复被删除的提交 git reset –hard
第53关 conflict 解决冲突
第54关 submodule 把第三方库当作子模块 git submodule
第55关 contribute 捐献

四. 开始游戏

Level 1: init

A new directory, git_hug, has been created; initialize an empty repository in it.

git_hug目录下初始化一个仓库

[root@pipeline-cloud-test02 git_hug]# git init
Initialized empty Git repository in /home/githug/git_hug/.git/
[root@pipeline-cloud-test02 git_hug]# ls -a
.  ..  .git  .gitignore  .profile.yml
[root@pipeline-cloud-test02 git_hug]# githug
Congratulations, you have solved the level!

空目录和有文件的目录都可以初始化, 可以看到隐藏文件.git, 如同.svn一样. 该目录会被git所管理.

Level 2: config

Set up your git name and email, this is important so that your commits can be identified.

配置用户名和邮箱是为了提交代码时的团队标识

[root@pipeline-cloud-test02 git_hug]# git config --add user.name thank
[root@pipeline-cloud-test02 git_hug]# git config --add user.email coderthank@163.com
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
What is your name? thank
What is your email? coderthank@163.com
Your config has the following name: thank
Your config has the following email: coderthank@163.com
Congratulations, you have solved the level!

补充:

git config --add [--global/--local] user.name xxx # 增加name配置信息
git config --get [--global/--local] user.name xxx # 查看name配置信息
# --global/--local参数用来表示是全局配置还是本地配置
# email的话换成user.email

git config –list # 查看git全局配置

当然, 有配置就会有配置的记录文件. 你可以到~/.gitconfig去编辑配置信息

Level 3: add

There is a file in your folder called ‘README’, you should add it to your staging area.

添加README文件到暂存区

[root@pipeline-cloud-test02 git_hug]# git add README
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

补充:

首先补充一个图:

[图片上传失败...(image-1e51ef-1558407156745)]

关于这三个工作区域:

  • History 也可以叫repository(git仓库): 最终确定的文件能保存到仓库, 成为一个新的版本, 并且对他人可见
  • Staging area (暂存区,Cache, Index): 暂存已经修改的文件
  • Working directory(工作区): 也就是你实际看见的工作目录

Level 4: commit

The ‘README’ file has been added to your staging area, now commit it.

把暂存区的README文件提交

[root@pipeline-cloud-test02 git_hug]# git commit -m "add README file"
[master (root-commit) a3317a2] add README file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

Level 5: clone

Clone the repository at https://github.com/Gazler/cloneme.

[root@pipeline-cloud-test02 git_hug]# git clone https://github.com/Gazler/cloneme
Cloning into 'cloneme'...
remote: Counting objects: 7, done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 7
Unpacking objects: 100% (7/7), done.
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

回一下第1关, 可以总结下创建git仓库大致有两种: git init初始化和git clone克隆远程git项目

Level 6: clone to folder

Clone the repository at https://github.com/Gazler/cloneme to ‘my_cloned_repo’.

还是克隆远程git项目, 只不过换个名字

[root@pipeline-cloud-test02 git_hug]# git clone  https://github.com/Gazler/cloneme my_cloned_repo
Cloning into 'my_cloned_repo'...
remote: Counting objects: 7, done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 7
Unpacking objects: 100% (7/7), done.
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

Level 7: ignore

The text editor ‘vim’ creates files ending in ‘.swp’ (swap files) for all files that are currently open. We don’t want them creeping into the repository. Make this repository ignore ‘.swp’ files.

有些零食文件什么的不需要git来管理. 忽略他们

[root@pipeline-cloud-test02 git_hug]# ls -a
.  ..  .git  .gitignore  .profile.yml  README.swp
[root@pipeline-cloud-test02 git_hug]# vim .gitignore
[root@pipeline-cloud-test02 git_hug]# more .gitignore
.profile.yml
.gitignore
*.swp
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

.gitignore 在仓库的根目录下, 用于配置可忽略文件的规则

Level 8: include

Notice a few files with the ‘.a’ extension. We want git to ignore all but the ‘lib.a’ file.

在忽略的里面排除掉不忽略的

[root@pipeline-cloud-test02 git_hug]# ls -a
.  ..  first.a  .git  .gitignore  lib.a  .profile.yml  second.a
[root@pipeline-cloud-test02 git_hug]# vim .gitignore
[root@pipeline-cloud-test02 git_hug]# more .gitignore
.profile.yml
.gitignore
*.a
!lib.a  # 加"!"就是不忽略
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

Level 9: status

There are some files in this repository, one of the files is untracked, which file is it?

也就是去找没有登记的文件, Untrakced File

[root@pipeline-cloud-test02 git_hug]# git status -s
A  Guardfile
A  README
A  config.rb
A  deploy.rb
A  setup.rb
?? database.yml
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
What is the full file name of the untracked file? database.yml
Congratulations, you have solved the level!

通过git status查看到的文件有这三种状态:

  • untracked: 未被登记的
  • modified: 修改过的
  • staged: 暂存区的

Level 10: number_of_files_committed

There are some files in this repository, how many of the files will be committed?

找出有几个要被提交的文件, 什么状态的文件能被提交? 只有暂存区的了

[root@pipeline-cloud-test02 git_hug]# git status  -s
A  rubyfile1.rb
M  rubyfile4.rb
 M rubyfile5.rb
?? rubyfile6.rb
?? rubyfile7.rb
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
How many changes are going to be committed? 2
Congratulations, you have solved the level!

补充:

如果你用git status, 你会明显看到有两个文件处于Changes to be commited.

如果加-s查看简要列表, 你需要明白前面的标志位是什么意思.

首先第一个标志位: 是Staging area中的变化, 第二个标志位: 是Working directory中发生的更改.

标志位上的字母A, M, D, ?就不用说了

Level 11: rm

A file has been removed from the working tree, however the file was not removed from the repository. Find out what this file was and remove it.

有个文件只在工作空间被删了, 然而没有从仓库里删掉. 找到它并删掉rm_cached

[root@pipeline-cloud-test02 git_hug]# git status -s
 D deleteme.rb
[root@pipeline-cloud-test02 git_hug]# git rm deleteme.rb
rm 'deleteme.rb'
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

在删除git文件时, 不要用rm的系统级别删除, 这样git会失去对这个文件的追踪. 而应该用git rm删除.

Level 12: rm_cached

A file has accidentally been added to your staging area, find out which file and remove it from the staging area. NOTE Do not remove the file from the file system, only from git.

有个文件被错误的添加到暂存区, 找到他, 并从暂存区删除, 注意不是从文件系统删除.

[root@pipeline-cloud-test02 git_hug]# git status -s
A  deleteme.rb
[root@pipeline-cloud-test02 git_hug]# git rm --cached deleteme.rb
rm 'deleteme.rb'
[root@pipeline-cloud-test02 git_hug]# git status -s
?? deleteme.rb
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

Level 13: stash

You’ve made some changes and want to work on them later. You should save them, but don’t commit them.

你已经在工作空间做了一些改动, 可能出现别的任务要你改动, 你需要保存之前的改动稍后处理, 但并不是提交.

[root@pipeline-cloud-test02 git_hug]# git status -s
 M lyrics.txt
[root@pipeline-cloud-test02 git_hug]# git stash
Saved working directory and index state WIP on master: 0206059 Add some lyrics
HEAD is now at 0206059 Add some lyrics
[root@pipeline-cloud-test02 git_hug]# git status -s
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

补充:

储藏(Stashing): 经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。

“储藏”可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

使用储藏命令后, 它会帮你把工作环境回到 最后一次提交的状态, 也就是一个完全干净的工作环境.

git stash list # 查看暂存工作区的列表
git stash pop # 弹出这个现场

Level 14: rename

We have a file called ‘oldfile.txt’. We want to rename it to ‘newfile.txt’ and stage this change.

将这个文件改名, 并希望在暂存区也生效.

[root@pipeline-cloud-test02 git_hug]# ls
oldfile.txt
[root@pipeline-cloud-test02 git_hug]# git mv oldfile.txt newfile.txt
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

如同git rm一样, git mv也会把改动的结果记录到暂存区.

Level 15: restructure

You added some files to your repository, but now realize that your project needs to be restructured. Make a new folder named ‘src’ and using Git move all of the .html files into this folder.

你需要重构下仓库里的文件了, 新建一个src目录, 并把html文件放进去(用Git能够追踪的方式)

[root@pipeline-cloud-test02 git_hug]# mkdir src
[root@pipeline-cloud-test02 git_hug]# git mv *.html /s
sbin/ srv/  sys/
[root@pipeline-cloud-test02 git_hug]# git mv *.html ./src/
[root@pipeline-cloud-test02 git_hug]# ls src/
about.html  contact.html  index.html
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

Level 16: log

You will be asked for the hash of most recent commit. You will need to investigate the logs of the repository for this.

查下最近一次commit的哈希值

[root@pipeline-cloud-test02 git_hug]# git log --oneline
7b8d2cd THIS IS THE COMMIT YOU ARE LOOKING FOR!
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
What is the hash of the most recent commit? 7b8d2cd
Congratulations, you have solved the level!

每个git commit都会留下一条日志.

Level 17: tag

We have a git repo and we want to tag the current commit with ‘new_tag’.

给当前提交打一个新标签

[root@pipeline-cloud-test02 git_hug]# git tag new_tag
[root@pipeline-cloud-test02 git_hug]# git tag
new_tag
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!
git tag xxx # 给最近一次提交打标签
git tag xxx hashCodeXxx # 给某次提交打标签
git tag # 列出所有标签
git tag -d xxx # 删除某个标签

Level 18: push tags

There are tags in the repository that aren’t pushed into remote repository. Push them now.

推送本地仓库的标签到远程仓库

[root@pipeline-cloud-test02 git_hug]# git push --tags
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

Level 19: commit_amend

The ‘README’ file has been committed, but it looks like the file ‘forgotten_file.rb’ was missing from the commit. Add the file and amend your previous commit to include it.

README文件已经被提交, 但是另外一个文件忘记了, 添加这个文件到上一次提交中

[root@pipeline-cloud-test02 git_hug]# git status -s
?? forgotten_file.rb
[root@pipeline-cloud-test02 git_hug]# git add forgotten_file.rb
[root@pipeline-cloud-test02 git_hug]# git commit --amend -C HEAD
[master c90accd] Initial commit
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
 create mode 100644 forgotten_file.rb
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

一般是有文件漏提交了才会用--amend. 会把你漏的东西加到上一次提交里.

git commit --amend
git commit --amend -m "xxx"  # 并用新的注释覆盖上一次的
git commit --amend -C HEAD   # 还是用上一次的注释

Level 20: commit_in_future

Commit your changes with the future date (e.g. tomorrow).

提交时候改变下日期

[root@pipeline-cloud-test02 git_hug]# date
Fri Dec 22 14:07:17 CST 2017
[root@pipeline-cloud-test02 git_hug]# git commit --date="Fri Dec 22 14:07:17 CST 2018" -m "midify commit date"
[master (root-commit) 83bca42] midify commit date
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

没什么鸟用吧?

Level 21: reset

There are two files to be committed. The goal was to add each file as a separate commit, however both were added by accident. Unstage the file ‘to_commit_second.rb’ using the reset command (don’t commit anything).

有两个文件要被提交, 但是你想分别提交, 把to_commit_second.rb从暂存区中拿出来

[root@pipeline-cloud-test02 git_hug]# git reset to_commit_second.rb
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

这一关是让你从暂存区中取回文件到工作区, 目的是不想让这些文件被提交.

回忆第12关, 也是从暂存区中取. 所以你用git rm --cached to_commit_second.rb也能完成该任务.

区别在于, git rm适合于取回新增的文件, git reset适合取回修改的文件.

当然git reset还有更强的恢复功能, 后面会遇到.

Level 22: reset_soft

You committed too soon. Now you want to undo the last commit, while keeping the index.

取消最后一次提交, 并保持暂存区不变

[root@pipeline-cloud-test02 git_hug]# git log --oneline
02dd7f7 Premature commit
40820f0 Initial commit
[root@pipeline-cloud-test02 git_hug]# git reset --soft HEAD^
[root@pipeline-cloud-test02 git_hug]# git log --oneline
40820f0 Initial commit
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

git reset命令中, --soft HEAD^就表示撤销的事最近一次提交. 并且暂存区不受影响.

回忆下19关, 是将某个遗漏的文件添加到上一次提交中去. 用的是git commit --amend -C HEAD

那它就等同于先执行git reset --soft HEAD^再执行git commit的合体.

Level 23: checkout_file

A file has been modified, but you don’t want to keep the modification. Checkout the ‘config.rb’ file from the last commit.

一个文件已经被修改了, 但你并不想保留这份修改. 把文件撤销到最后一次提交的状态.

[root@pipeline-cloud-test02 git_hug]# git status -s
 M config.rb
[root@pipeline-cloud-test02 git_hug]# git checkout config.rb
[root@pipeline-cloud-test02 git_hug]# git status -s
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

Level 24: remote

This project has a remote repository. Identify it.

找到这个项目的远程仓库名

[root@pipeline-cloud-test02 git_hug]# git remote
my_remote_repo
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
What is the name of the remote repository? my_remote_repo
Congratulations, you have solved the level!

Level 25: remote_url

The remote repositories have a url associated to them. Please enter the url of remote_location.

找到这个项目的远程仓库的URL

[root@pipeline-cloud-test02 git_hug]# git remote -v
my_remote_repo  https://github.com/Gazler/githug (fetch)
my_remote_repo  https://github.com/Gazler/githug (push)
remote_location https://github.com/githug/not_a_repo (fetch)
remote_location https://github.com/githug/not_a_repo (push)
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
What is the url of the remote repository? remote_location https://github.com/githug/not_a_repo
Congratulations, you have solved the level!

Level 26: pull

You need to pull changes from your origin repository.

从远程仓库origin拉取更新

[root@pipeline-cloud-test02 git_hug]# git pull origin master
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Unpacking objects: 100% (3/3), done.
From https://github.com/pull-this/thing-to-pull
 * branch            master     -> FETCH_HEAD
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

Level 27: remote_add

Add a remote repository called ‘origin’ with the url https://github.com/githug/githug

添加一个远程仓库, 仓库名origin, 地址https://github.com/githug/githug

[root@pipeline-cloud-test02 git_hug]# git remote
[root@pipeline-cloud-test02 git_hug]# git remote -v
[root@pipeline-cloud-test02 git_hug]# git remote add origin https://github.com/githug/githug
[root@pipeline-cloud-test02 git_hug]# git remote -v
origin  https://github.com/githug/githug (fetch)
origin  https://github.com/githug/githug (push)
[root@pipeline-cloud-test02 git_hug]# git remote
origin
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
Congratulations, you have solved the level!

clone的项目git会自动保存地址, 以上这种方式适合于手工添加远程仓库

Level 28: push

Your local master branch has diverged from the remote origin/master branch. Rebase your commit onto origin/master and push it to remote.

你本地的master分支是从远程仓库(origin/master)上创建的, rebase你的提交到远程仓库(origin/master).

[root@pipeline-cloud-test02 git_hug]# git log --oneline
fd962e8 Third commit
98f106a Second commit
3186c7d First commit
[root@pipeline-cloud-test02 git_hug]# git log origin/master --oneline
6c41ca7 Fourth commit
[root@pipeline-cloud-test02 git_hug]# git rebase
First, rewinding head to replay your work on top of it...
Applying: First commit
Applying: Second commit
Applying: Third commit
[root@pipeline-cloud-test02 git_hug]# git push origin master
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 591 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To /tmp/d20171222-60085-1tu401p/.git
   6c41ca7..1154eda  master -> master
[root@pipeline-cloud-test02 git_hug]# git log origin/master --oneline
1154eda Third commit
f2580d0 Second commit
944547b First commit
6c41ca7 Fourth commit

补充:

关于推送到远程:

# 推送到远程
git push remote-name branch-name
git push -u remote-name branch-name # 推送的同时记住仓库名和分支
git push # 记住后这样推送

在多人协作的项目中, 大家都需要推送自己的更改到远程仓库.

但是推送也是有时间顺序的. 如果在你推送之前有人已经推送了, 那么你会收到"non-fast forward"的提示.

所以需要先获取远程的最新代码到本地, 有如下两种方式:

  1. git pull: 把远程仓库的最新代码合并到本地,然后再提交。这时本地的提交和远程的提交按时间顺序混合排列

  2. git rebase: 把本地仓库的更新排到远程仓库更新之后,那这时候本地仓库的所有提交都排在远程仓库的最后一次提交之后。rebase翻译过来叫变基, 后面还会有关于它的应用.

Level 29: diff

There have been modifications to the ‘app.rb’ file since your last commit. Find out whick line has changed.

最后一次提交之后你又修改了app.rb文件, 找到哪行被修改了

[root@pipeline-cloud-test02 git_hug]# git diff app.rb
diff --git a/app.rb b/app.rb
index 4f703ca..3bfa839 100644
--- a/app.rb
+++ b/app.rb
@@ -23,7 +23,7 @@ get '/yet_another' do
   erb :success
 end
 get '/another_page' do
-  @message = get_response('data.json')
+  @message = get_response('server.json')
   erb :another
 end

[root@pipeline-cloud-test02 git_hug]# vim app.rb
[root@pipeline-cloud-test02 git_hug]# githug
********************************************************************************
*                                    Githug                                    *
********************************************************************************
What is the number of the line which has changed? 26
Congratulations, you have solved the level!

补充:

git diff 是查看第二个flag(也就是Staging area和Working directory) 具体变化信息的命令

被修改后的文件是modified状态:

git diff –staged # 可以查看第一个flag(也就是Staging arae和History 之间的变化), 产生相同的效果
git diff HEAD # 可以看History 和 Working 之间的变化
git diff –stat # 后面加stat可以简化变化信息

未完待续: 通关Githug(二)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 输入 y ,创建 git_hug 目录No githug directory found, do you wish...
    风花花阅读 1,915评论 0 4
  • 因为原文太长超出字数,Lesson 3 就放在另一篇文章里 How to Use Git and GitHub 标...
    赤乐君阅读 5,173评论 1 5
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,627评论 9 163
  • GIT分布式版本控制系统最佳实践 这篇文章来自于老男孩教育高级架构师班12期的徐亮偉同学。 首先感谢老男孩架构师班...
    meng_philip123阅读 3,391评论 4 36
  • 当别人注视你的时候 你却悠然自得 毫不在意 不管别人内心对你的想法:观赏、取乐、猎物…… 当你注视别人的时候 也保...
    非也_非也阅读 268评论 0 3