引述:廖雪峰 Git 教程git
初始化一个Git仓库,使用git init命令。github
添加文件到Git仓库,分两步:
第一步,使用命令git add <file>,注意,可反复屡次使用,添加多个文件;
第二步,使用命令git commit,完成。网络
要随时掌握工做区的状态,使用git status命令。ssh
若是git status告诉你有文件被修改过,用git diff能够查看修改内容。编辑器
HEAD指向的版本就是当前版本,所以,Git容许咱们在版本的历史之间穿梭,使用命令git reset --hard commit_id。分布式
穿梭前,用git log能够查看提交历史,以便肯定要回退到哪一个版本。fetch
要重返将来,用git reflog查看命令历史,以便肯定要回到将来的哪一个版本。加密
工做区有一个隐藏目录.git,这个不算工做区,而是Git的版本库。url
Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。指针
由于咱们建立Git版本库时,Git自动为咱们建立了惟一一个master分支,因此,如今,git commit就是往master分支上提交更改。
你能够简单理解为,须要提交的文件修改统统放到暂存区,而后,一次性提交暂存区的全部修改。
Git管理的是修改,Git每次修改,若是不add到暂存区,那就不会加入到commit中。
场景1:当你改乱了工做区某个文件的内容,想直接丢弃工做区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工做区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操做。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,用git reflog查看命令历史, 再使用命令git reset --hard commit_id,以便肯定要回到将来的哪一个版本。不过前提是没有推送到远程库。
命令git rm用于删除一个文件。若是一个文件已经被提交到版本库,那么你永远不用担忧误删,可是要当心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
本地Git仓库和GitHub仓库之间的传输是经过SSH加密,因此,须要一点设置:建立SSH Key。在用户主目录下,看看有没有.ssh目录,若是有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,若是已经有了,可直接跳到下一步。
第1步:
若是没有,打开Shell(Windows下打开Git Bash),建立SSH Key:$ ssh-keygen -t rsa -C "youremail@example.com"
你须要把邮件地址换成你本身的邮件地址,而后一路回车,使用默认值便可,因为这个Key也不是用于军事目的,因此也无需设置密码。
若是一切顺利的话,能够在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,能够放心地告诉任何人。
第2步:登录GitHub,打开“Account settings”,“SSH Keys”页面。而后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
要关联一个远程库,使用命令git remote add origin git@github.com:SangYang/learngit.git
关联后,使用命令git push -u origin master第一次推送master分支的全部内容;
此后,每次本地提交后,只要有必要,就可使用命令git push origin master推送最新修改;
分布式版本系统的最大好处之一是在本地工做彻底不须要考虑远程库的存在,也就是有没有联网均可以正常工做,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
你也许还注意到,GitHub给出的地址不止一个,还能够用https://github.com/SangYang/learngit.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可使用https等其余协议。
使用https除了速度慢之外,还有个最大的麻烦是每次推送都必须输入口令,可是在某些只开放http端口的公司内部就没法使用ssh协议而只能用https。
要克隆一个仓库,首先必须知道仓库的地址,而后使用git clone命令克隆。
Git支持多种协议,包括https,但经过ssh支持的原生git协议速度最快。
Git鼓励大量使用分支:
查看分支:git branch
建立分支:git branch <name>
切换分支:git checkout <name>
建立+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
当Git没法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph命令能够看到分支合并图。
用git log --graph --pretty=oneline --abbrev-commit也能够看到分支的合并状况.
在实际开发中,咱们应该按照几个基本原则进行分支管理:
首先,master分支应该是很是稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,好比1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每一个人都在dev分支上干活,每一个人都有本身的分支,时不时地往dev分支上合并就能够了。
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff参数就能够用普通模式合并,合并后的历史有分支,能看出来曾经作过合并,而fast forward合并就看不出来曾经作过合并。
修复bug时,咱们会经过建立新的bug分支进行修复,而后合并,最后删除;
当手头工做没有完成时,先把工做现场git stash一下,而后去修复bug,修复后,再git stash pop,回到工做现场。
开发一个新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 tag <name>用于新建一个标签,默认为HEAD,也能够指定一个commit id;
git tag -a <tagname> -m "blablabla..."能够指定标签信息;
git tag -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上,能够任意Fork开源仓库;
本身拥有Fork后的仓库的读写权限;
能够推送pull request给官方仓库来贡献代码。
忽略某些文件时,须要编写.gitignore;
.gitignore文件自己要放到版本库里,而且能够对.gitignore作版本管理!
(使用Windows的童鞋注意了,若是你在资源管理器里新建一个.gitignore文件,它会很是弱智地提示你必须输入文件名,可是在文本编辑器里“保存”或者“另存为”就能够把文件保存为.gitignore了。)
若是敲git st就表示git status那就简单多了,固然这种偷懒的办法咱们是极力同意的。
咱们只须要敲一行命令,告诉Git,之后st就表示status:
$ git config --global alias.st status
好了,如今敲git st看看效果。
固然还有别的命令能够简写,不少人都用co表示checkout,ci表示commit,br表示branch:
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
配置Git的时候,加上--global是针对当前用户起做用的,若是不加,那只针对当前的仓库起做用。
配置文件放哪了?每一个仓库的Git配置文件都放在.git/config文件中:
$ cat .git/config
[core]
repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin merge = refs/heads/master
[alias]
last = log -1
别名就在[alias]后面,要删除别名,直接把对应的行删掉便可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
$ cat .gitconfig
[alias]
co = checkout ci = commit br = branch st = status
[user]
name = Your Name email = your@email.com
配置别名也能够直接修改这个文件,若是改错了,能够删掉文件从新经过命令配置。