输入 y ,创建 git_hug
目录
No githug directory found, do you wish to create one? [yn] y
Welcome to Githug!
level 1
question
Name: init
Level: 1
Difficulty: *
A new directory, git_hug
, has been created; initialize an empty repository in
it.
answer
$ cd git_hug
$ git init
相关
cd
(Change Directory),跳转目录、切换路径。
git init
在当前目录新建一个Git代码库
level 2
question
Name: config
Level: 2
Difficulty: *
Set up your git name and email, this is important so that your commits can be id
entified.
answer
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
相关
git config
git 的设置文件为.gitconfig
,他可以在全局配置(加上--global),也可以项目配置。
另:
git config --list
显示当前的git配置
git config -e [--global]
编辑git的配置文件
level 3
question
Level: 3
Difficulty: *
There is a file in your folder called README
, you should add it to your staging area
Note: You start each level with a new repo. Don't look for files from the previous one.
answer
$ git add .\README
相关
git add
将所有修改过的工作文件提交暂存区
将所有文件添加到暂存区git add .
或者git add -A
-
git add .
会监控工作区的状态树,使它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。 -
git add -u
(git add --update
的缩写)仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u
不会提交新文件(untracked file)。 -
git add -A
(git add --all
的缩写)是上面两个功能的合集。即包括修改的文件、删除的文件以及新文件。
level 4
question
Name: commit
Level: 4
Difficulty: *
The README
file has been added to your staging area, now commit it.
answer
$ git commit -m 'message'
相关
-
git commit -a
提交工作区自上次commit之后的变化,直接到仓库区 -
git commit -v
提交时显示所有diff信息,-v参数表示可以看commit的差异 -
git commit --amend -m [message]
使用一次新的commit,替代上一次提交。如果代码没有任何新变化,则用来改写上一次commit的提交信息 -
git commit --amend [file1] [file2] ...
重做上一次commit,并包括指定文件的新变化
level 5
question
Name: clone
Level: 5
Difficulty: *
answer
$ git clone
相关
git clone
支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。
$ git clone
$ git clone
$ git clone
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone
$ git clone
SSH协议的另一种写法
$ git clone
level 6
question
Name: clone_to_folder
Level: 6
Difficulty: *
answer
$ git clone my_cloned_repo
相关
git clone <版本库的网址> <本地目录名>
该命令会在本地主机生成一个目录。如果不指定目录名,则与远程主机的版本库同名。
level 7
question
Name: ignore
Level: 7
Difficulty: **
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 those swap files which are ending in .swp
.
answer
$ touch .gitignore
$ echo '*.swp'>>.gitignore
相关
- 忽略掉某个文件,需要修改
.gitignore
文件的方法。可以在你的用户目录下创建~/.gitignoreglobal
文件中设置全局。
需要执行git config --global core.excludesfile ~/.gitignoreglobal
来使得它生效。-
*.a
忽略所有 .a 结尾的文件 -
!lib.a
但 lib.a 除外 -
/TODO
仅仅忽略项目根目录下的 TODO 文件,但不包括 subdir/TODO -
build/
忽略 build/ 目录下的所有文件 -
doo/*.txt
会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
-
-
.gitignore
只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore
是无效的。
正确的做法是在每个clone下来的仓库中手动设置不要检查特定文件的更改情况。
-
git update-index --assume-unchanged PATH
在PATH处输入要忽略的文件。 -
git update-index --no-assume-unchanged PATH
还原。
- 另外 git 还提供了另一种
exclude
的方式来做同样的事情,不同的是.gitignore
这个文件本身会提交到版本库中去,用来保存的是公共的需要排除的文件。
而.git/info/exclude
这里设置的则是你自己本地需要排除的文件。他不会影响到其他人。也不会提交到版本库中去。
level 8
question
Name: include
Level: 8
Difficulty: **
Notice a few files with the '.a' extension. We want git to ignore all but the 'lib.a' file.
answer
$ echo '*.a'>>.gitignore
$ echo '!lib.a'>>.gitignore
相关
见上
level 9
question
Name: status
Level: 9
Difficulty: *
There are some files in this repository, one of the files is untracked, which file is it?
answer
$ git status
答案为:database.yml
相关
git status
显示有变更的文件
level 10
question
Name: number_of_files_committed
Level: 10
Difficulty: *
There are some files in this repository, how many of the files will be committed?
answer
答案:2
相关
git status
命令可以列出当前目录所有还没有被git管理的文件和被git管理且被修改但还未提交(git commit)的文件。
- 命令中”Changes to be committed“中所列的内容是在Index中的内容,commit之后进入Git Directory。
- 命令中“Changed but not updated”中所列的内容是在Working Directory中的内容,add之后将进入Index。
- 命令中“Untracked files”中所列的内容是尚未被Git跟踪的内容,add之后进入Index
level 11
question
Name: rm
Level: 11
Difficulty: **
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.
answer
$ git status
$ git rm deleteme.rb
相关
level 12
question
Name: rm_cached
Level: 12
Difficulty: **
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.
answer
$ git status
$ git rm --cached deleteme.rb
相关
git rm --cached [file]
停止追踪指定文件,但该文件会保留在工作区。
level 13
question
Name: stash
Level: 13
Difficulty: **
You've made some changes and want to work on them later. You should save them, but don't commit them.
answer
$ git stash
相关
git stash
用于保存和恢复工作进度。
-
git stash
保存当前的工作进度。会分别对暂存区和工作区的状态进行保存。 -
git stash list
显示进度列表。 -
git stash pop [--index] [<stash>]
如果不使用任何参数,会恢复最新保存的工作进度,并将恢复的工作进度从存储的工作进度列表中清除。
如果提供<stash>参数(来自git stash list显示的列表),则从该<stash>中恢复。恢复完毕 也将从进度列表中删除<stash>。选项--index除了恢复工作区的文件外,还尝试恢复暂存区。 -
git stash [save [--patch] [-k|--[no]keep-index] [-q|--quiet] [<message>]]
这是第一条命令的完整版。- 使用参数
--patch
会显示工作区和HEAD的差异,通过对差异文件的编辑决定在进度中最终要保存的工作区的内容,通过编辑差异文件可以在进度中排除无关内容。 - 使用
-k
或者--keep-index
参数,在保存进度后不会将暂存区重置。默认会将暂存区和工作区强制重置。
- 使用参数
-
git stash apply [--index] [<stash>]
除了不删除恢复的进度之外,其余和git stash pop 命令一样。 -
git stash drop [<stash>]
删除一个存储的进度。默认删除最新的进度。 -
git stash clear
删除所有存储的进度。 -
git stash branch <branchname> <stash>
基于进度创建分支。
level 14
question
Name: rename
Level: 14
Difficulty: ***
We have a file called oldfile.txt
. We want to rename it to newfile.txt
and stage this change.
answer
$ git mv oldfile.txt newfile.txt
相关
git mv
重命名文件
level 15
question
Name: restructure
Level: 15
Difficulty: ***
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.
answer
$ mkdir src
$ git mv *.html src/
相关
mkdir
(make directory) Mkdir 是一个用来在 Linux 系统下创建目录的命令。此命令属于内建命令。
-
mkdir test1
默认情况下不带任何参数运行mkdir命令会在当前目录下创建目录。 -
mkdir test2[ test22 test222]
创建多个目录。 -
mkdir -p test3/test33
递归创建多个目录。例如创建的目录包含子目录,如果找不到父目录,那么这个参数会首先帮助创建父目录。 -
mkdir -m=r test4
使用-m参数,给生成的新目录设置权限。参考: -
mkdir -v test5
创建目录显示信息。
level 16
question
Name: log
Level: 16
Difficulty: **
You will be asked for the hash of most recent commit. You will need to investigate the logs of the repository for this.
answer
$ git log
答案为:34b2fd7(commit后 前7位)
相关
git log
显示当前分支的版本历史。
-
git log --stat
显示commit历史,以及每次commit发生变更的文件 -
git log -s [keyword]
搜索提交历史,根据关键词 -
git log -p [file]
显示指定文件相关的每一次diff -
git log -5 --pretty --oneline
显示过去5次提交 -
git log --follow [file]
git whatchanged [file]
显示某个文件的版本历史,包括文件改名 -
git log [tag] HEAD --pretty-format:%s
显示某个commit之后的所有变动,每个commit占据一行 -
git log [tag] HEAD --grep feature
显示某个commit之后的所有变动,其“提交说明”必须符合搜索条件
level 17
question
Name: tag
Level: 17
Difficulty: **
We have a git repo and we want to tag the current commit with new_tag
.
answer
$ git tag new_tag
相关
-
git tag
列出所有的tag,在控制台打印出当前仓库的所有标签 -
git tag [tag]
新建一个tag在当前commit -
git tag [tag] [commit]
新建一个tag在指定commit -
git tag d [tag]
删除本地tag
level 18
question
Name: push_tags
Level: 18
Difficulty: **
There are tags in the repository that aren't pushed into remote repository. Push them now.
answer
$ git push --tags
相关
默认 git push 不会罢 tag 标签传送到远端服务器上,只有通过显示命令才能分享标签到远端仓库。
-
git push origin [tagname]
push 单个 tag -
git push [origin] --tags
push 所有 tag
level 19
question
Name: commit_amend
Level: 19
Difficulty: **
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.
answer
$ git add forgotten_file.rb
$ git commit --amend -m 'message'
相关
level 20
question
Name: commit_in_future
Level: 20
Difficulty: **
Commit your changes with the future date (e.g. tomorrow).
answer
$ git commit --date 2016.10.08 -m 'message'
相关
git commit --date <date>
修改提交时间
level 21
question
Name: reset
Level: 21
Difficulty: **
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).
answer
$ git status
$ git reset HEAD to_commit_second.rb
相关
reset 命令移动 HEAD 到当前分支的一个 commit, 这可以用来撤销当前分支的一些 commit
-
git reset [-q] [commit] [--] <paths>
第一种用法是不会重置引用的,即不会修改master文件。 -
git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
第二种用法不使用< paths > 则会重置引用,并且参数不同决定是否覆盖暂存区和工作区:
-
git reset -mixed
此为默认方式,不带任何参数的git reset,会退到某个版本只保留源码,回退commit和index信息,staged snapshot 被更新, working directory 未被更改。 -
git reset -soft
回退到某个版本,只回退了commit信息,staged snapshot 和 working directory 都未被改变 (建议在命令行执行后,再输入 git status 查看状态) -
git reset -hard
彻底回退到某个版本,本地的源码也会变为上一个版本的内容,即staged snapshot 和 working directory 都将回退
例子:
#回退所有内容到上一版本 HEAD^的意思是最近一次的提交
git reset HEAD^
#回退a.py这个文件的版本到上一个版本
git reset HEAD^ a.py
#向前回退到第3个版本
git reset –soft HEAD~3
#将本地的状态回退到和远程的一样
git reset –hard origin/master
#回退到某个版本
git reset 38679ed
#回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit
git revert HEAD
level 22
question
Name: reset_soft
Level: 22
Difficulty: **
You committed too soon. Now you want to undo the last commit, while keeping the index.
answer
$ git reset --soft HEAD^
相关
见上
level 23
question
Name: checkout_file
Level: 23
Difficulty: ***
A file has been modified, but you don't want to keep the modification. Checkout the config.rb
file from the last commit.
answer
$ git checkout config.rb
相关
git checkout
检出。
- 创建分支
git branch branchName
- 切换分支
git checkout branchName
- 上面两个命令可以合成一个命令
git checkout -b branchName
level 24
question
Name: remote
Level: 24
Difficulty: **
This project has a remote repository. Identify it.
answer
$ git remote -v
答案:my_remote_repo
相关
-
git remote
不带参数,列出已经存在的远程分支 -
git remote -v
--verbose 列出详细信息,在每个名字后面 -
git clone -o jQuery
git remote
想用其他的主机名 需要用 git clone命令的 -o 选项指定 -
git remote show <主机名>
可以查看主机的详细信息 -
git remote add <主机名> <网址>
添加远程主机 -
git remote rm <主机名>
删除远程主机 -
git remore rename <原主机名> <新主机名>
远程主机的改名
$ tail .git/config
查看remote信息。
level 25
question
Name: remote_url
Level: 25
Difficulty: **
The remote repositories have a url associated to them. Please enter the url of remote_location.
answer
$ git remote -v
相关
见上
level 26
question
Name: pull
Level: 26
Difficulty: **
You need to pull changes from your origin repository.
answer
$ git pull origin master
相关
level 27
question
Name: remote_add
Level: 27
Difficulty: **
answer
$ git remote add origin
相关
见 level 24
level 28
question
Name: push
Level: 28
Difficulty: ***
Your local master branch has diverged from the remote origin/master branch. Rebase your commit onto origin/master and push it to remote.
answer
$ git rebase origin/master
$ git push origin master
相关
git rebase用于把一个分支的修改合并到当前分支。
level 29
question
Name: diff
Level: 29
Difficulty: **
There have been modifications to the app.rb
file since your last commit. Find out which line has changed.
answer
$ git diff app.rb
答案:26
相关
git diff app.rb
查看文件改动
level 30
question
Name: blame
Level: 30
Difficulty: **
Someone has put a password inside the file config.rb
find out who it was.
answer
$ git blame config.rb
答案:Spider Man
相关
git blame
得到整个文件的每一行的详细修改信息:包括SHA串,日期和作者。
level 31
question
Name: branch
Level: 31
Difficulty: *
You want to work on a piece of code that has the potential to break things, create the branch test_code.
answer
$ git branch test_code
相关
见上
level 32
question
Name: checkout
Level: 32
Difficulty: **
Create and switch to a new branch called my_branch. You will need to create a branch like you did in the previous level.
answer
$ git checkout -b my_branch
相关
见上
level 33
question
Name: checkout_tag
Level: 33
Difficulty: **
You need to fix a bug in the version 1.2 of your app. Checkout the tag v1.2
.
answer
$ git checkout v1.2
相关
标签可以针对某一时间点的版本做标记,常用于版本发布。
- 列出标签
-
Git tag
在控制台打印出当前仓库的所有标签 -
git tag -l 'v0.1.*'
搜索符合模式的标签
-
- 打标签 git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,标注标签则是仓库中的一个独立对象。建议使用附注标签。
-
git tag v0.1.2-light
创建轻量标签 -
git tag -a v0.1.2 -m "0.1.2版本"
创建附注标签 -
git tag -a v0.1.1 9fbc3d0
给指定的commit打标签
-
- 切换到标签
-
git checkout [tagname]
查看标签信息 -
git show v0.1.2
查看标签的版本信息
-
- 删除标签
-
git tag -d v0.1.2
删除标签
-
- 标签发布 git push 不会将标签对象提交到git服务器,我们需要进行显示的操作:
-
git push origin v0.1.2
将标签提交到git服务器 -
git push origin -tags
将本地所有标签一次性提交到git服务器
-
level 34
question
Name: checkout_tag_over_branch
Level: 34
Difficulty: **
You need to fix a bug in the version 1.2 of your app. Checkout the tag v1.2
(Note: There is also a branch named v1.2
).
answer
$ git checkout tags/v1.2
相关
git checkout tags/v1.2
当标签和分支名相同时,需要指定标签检出
level 35
question
Name: branch_at
Level: 35
Difficulty: ***
You forgot to branch at the previous commit and made a commit on top of it. Create branch test_branch at the commit before the last.
answer
一种方法:
$ git branch test_branch HEAD^1
第二种方法:
$ git log
$ git branch test_branch -v 00740b4
找到第二条的id,输入前7位
相关
见上
level 36
question
Name: delete_branch
Level: 36
Difficulty: **
You have created too many branches for your project. There is an old branch in your repo called 'delete_me', you should delete it.
answer
$ git branch -d delete_me
相关
见上
level 37
question
Name: push_branch
Level: 37
Difficulty: **
You've made some changes to a local branch and want to share it, but aren't yet ready to merge it with the 'master' branch. Push only 'test_branch' to the remote repository
answer
$ git push origin test_branch
相关
-
git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。 -
git push origin :master
省略本地的分支名,则表示删除指定的远程分支,因为这等同与推送一个空的本地分支到远程分支。等同于:git push origin --delete master -
git push origin
如果当前分支与远程分支直接存在追踪关系,则本地分支和远程分支都可以省略 -
git push
如果当前分支只有一个追踪分支,那么主机名都可以省略 -
git push -u origin master
如果当前分支和多个主机存在追踪关系,则可以使用 -u 选项指定一个默认主机,这样后面就可以不加任何参数使用 git push -
git push --all origin
不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机。 -
git push origin --tags
git push 不会推送标签(tag),除非使用 -tags 选项
level 38
question
Name: merge
Level: 38
Difficulty: **
We have a file in the branch 'feature'; Let's merge it to the master branch.
answer
$ git merge feature
相关
git merge
合并分支
level 39
question
Name: fetch
Level: 39
Difficulty: **
Looks like a new branch was pushed into our remote repository. Get the changes without merging them with the local repository
answer
$ git fetch origin
相关
git fetch origin master
取回origin主机的master分支
level 40
question
Name: rebase
Level: 40
Difficulty: **
We are using a git rebase workflow and the feature branch is ready to go into master. Let's rebase the feature branch onto our master branch.
answer
$ git checkout feature
$ git rebase master
相关
git rebase
命令主要用在从上游分支获取commit信息,并有机的将当前分支和上游分支进行合并
git rebase [-i | --interactive] [options] [--onto ] []
git rebase [-i | --interactive] [options] –onto –root []
git rebase –continue | –skip | –abort
level 41
question
Name: rebase_onto
Level: 41
Difficulty: **
You have created your branch from wrong_branch
and already made some commits, and you realise that you needed to create your branch from master
. Rebase your commits onto master
branch so that you don't have wrong_branch
commits.
answer
$ git rebase --onto master wrong_branch
相关
level 42
question
Name: repack
Level: 42
Difficulty: **
Optimise how your repository is packaged ensuring that redundant packs are removed.
answer
$ git repack -d
相关
git repack [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [--window=<n>] [--depth=<n>]
git repack -d
包装后,如果新创建的包使一些现有的包冗余,删除多余的包。同时运行 git prune-packed 去除多余的松散对象文件。
level 43
question
Name: cherry-pick
Level: 43
Difficulty: ***
Your new feature isn't worth the time and you're going to delete it. But it has one commit that fills in README
file, and you want this commit to be on the master as well.
answer
$ git branch
$ git log new-feature
$ git cherry-pick ca32a6da
先查看分支列表,得到分支名,查看分支提交记录,最后合并。
相关
Git cherry-pick
可以选择某一个分支中的一个或几个commit来进行操作
level 44
question
Name: grep
Level: 44
Difficulty: **
Your project's deadline approaches, you should evaluate how many TODOs are left in your code
answer
$ git grep TODO
可以看到有四条
相关
git grep
查找git库里面的某段文字
-
git grep xmmap
查看git里面这个仓库里每个使用 ‘xmmap’ 函数的地方。 -
git grep -n xmmap
显示行号。 -
git grep --name-only xmmap
只显示文件名。 -
git grep -c xmmap
查看每个文件里有多少行匹配内容(line matches)。 -
git grep xmmap v1.5.0
查找git仓库里某个特定版本里的内容,在命令行末尾加上表签名(tag reference)。 -
git grep -e '#define' --and -e SORT_DIRENT
组合搜索条件:查找在仓库的哪些地方定义了‘SORT_DIRENT’。 -
git grep --all-match -e '#define' -e SORT_DIRENT
进行或条件搜索。
level 45
question
Name: rename_commit
Level: 45
Difficulty: ***
Correct the typo in the message of your first (non-root) commit.
answer
$ git log master
$ git rebase -i HEAD~2
查看历史提交记录,看到需要修改的为倒数第二个,进入编辑页面,将需要改动的行的pick改为reword。保存退出后在弹出的第二个窗口里修改拼写错误 commmit 改为 commit
相关
见上
level 46
question
Name: squash
Level: 46
Difficulty: ****
You have committed several times but would like all those changes to be one commit.
answer
$ git rebase -i HEAD~4
将后三个改为s
相关
见上
level 47
question
Name: merge_squash
Level: 47
Difficulty: ***
Merge all commits from the long-feature-branch as a single commit.
answer
$ git merge --squash long-feature-branch
$ git commit -m 'message'
相关
--squash
选项的含义是:本地文件内容与不使用该选项的合并结果相同,但是不提交、不移动 HEAD ,因此需要一条额外的commit命令。其效果相当于将 another 分支上的多个 commit 合并成一个,放在当前分支上,原来的 commit 历史则没有拿过来。
level 48
question
Name: reorder
Level: 48
Difficulty: ****
You have committed several times but in the wrong order. Please reorder your commits.
answer
$ git log
$ git rebase -i HEAD~2
查看历史记录发现提交顺序错误,将前两行顺序调换。
相关
见上
level 49
question
Name: bisect
Level: 49
Difficulty: ***
A bug was introduced somewhere along the way. You know that running ruby prog.rb 5
should output 15. You can also run make test
. What are the first 7 chars of the hash of the commit that introduced the bug.
answer
$ git log --reverse -p prog.rb
$ git bisect start master f6088248
$ git bisect run make test
查看最初一次为正确提交,得到版本号。执行完毕后日志里找到 “is the first bad commit” ,得到 18ed2ac。
(标记):出错了 得到的结果不为这个。。。
相关
git bisect start
git bisect good fb088248
git bisect bad master
git bisect run make test
-
git bisect reset
回到之前执行 git bisect start 的状态。
level 50
question
Name: stage_lines
Level: 50
Difficulty: ****
You've made changes within a single file that belong to two different features, but neither of the changes are yet staged. Stage only the changes belonging to the first feature.
answer
$ git add -p feature.rb
输入e编辑提交内容,删除第二个。
相关
见上
level 51
question
Name: find_old_branch
Level: 51
Difficulty: ****
You have been working on a branch but got distracted by a major issue and forgot the name of it. Switch back to that branch.
answer
$ git reflog
$ git checkout solve_world_hunger
查找到另一个分支,切换到另一个分支。
相关
reflog 是 git 用来记录引用变化的一种机制。
git reflog
命令可以对 git 误操作进行数据恢复。
level 52
question
Name: revert
Level: 52
Difficulty: ****
You have committed several times but want to undo the middle commit.
All commits have been pushed, so you can't change existing history.
answer
$ git log
$ git revert HEAD^1
相关
修复提交文件中的错误:
-
git reset --hard HEAD
把工作目录中所有未提交的内容清空。 -
git checkout
恢复一个文件 -
git revert HEAD
撤销一次提交
level 53
question
Name: restore
Level: 53
Difficulty: ****
You decided to delete your latest commit by running git reset --hard HEAD^
. (Not a smart thing to do.) You then change your mind, and want that commit back. Restore the deleted commit.
answer
$ git reflog
$ git checkout bdbe33d
查看日志,回覆至对应的版本
相关
恢复已修改的文件:
level 54
question
Name: conflict
Level: 54
Difficulty: ****
You need to merge mybranch into the current branch (master). But there may be some incorrect changes in mybranch which may cause conflicts. Solve any merge-conflicts you come across and finish the merge.
answer
$ git merge mybranch
$ vim poem.txt
$ git add poem.txt
$ git commit -m 'message'
相关
处理冲突
level 55
question
Name: submodule
Level: 55
Difficulty: **
answer
$ git submodule add
相关
level 56
level56最后
好多还是半懂不懂的状态%>_<%... 嘛 有错请指正:-D