- 初始化一个本地仓库:
git init
复制代码
- 创建一个git账号:
git config --local user.name xxx
git config --local user.email xxx
复制代码
- 添加本地文件到暂存区:
git add README
复制代码
- 提交文件:
git commit
复制代码
- 克隆一个远程仓库:
git clone https://github.com/Gazler/cloneme
复制代码
- 克隆一个远程仓库到本地某一个文件夹中:
git clone https://github.com/Gazler/cloneme xxx
复制代码
- 文本编辑器vim会给最近打开的所有文档都创建的一个以.swp结尾的文件,不要让这件文件进入仓库,忽略他们:
vi .gitignore
a
*.swp
esc
:wq
复制代码
- 注意一下以a为扩展名的文件,忽略提交这些文件,只提交lib.a这个文件:
open .gitignore
*.a
!lib.a
复制代码
- 仓库里的文件哪一个没有被追踪:
git status
复制代码
- 有多少个文件将要被提交:
git status
复制代码
- 有一个文件在本地工作区被移除了,但是远端仓库还有,找到这个文件并把他移除:
git status
git rm xxx
复制代码
- 一个文件被意外地添加到了缓存区,请找到这个文件,并把他从缓存区移除,记住:不要从文件系统移除文件,只从git中移除:
git status
git rm xxx --cached
复制代码
- 你已经做了一些修改,而且想过会继续修改,你应该先保存但是不要提交:
git stash
复制代码
- 有一个叫oldfile.txt的文件,我们想给他重命名为newfile.txt,并
git mv xxx.txt xxx.txt
复制代码
- 你向仓库中添加了一些文件,但是你发现你的项目需要整理文件结构,新建一个src文件夹,并把所有的.html文件移进去:
mkdir src
git mv *.html src
复制代码
- 你需要所有最近提交的commit的hash,需要审查这个仓库的日志:
git log
复制代码
- 你有一个git仓库,并且想给最近的这次提交一个new_tag的标签:
git tag xxx
复制代码
- 你的仓库有一些标签没有推送到远程仓库中,现在推送:
git push origin xxx:xxx
复制代码
- README文件已经被保存到暂存区,但是好像忘了保存forgotten_file.rb了,添加这个文件并且让之前的commit包括这个文件:
git add xxx
git commit --amend
复制代码
- 以后再提交到暂存区:
git commit --date 2018-09-14 -m xxx
复制代码
- 有两个文件需要commit,应该是每个文件单独commit,但是不小心把两个都添加了,请使用reset命令把to_commit_second.rd恢复到未添加状态:
git reset xxx
复制代码
- 你commit的太快了,现在你想保存index的同时撤销commit:
git reset --soft HEAD^
复制代码
- 有一个文件被修改了,但是你不想让他被修改,从行一次的commit中把它捡出来:
git checkout xxx
复制代码
- 这个项目有一个远程仓库,指出他:
git remote
复制代码
- 远程仓库都有一个URL关联,请输入remote_location这个远程仓库的链接:
git remote
git remote get-url xxx
复制代码
- 从远程仓库拉取改变:
git pull <remote> <branch>
复制代码
- 用https://github.com/github/githug添加一个名叫origin的远程仓库:
git remote add xxx https://github.com/github/githug
复制代码
- 你的本地master分支是从远程master分支拉取的,把你的更新推到远程,注意本关的场景是本地仓库有3次更新(分别名为 First commit, Second commit, Third commit),远程仓库有1次更新(名为 Fourth commit):
git rebase
git push <remote> <branch>
复制代码
-
多人开发时,推送是有先有后的,按照 Git 的规则,在你推送时如果已经有人比你早推送了,你若再推送就会收到一个 "non-fast forward" 的提示,直译就是“不能快进”。那么此时你至少有2种办法来解决:
-
方法一,先用 git pull 命令把远程仓库的最新代码合并到本地,然后再提交。这时本地的提交和远程的提交按时间顺序混合排列。
-
方法二,用 git rebase 命令把本地仓库的更新排到远程仓库更新之后,那这时候本地仓库的所有提交都排在远程仓库的最后一次提交之后。
-
- 上次你提交的更新中有app.rb的几处更新,找到哪行被改变了:
git diff xxx
复制代码
-
@@ -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 复制代码
- 差异按照差异小结进行组织,每个差异小结的第一行都是定位语句,由@@开头,@@结尾。-23,7 +23,7指的是在源文件第23行开始的7行,和目标文件第23行开始的7行不同。
- 空格开头的行,是源文件和目标文件中都出现的行
- -开头的行,是只出现在源文件中的行
- +开头的行,是只出现在目标文件中的行
- 有人在config.rb里放了一个密码,找出这个人是谁:
git blame config.rb
复制代码
- 你想写一段有可能会出问题的代码,创建一个test_code分支:
git branch test_code
复制代码
- 创建并切换到一个名叫my_branch的新分支,你需要像之前的关卡一样创建一个分支:
git branch xxx
git checkout xxx
复制代码
- 你需要修复一个app v1.2的一个bug,检出标签v1.2:
git tag
git checkout v1.2
复制代码
- 你需要修复一个app v1.2的一个bug,检出标签v1.2,注意还有一个名叫v1.2的一个分支:
git checkout tags/v1.2
复制代码
- 你忘了在上次提交之前先拉一个新分支了,请在上次提交之前先拉一个名叫test_branch的新分支:
git log
git branch <new branch> <hash code>
复制代码
- 你在你的项目里创建了太多的分支,仓库里有一个名叫delete_me的老分支,删了它:
git branch -a
git branch -d delete_me
复制代码
- 你在本地做了一些修改,想要分享这些修改,但是还没准备合到master分支,请推送test_branch分支到远程仓库:
git remote
git branch -a
git checkout <branch>
git status
git push <remote> <branch>
复制代码
- 你在名叫feature的分支上有一个文件,请把他合到mater分支:
git merge feature
复制代码
- 好像有一个新分支被推送到了远程仓库,不用合到本地仓库就获取这些更新:
git remote
git fetch xxx
复制代码
- 我们使用了rebase workflow,feature分支现在需要合并到master,请把feature分支rebase到master分支:
git rebase master feature
复制代码
- git rebase 和 git merge 都是用来合并,各有优缺点,所以有些团队会约定合并时只能用 git merge 或只能用 git rebase,如果约定只能用 git rebase 来合并,这种工作方式就被称为 'git rebase 工作流'。在用 git rebase 合并分支时,合并后的日志并非按各分支的提交时间排列,而是把一个分支的日志全部排列在另一个分支的日志之上,即使它们是并行开发的,在开发过程中交错提交,但看起来也好像是按先后顺序开发的一样。
- 你已经从wrong_branch创建了一个分支,而且已经提交了一些更新,但是你意识到你应该从master拉去你的分支,rebase你的更新到master分支,去掉在wrong_branch分支的更新:
git rebase --onto master wrong_branch
复制代码
- 你的仓库如何打包来确保冗余的包被移除:
git repack
git repack -d
复制代码
- 在第1关里我们提到,当 Git 项目初始化时,会创建一个隐藏的名为 .git 的子目录,用于存放 Git 管理仓库要用到的文件。在 Git 的世界里,一个文件是一个 Git 对象,一次提交也是一个 Git 对象,它们被存储在 .git/objects/ 目录下:
其中前3个目录的目录名长为2个数字字母,分别各存放1个对象。在 Git 的操作越多,产生的对象就越多,为了优化仓库的效率,你可以手工把对象打包:$ ls .git/objects/ 4d a0 e6 info pack 复制代码
第1条命令是把对象打包到一起,第2条命令是在打包后删除已作废的对象。执行完打包命令之后,.git/objects/pack/ 目录下会生成2个文件:$ git repack $ git repack -d 复制代码
.pack 是包文件,.idx 是包的索引文件。$ ls .git/objects/pack/ pack-b7b37f445a40715c249bf8c0df9631e9fd6c8f4b.idx pack-b7b37f445a40715c249bf8c0df9631e9fd6c8f4b.pack 复制代码
- 你到项目快到期了,你要评估一下你的代码里还有多少TODOs需要完成:
git grep 'TODO'
复制代码
- 更正你第一次commit的拼写错误:
git log
git rebase -i <commit hash code> #要修改的前一次commit hash code
复制代码
-
在使用 Git 的过程中,难免会出现要改写提交内容的情况,Git 提供了非常强大的修改历史的工具,我们就以本关为例,详细说明如何修改历史,并在接下来的第45关和第47关再做另外2个练习。
先看一下提交日志:
$ git log --pretty=oneline 771b71dca888e80d2bf716672b1475e85a27d695 Second commit 06973a37415e520eff0bace38181f131698cd888 First coommit 37d84aed48418346c4567bb863a0eba4617ba5b1 Initial commit 复制代码
一共有过3次提交,注意其中哈希值为 "06973a37415e520eff" 的这次提交,提交说明 "First coommit" 中的第2个单词拼错了。
修改提交历史的命令格式是:
$ git rebase -i hash-code 复制代码
我们已经在第40关接触过 git rebase 命令,当时是用它来合并分支。但是加了 -i 参数之后,用途就变为修改提交历史了。其后再跟一个某一条提交日志的哈希值,表示要修改这条日志之前的提交历史。
现在,找到 "First coommit" 下面一条日志的哈希值"37d84aed48418346c4",然后输入下面的命令:
$ git rebase -i 37d84aed48418346c4 复制代码
这时,会启动文本编辑器,显示如下内容:
pick 06973a3 First coommit pick 771b71d Second commit 复制代码
这2行是历史日志,但和 git log 的区别在于 git log 是按更新时间从后到前显示日志,而这里是按从前到后显示。每一行的前面有一个命令词,表示对此次更新执行什么操作,有以下几种命令:
"pick",表示执行此次提交; "reword",表示执行此次提交,但要修改备注内容; "edit",表示可以修改此次提交,比如再追加文件或修改文件; "squash",表示把此次提交的内容合并到上次提交中,备注内容也合并到上次提交中; "fixup",和 "squash" 类似,但会丢弃掉此次备注内容; "exec",执行命令行下的命令; "drop",删除此次提交。 复制代码
本关就使用 "reword" 命令来完成任务。把第1行前面的 "pick" 改为 "reword"(注意,不用改哈希值后面的备注内容),如下:
reword 06973a3 First coommit pick 771b71d Second commit 复制代码
接下来保存并退出,马上系统会再次打开编辑器,显示以下内容:
First coommit # Please enter the commit message for your changes. 复制代码
这时,你把 "coommit" 改为 "commit",保存并退出,再查看日志,就会发现历史日志的备注内容已经改变了。
- 你已经提交了几次更新,但是想这些更新都合成一个更新:
复制代码
复制代码
复制代码
复制代码
未完待续