《Git Tutorial》读书笔记
目录
前言
虽然说以前就学过一些 git,并且也用了一阵子 GitHub 了,但是还是有很多地方模糊不清,一旦遇到问题总是有一种恐惧……因为我不知道该怎么解决它。
正好最近遇到了Git-Tutorial ,把 git 中最主要、最常用的知识重新梳理的一遍,顺便记到这里,以备不时之需。Git-Tutorial风趣幽默、生动形象,可以说是入门 git 与 github 的最佳教程,只需要 2-3 个小时学习就可以将 git 应用于实际开发中。
创建版本库
初始化一个 Git 仓库,使用=git init=命令。
添加文件到 Git 仓库,分两步:
第一步,使用命令=git add=,注意,可反复多次使用,添加多个文件;
第二步,使用命令=git commit=,完成。
时光机穿梭
要随时掌握工作区的状态,使用 git status
命令。
如果 git status
告诉你有文件被修改过,用 git diff
可以查看修改内容。
版本回退
HEAD
指向的版本就是当前版本,因此,Git 允许我们在版本的历史之间穿梭,使用命令 git reset --hard commit_id
。
穿梭前,用 git log
可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用 git reflog
查看命令历史,以便确定要回到未来的哪个版本。
工作区和暂存区
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行 git commit
就可以一次性把暂存区的所有修改提交到分支。
暂存区是 Git 非常重要的概念,弄明白了暂存区,就弄明白了 Git 的很多操作到底干了什么。
管理修改
Git 跟踪并管理的是修改,而非文件。每次修改,如果不 add 到暂存区,那就不会加入到 commit 中。
撤销修改
场景 1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file
。
场景 2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD file
,就回到了场景 1,第二步按场景 1 操作。
场景 3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
命令 git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
远程仓库
添加远程库
要关联一个远程库,使用命令 git remote add origin git@server-name:path/repo-name.git
;
关联后,使用命令 git push -u origin master
第一次推送 master 分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master
推送最新修改;
从远程库克隆
这个好像没什么好说的,git 最基础的命令 git clone
。
分支管理
创建与合并分支
查看分支: git branch
创建分支: git branch name
切换分支: git checkout name
创建+切换分支: git checkout -b name
(= git branch name
+ git checkout name
)
合并某分支到当前分支: git merge name
删除分支: git branch -d name
解决冲突
当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用 git log --graph
命令可以看到分支合并图。
分支管理策略
Git 分支十分强大,在团队开发中应该充分应用。
合并分支时,加上–no-ff 参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并。
Bug 分支
修复 bug 时,我们会通过创建新的 bug 分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场 git stash
一下,然后去修复 bug,修复后,再 git stash pop
,回到工作现场。
git stash
可以当前工作现场“储藏”起来,等以后恢复现场后继续工作。
git stash list
可以查看 stash 保存的内容。
git stash apply
可以恢复 stash 中的内容,但是不将其删除, git stash pop
则在恢复的同时把 stash 内容也删了。
多次 stash,恢复的时候,先用 git stash list 查看,然后恢复指定的 stash,用命令 git stash apply stash@{0}
Feature 分支
开发一个新 feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过 git branch -D name 强行删除。
多人协作
查看远程库信息,使用 git remote -v
;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用 git push origin branch-name
,如果推送失败,先用 git pull
抓取远程的新提交;
在本地创建和远程分支对应的分支,使用 git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用 git branch --set-upstream branch-name origin/branch-name
;
从远程抓取分支,使用 git pull
,如果有冲突,要先处理冲突。
标签管理
Git 的标签虽然是版本库的快照,但其实它就是指向某个 commit 的指针。
创建标签
命令 git tag name
用于新建一个标签,默认为 HEAD
,也可以指定一个 commit id;
-a tagname -m "blablabla..."
可以指定标签信息;
-s tagname -m "blablabla..."
可以用 PGP 签名标签;
命令 git tag
可以查看所有标签;
操作标签
命令 git push origin tagname
可以推送一个本地标签;
命令 git push origin --tags
可以推送全部未推送过的本地标签;
命令 git tag -d tagname
可以删除一个本地标签;
命令 git push origin :refs/tags/tagname
可以删除一个远程标签。
使用 GitHub
在 GitHub 上,可以任意 Fork 开源仓库;
自己拥有 Fork 后的仓库的读写权限;
可以推送 pull request 给官方仓库来贡献代码。
自定义 Git
忽略特殊文件
忽略某些文件时,需要编写.gitignore。.gitignore 文件本身要放到版本库里,并且可以对.gitignore 做版本管理!
配置别名
$ git config --global alias.st status $ git config --global alias.co checkout $ git config --global alias.ci commit $ git config --global alias.br branch $ git config --global alias.unstage 'reset HEAD' $ git config --global alias.last 'log -1' $ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
参考文章
Git-Tutorial 全文:http://lvwzhen.gitbooks.io/git-tutorial/