目录
第5章 开始使用Git
cd xxx | 切换至哪个目录 |
mkdir xxx | 创建一个名为xxx的目录(文件夹) |
git init | 初始化当前目录,让Git对当前目录进行版控 |
git status | 查看当前状态 |
echo "hello, git" > welcome.html | 创建一个文件,并将一个内容写入文件中 |
git add welcome.html | 将这个文件加入暂存区,让Git开始追踪它 |
git add *.html | 将所有未跟踪的html文件加入暂存区 |
git add --all | 将所有文件加入暂存区 |
git add . | 与--all参数的区别:1.Git的版本;2.执行命令所在的目录 |
git commit -m "init commit" | 将暂存区的内容提交到存储库中存档 |
git commit --allow-empty -m "空的" | 这样子没有内容也可以提交 |
git commit -a -m "update content" | 没有提前add,也可以提交,只对已经存在于存储库中的文件有效,对于untracked file无效 |
touch index.html | 创建文件 |
git log | 查看历史记录(commit的记录) |
git log --oneline --graph | 输出的结果更加精简,一次性看到更多的commit |
git log --oneline --auther="Sherly" | 查找作者名为Sherly的commit |
git log --oneline --auther="Sherly\|Eddie" | 查找这两个人的commit,注意使用“\” |
git log --oneline --grep="LOL" | 在commit信息中搜索符合关键字的内容 |
git log -S "Ruby" | 在所有的commit的文件中进行搜索 |
git log --oneline --since="9am" --until="12am" --after="2017-01" | 根据时间查找commit |
rm welcome.html | 删除文件 |
git rm welcome.html | 请Git帮忙删除,这样不用再add |
git rm welcome.html --cached | 不删除文件,只是让它不再受Git控制 |
mv hello.html world.html | 直接改名 |
git mv hello.html world.html | 请Git帮忙改名 |
git commit --amend -m "xxx" | 改动最后一次commit的信息 |
git add xxx.html git commit --amend --no-edit | 把文件并入最后一次commit,其中--no-edit参数表示不要编辑commit的信息 |
touch images/.keep | .keep文件是空的,目的是为了让Git可以感应到images目录的存在(空的目录无法被提交) |
touch .gitignore | 创建并编辑文件的内容,即可忽略文件(只对规则设置后存入的文件有效) |
git add -f 文件名称 | 可以无视.gitignore中的规则 |
git clean -fx | 清除那些已经被忽略的文件(f表示强制) |
git log welcome.html | 查看单一文件的commit记录 |
git log -p welcome.html | 查看这个文件每次commit做了哪些改动 |
git blame index.html | 可以看到哪一行代码是谁在什么时候写的 |
git blame -L 5, 10 index.html | 只显示文件中指定的行 |
git checkout xxx.html | 恢复刚刚被删除但还没有被add的文件(原理是从暂存区中恢复) |
git checkout . | 恢复所有被删除的文件(还没有add) |
git checkout HEAD~2 welcome.html | 用2个版本以上的那个文件来覆盖当前工作区的这个 |
git reset e12d8ef^ | 表示拆掉e12d8ef这一个commit(前往e12d8ef的前一个commit)等价于git reset HEAD^(^表示前一个),也可以直接写git reset [SHA-1] |
git reset HEAD~2 --hard/--mixed/--soft | reset指令的三种模式 |
git reflog | 也是一个查看记录的命令 |
git branch | 查看当前所在的分支 |
git add -p index.html | Git会询问是否要把整个区域加到暂存区,y是整个加入,e是部分加入(会有编辑器) |
第6章 使用分支
git branch 分支名称 | 新增分支 |
git branch -m 旧名 新名 | 重命名分支 |
git branch -d 分支名称 | 删除分支 |
git branch -D 分支名称 | 强制删除还没有合并的分支 |
git checkout 分支名称 | 切换分支 |
git checkout -b 分支名称 | 分支存在则会切换;分支不存在Git会创建后切换 |
git merge 分支名称 | 用当前所在分支合并分支名 |
git merge 分支名称 --no-ff | 不适用快转(Fast-Forward)模式合并 |
git branch 分支名称 [SHA-1] | 创建一个分支,指向[SHA-1]这个commit |
git rebase 分支名称 | 作为新的参考基准 |
git reset ORIG_HEAD --hard | 回到“危险操作”之前HEAD的位置 |
第7章 修改历史记录
git rebase -i [SHA-1] | 可用于批量修改commit信息(-i表示进入rebase指令的互动模式;[SHA-1]表示从现在到[SHA-1]这个commit) 进入vim后:pick改为reword |
git reset ORIG_HEAD --hard | 取消这次的rebase |
git rebase -i [SHA-1] | 可用于批量合并分支 进入vim后:pick改为squash(一直会合并到最近的那个pick) |
git rebase -i [SHA-1] | 可用于将1个commit拆分成多个commit 进入vim后:pick改为edit |
git rebase --continue | 因为现在还处于rebase状态,所以要让rebase继续执行 |
git rebase -i [SHA-1] | 可用于在commit之间增加新的commit 进入vim后:pick改为edit |
git rebase -i [SHA-1] | 可用于调整commit的顺序 进入vim后直接修改顺序 |
git rebase -i [SHA-1] | 可用于删除commit 进入vim后直接删除 |
git revert HEAD --no-edit | 取消不要的(最后一个)commit,且不编辑commit信息 新做一个commit来取消不要的commit |
第8章 标签
git tag 标签名 [SHA-1] | 为[SHA-1]这个commit加上名为xxx的轻量标签;若没有给出[SHA-1],则默认加在当前所在的commit上 |
git tag 标签名 [SHA-1] -a -m "xxxxx" | -a表示创建有附注的标签 |
git show 标签名 | 查看标签所指向的那个commit的信息(有附注的标签会比轻量标签多显示信息) |
git tag -d 标签名 | 删除标签 |
第9章 其他常见的情况及一些冷知识
git add --all git commit -m "not finish yet" git reset HEAD^ | 手边的工作做到一半,要切换到别的任务(方法一) |
git stash | 手边的工作做到一半,要切换到别的任务(方法二) 先把修改都存起来 |
git stash list | 查看当前的stash列表 |
git stash pop stash名 | pop指令:把某个stash拿出来并套用在当前的分支上;套用成功后这个stash就会被删除 (没有指定stash名则默认从编号小的开始) |
git stash drop stash名 | 将stash从列表中删除 |
git stash apply stash名 | apply指令:指定stash套用,成功后stash不会被删除 |
git filter-branch --tree-filter "rm -f config/database.yml" | 不小心把账号密码放在Git中了,想把它删掉 |
git cherry-pick [SHA-1] | 将指定的commit捡过来街道当前的分支上 (类似复制过来,指定的commit还在原来的位置) |
git cherry-pick [SHA-1] [SHA-1] [SHA-1] | 一次捡多个commit |
git cherry-pick [SHA-1] --no-commit | 捡过来但是先不合并,而是先放在暂存区 |
1.git filter-branch -f --tree-filter "rm -f config/database.yml" 2.rm .git/refs/original/refs/heads/master 3.git reflog expire --all --expire=now 4.git fsck --unreachable 5.git gc --prune=now (6.git push -f)(若已经被push出去) | 1.-f表示强制覆写filter-branch的备份点 2.这个文件对刚刚做的filter-branch(备份点)念念不忘,所以要将它删除 3.reflog也念念不舍,所以也要删除(要求reflog立刻过期,默认为30天) 4.查看unreachable对象 5.启动资源回收机制 |