目录
Git教程
自学内容来自廖雪峰git教程
安装Git
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
创建版本库
- 初始化一个Git仓库,使用
git init
命令。 - 添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
- 使用命令
时光机穿梭
- 要随时掌握工作区的状态,使用
git status
命令。 - 如果
git status
告诉你有文件被修改过,用git diff
可以查看修改内容。
版本回退
- HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id
。(例如git reset --hard HEAD^
) - 穿梭前,用
git log [—pretty=oneline]
可以查看提交历史,以便确定要回退到哪个版本。(上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。) - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
撤销修改
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。 - 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。 - 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
- 命令
git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
远程仓库
- 创建SSH Key:
$ ssh-keygen -t ecdsa[rsa] -C "youremail@example.com"
- 在.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
添加远程库
- 要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git
;(如果添加错误,使用git remote rm origin
删除) - 关联后,使用命令
git push -u origin master
第一次推送master分支的所有内容; - 此后,每次本地提交后,只要有必要,就可以使用命令
git push origin master
推送最新修改;
从远程库克隆
-
用命令git clone克隆一个本地库:
git clone git@github.com:michaelliao/gitskills.git
-
GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
分支管理
创建与合并分支
- 查看分支:
git branch
- 创建分支:
git branch <branch_name>
- 切换分支:
git checkout <branch_name>
- 创建+切换分支:
git checkout -b <branch_name>
- 合并某分支到当前分支:
git merge <branch_name>
- 删除分支:
git branch -d <branch_name>
- 补充:
master
为本地分支,origin/master
为远程分支(which is a local copy of the branch named “master” on the remote named “origin”)
解决冲突
- 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
- 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
- 用
git log --graph
命令可以看到分支合并图。
分支管理策略
- 合并分支时,加上
--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。 git merge --no-ff -m "merge with no-ff" <dev_branch>
合并dev分支,请注意--no-ff
参数,表示禁用Fast forward模式。因为本次合并要创建一个新的commit,所以加上-m
参数,把commit描述写进去。
Bug分支
- 修复bug时,我们会
- 通过创建新的bug分支进行修复
- 然后合并
- 最后删除
- 当手头工作没有完成时,先把工作现场
git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
Feature分支
- 开发一个新feature,最好新建一个分支;
- 如果要丢弃一个没有被合并过的分支,可以通过
git branch -D <branch_name>
强行删除。
多人协作
- 多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch_name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch_name>
推送就能成功!
- 首先,可以试图用
- 如果
git pull
提示no tracking information,则说明本地分支和远程分支的连接关系没有创建,用命令git branch --set-upstream-to <origin/branch_name> <branch_name>
。这就是多人协作的工作模式,一旦熟悉了,就非常简单。 - 小结
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin <branch_name>
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b <branch_name> <origin/branch_name>
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream-to origin/branch-name branch-name
; - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
- 查看远程库信息,使用
- 补充:
git checkout -b dev
//基于本地创建分支git checkout -b dev origin/dev
//基于远程分支创建本地分支
Rebase
git rebase
操作可以把本地未push的分叉提交历史整理成直线;- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
标签管理
- tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起
- Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像,但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
创建标签
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit_id
;git tag -a <tagname> -m "blablabla... commit_id"
指定标签信息;git tag
查看所有标签。git show tag_id
查看某一tag的具体信息
操作标签
- 命令
git push origin <tagname>
可以推送一个本地标签; - 命令
git push origin --tags
可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>
可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
使用Github
- 一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git克隆,因为没有权限,你将不能推送修改
- 在GitHub上,可以任意Fork开源仓库;
- 自己拥有Fork后的仓库的读写权限;
- 可以推送pull request给官方仓库来贡献代码。
自定义Git
git config --global color.ui true
让Git显示颜色,让命令输出看起来更醒目。
忽略特殊文件
- 忽略某些文件时,需要编写
.gitignore
; - .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
- 不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
- 把
.gitignore
也提交到Git,就完成了!检验.gitignore
的标准是git status
命令是不是说working directory clean。 - 补充:
- 如果文件类型是忽略的类型,但你确实想添加该文件,可以用-f强制添加到Git:
git add -f App.class
- 或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用
git check-ignore
命令检查:git check-ignore -v App.class
- 如果文件类型是忽略的类型,但你确实想添加该文件,可以用-f强制添加到Git: