最实用的Git命令

@(前端开发)[Git|工具]
之前也看过一些关于git的视频,但是以为本身一直都没有真的理解和掌握git,花了一天半的时间,看完了廖雪峰老师的Git教程,并动手实践了一下,才以为本身是真的对git入门了,看的过程当中也作了一些笔记,也就是下文啦。前端

Git实践

Git简介

历史

功能:
Git是目前世界上最早进的分布式版本控制系统(没有之一)。
历史:git

  • 1991 Linux建立Linux,须要管理github

  • 2002年之前,Linux手动合并开发者提供的代码shell

  • 2002~2005:BitMover公司的BitKeeper免费给Linux使用bootstrap

  • 2005开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现了,要收回Linux社区的无偿使用权。缓存

  • Linus花了两周时间本身用C写了一个分布式版本控制系统-Git,一个月以后Linux源码由此代理安全

  • 2008年Github上线,为开源项目提供免费Git存储bash

集中式VS分布式

集中式的版本控制系统:CVS,SVN
集中式的版本控制系统服务器

运行方式:版本库是集中存放在中央服务器的,而干活的时候,用的都是本身的电脑,因此要先从中央服务器取得最新的版本,而后开始干活,干完活了,再把本身的活推送给中央服务器。
缺点:集中式版本控制系统最大的毛病就是必须联网才能工做网络

分布式:Git

分布式版本控制系统

运行方式:每一个人的电脑上都是一个完整的版本库,你在本身电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,大家俩之间只需把各自的修改推送给对方,就能够互相看到对方的修改了。
分布式版本控制系统一般也有一台充当“中央服务器”的电脑,但这个服务器的做用仅仅是用来方便“交换”你们的修改,没有它你们也同样干活,只是交换修改不方便而已。

安装Git

在Linux上安装Git

  • 输入git,看看系统有没有安装Git:

  • sudo apt-get install git就能够直接完成Git的安装

在Mac OS X上安装Git

两种方法:

  1. 第一种安装homebrew,而后经过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/

  2. 第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你须要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就能够完成安装了。

在Windows上安装Git

  1. msysgit是Windows版的Git,从http://msysgit.github.io/下载,而后按默认选项安装便可。

  2. 安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个相似命令行窗口的东西,就说明Git安装成功!

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

建立版本库

版本库:

版本库又名仓库,英文名repository,你能够简单理解成一个目录,这个目录里面的全部文件均可以被Git管理起来,每一个文件的修改、删除,Git都能跟踪,以便任什么时候刻均可以追踪历史,或者在未来某个时刻能够“还原”。

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
  1. pwd命令用于显示当前目录;

  2. mkdir learngit用于建立一个空目录;

  3. 经过git init命令把这个目录变成Git能够管理的仓库:

  4. 将文件添加到版本库:

全部的版本控制系统,其实只能跟踪文本文件的改动,好比TXT文件,网页,全部的程序代码等等,Git也不例外。版本控制系统能够告诉你每次的改动,好比在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但无法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改为了120KB,但到底改了啥,版本控制系统不知道,也无法知道。
新建一个文件:必定要放到learngit目录下(子目录也行),由于这是一个Git仓库,放到其余地方Git再厉害也找不到这个文件。

  • git add:用命令git add告诉Git,把文件添加到仓库:

  • git commit:用命令git commit告诉Git,把文件提交到仓库:
    $ git commit -m "wrote a readme file"

穿梭时光

  • 要随时掌握工做区的状态,使用git status命令。

  • 若是git status告诉你有文件被修改过,用git diff能够查看修改内容。

版本回退

  1. git log:显示从最近到最远的提交日志;

  2. git log --pretty=oneline:显示简要版的提交日志;

  3. commit id(版本号)已3628164...882e1e0方式显示,是一个SHA1计算出来的一个很是大的数字,用十六进制表示,防止多人协做时产生冲突;

  4. git reset --hard HEAD^:返回上一个版本,HEAD表示当前版本,HEAD^^表示上上个版本,也能够用相似于HEAD~3来表示要回退到哪个版本。

  5. $ git reset --hard 3628164:后面的数字是版本号,此方法能够随意跳转

  6. Git的版本回退速度很是快,由于Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向另外一个版本

示意图

  1. git reflog:记录全部的操做,能够经过此查询版本号;

工做区和暂存区

工做区(Working Directory):
就是你在电脑里能看到的目录,好比个人learngit文件夹就是一个工做区:

工做区

版本库(Repository)
工做区有一个隐藏目录.git,这个不算工做区,而是Git的版本库。
Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD

版本库

提交变动的两个步骤:

  1. 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

  2. 第二步是用git commit提交更改,实际上就是把暂存区的全部内容提交到当前分支。

  3. 你能够简单理解为,须要提交的文件修改统统放到暂存区,而后,一次性提交暂存区的全部修改。

理解缓存区的意思

git add命令实际上就是把要提交的全部修改放到暂存区(Stage),而后,执行git commit就能够一次性把暂存区的全部修改提交到分支。

管理修改

若是同一个文件有屡次修改,须要每次都add到缓存库,否则提交无效
每次修改,若是不add到暂存区,那就不会加入到commit中。

撤销修改

场景1:当你改乱了工做区某个文件的内容,想直接丢弃工做区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工做区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操做。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除文件

  1. 删除文件的两种方法:

    • 直接从本地删除

    • 使用rm test.txt

  2. 删除以后会出现两种状况:

    • 从版本库恢复:git checkout -- test.txt

    • 从版本库也删除:git rm test.txt而后git commit

总结“checkout”:
git checkout实际上是用版本库里的版本替换工做区的版本,不管工做区是修改仍是删除,均可以“一键还原”。

命令git rm
用于删除一个文件。若是一个文件已经被提交到版本库,那么你永远不用担忧误删,可是要当心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

远程仓库

  1. Git的杀手功能之一

  2. 实际状况每每是这样,找一台电脑充当服务器的角色,天天24小时开机,其余每一个人都从这个“服务器”仓库克隆一份到本身的电脑上,而且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

建立本地git仓库与Github之间的传输

  1. 在用户主目录下,看看有没有.ssh目录,若是有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,若是已经有了,可直接跳到下一步。若是没有,打开Shell(Windows下打开Git Bash),建立SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"
Your identification has been saved in /Users/zhangwang/.ssh/id_rsa.
Your public key has been saved in /Users/zhangwang/.ssh/id_rsa.pub.

若是一切顺利的话,能够在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,能够放心地告诉任何人。

  1. 登录GitHub,打开“Account settings”,“SSH Keys”页面:
    而后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

为何GitHub须要SSH Key呢?

由于GitHub须要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,因此,GitHub只要知道了你的公钥,就能够确认只有你本身才能推送。

在GitHub上免费托管的Git仓库,任何人均可以看到喔(但只有你本身才能改)。因此,不要把敏感信息放进去。

若是你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另外一个办法是本身动手,搭一个Git服务器,由于是你本身的Git服务器,因此别人也是看不见的。这个方法咱们后面会讲到的,至关简单,公司内部开发必备。

添加远程库

  1. 要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

  2. 关联后,使用命令git push -u origin master第一次推送master分支的全部内容;

  3. 此后,每次本地提交后,只要有必要,就可使用命令git push origin master推送最新修改;

  4. 分布式版本系统的最大好处之一是在本地工做彻底不须要考虑远程库的存在,也就是有没有联网均可以正常工做,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!

从远程库中克隆

1.克隆一个远程库:$ git clone git@github.com:servername/gitskills.git

  1. 若是有多我的协做开发,那么每一个人各自从远程克隆一份就能够了。

  2. GitHub给出的地址不止一个,还可用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可使用https等其余协议。

  3. 使用https除了速度慢之外,还有个最大的麻烦是每次推送都必须输入口令,可是在某些只开放http端口的公司内部就没法使用ssh协议而只能用https。

小结:

  1. 要克隆一个仓库,首先必须知道仓库的地址,而后使用git clone命令克隆。

  2. Git支持多种协议,包括https,但经过ssh支持的原生git协议速度最快。

分支管理

什么是分支咧?

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另外一个你正在另外一个平行宇宙里努力学习SVN。

若是两个平行宇宙互不干扰,那对如今的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

分支示意图

分支有啥做用咧?

  1. 你建立了一个属于你本身的分支,别人看不到,还继续在原来的分支上正常工做,而你在本身的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工做。

  2. Git的分支是不同凡响,不管建立、切换和删除分支,Git在1秒钟以内就能完成!不管你的版本库是1个文件仍是1万个文件。

建立和合并分支

  1. 查看分支:git branch

  2. 建立分支:git branch <name>

  3. 切换分支:git checkout <name>

  4. 建立+切换分支:git checkout -b <name>至关于如下两步:

    • $ git branch dev

    • $ git checkout dev

  5. 合并某分支到当前分支:git merge <name>

  6. 删除分支:git branch -d <name>

Git鼓励大量使用分支:这样更安全
Fast-forward信息,Git告诉咱们,此次合并是“快进模式”
模式图:

  1. 原来只有master分支

只有master分支

  1. 使用git checkout -b dev 建立并转移至新分支dev

建立并转移至新分支dev

  1. 在新分支上更改内容

在dev上更改内容

  1. 使用:git merge dev合并dev分支到master分支

合并dev和master分支

  1. 使用git branch -d dev删除已经完成了使命的dev分支

删除dev分支

解决冲突

人生不如意之事十之八九,合并分支每每也不是一路顺风的。
当在两个分支上对同一个文件进行修改时,若是合并这两个分支就会产生冲突,这时候须要手动修改。
git log --graph --pretty=oneline --abbrev-commit
git log --graph命令能够看到分支合并图。

分支管理策略

在实际开发中,咱们应该按照几个基本原则进行分支管理:

  1. master分支应该是很是稳定的,也就是仅用来发布新版本,平时不能在上面干活;

  2. 那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,好比1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

  3. 你和你的小伙伴们每一个人都在dev分支上干活,每一个人都有本身的分支,时不时地往dev分支上合并就能够了。
    因此,团队合做的分支看起来就像这样:

实际的工做分支

合并分支时,加上--no-ff参数就能够用普通模式合并,合并后的历史有分支,能看出来曾经作过合并,而fast forward合并就看不出来曾经作过合并。

Bug分支

软件开发中,bug就像屡见不鲜同样。有了bug就须要修复,在Git中,因为分支是如此的强大,因此,每一个bug均可以经过一个新的临时分支来修复,修复后,合并分支,而后将临时分支删除。

  1. git stash功能:能够把当前工做现场“储藏”起来,等之后恢复现场后继续工做:

  2. 而后从master上面建立新的分支,修复bug合并

  3. git stash list:用于查看被储藏起来的那部分项目,

  4. 恢复被储藏项目的两种方法:

    • 用·it stash apply恢复,可是恢复后,stash内容并不删除,你须要用git stash drop来删除;

    • git stash pop,恢复的同时把stash内容也删了:

Feature分支

软件开发中,总有无穷无尽的新的功能要不断添加进来。
添加一个新功能时,你确定不但愿由于一些实验性质的代码,把主分支搞乱了,因此,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
开发一个新feature,最好新建一个分支;
若是要丢弃一个没有被合并过的分支,能够经过git branch -D <name>强行删除。
当要删除一个没被合并的分支时,系统会提醒,若是要删除须要强制删除,须要执行命令:git branch -D <name>

多人协做

  1. 查看远程库信息,使用git remote -v

  2. 本地新建的分支若是不推送到远程,对其余人就是不可见的;

  3. 从本地推送分支,使用git push origin branch-name,若是推送失败,先用git pull抓取远程的新提交;

  4. 在本地建立和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

  5. 创建本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

  6. 从远程抓取分支,使用git pull,若是有冲突,要先处理冲突。

那些分支须要及时推送?

  1. master分支是主分支,所以要时刻与远程同步;

  2. dev分支是开发分支,团队全部成员都须要在上面工做,因此也须要与远程同步;

  3. bug分支只用于在本地修复bug,就不必推到远程了,除非老板要看看你每周到底修复了几个bug;

  4. feature分支是否推到远程,取决于你是否和你的小伙伴合做在上面开发。

标签管理

啥是标签呢?
Git的标签就像是版本库的快照,实质上它就是指向某个commit的指针(跟分支很像对不对?可是分支能够移动,标签不能移动),因此,建立和删除标签都是瞬间完成的。
做用在于未来不管何时,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。

建立标签

  1. git tag <name>:建立一个新标签

  2. git tag查看全部标签

  3. 标签不是按时间顺序列出,而是按字母排序的。能够用git show <tagname>查看标签信息

  4. 还能够建立带有说明的标签,用-a指定标签名,-m指定说明文字:

  5. 还能够经过-s用私钥签名一个标签

  6. 命令git tag <name>用于新建一个标签,默认为HEAD,也能够指定一个commit id;

  7. git tag -a <tagname> -m "blablabla..."能够指定标签信息;

  8. git tag -s <tagname> -m "blablabla..."能够用PGP签名标签;

操做标签

  1. 命令git push origin <tagname>能够推送一个本地标签;

  2. 命令git push origin --tags能够推送所有未推送过的本地标签;

  3. 命令git tag -d <tagname>能够删除一个本地标签;

  4. 命令git push origin :refs/tags/<tagname>能够删除一个远程标签。

使用GitHub

  1. 在GitHub上,能够任意Fork开源仓库;

  2. 本身拥有Fork后的仓库的读写权限;

  3. 能够推送pull request给官方仓库来贡献代码。

  4. 在GitHub出现之前,开源项目开源容易,但让广大人民群众参与进来比较困难,由于要参与,就要提交代码,而给每一个想提交代码的群众都开一个帐号那是不现实的,所以,群众也仅限于报个bug,即便能改掉bug,也只能把diff文件用邮件发过去,很不方便。

  5. 可是在GitHub上,利用Git极其强大的克隆和分支功能,广大人民群众真正能够第一次自由参与各类开源项目了。

  6. 如何参与一个开源项目呢?好比人气极高的bootstrap项目,这是一个很是强大的CSS框架,你能够访问它的项目主页https://github.com/twbs/bootstrap,点“Fork”就在本身的帐号下克隆了一个bootstrap仓库,而后,从本身的帐号下clone:

自定义git

  1. git config --global color.ui true:让git显示颜色;

忽略特殊文件

在Git工做区的根目录下建立一个特殊的.gitignore文件,而后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不须要从头写.gitignore文件,GitHub已经为咱们准备了各类配置文件,只须要组合一下就可使用了。全部配置文件能够直接在线浏览:https://github.com/github/gitignore

忽略文件的原则是:
  1. 忽略操做系统自动生成的文件,好比缩略图等;

  2. 忽略编译生成的中间文件、可执行文件等,也就是若是一个文件是经过另外一个文件自动生成的,那自动生成的文件就不必放进版本库,好比Java编译产生的.class文件;

  3. 忽略你本身的带有敏感信息的配置文件,好比存放口令的配置文件。

使用Windows的童鞋注意了,若是你在资源管理器里新建一个.gitignore文件,它会很是弱智地提示你必须输入文件名,可是在文本编辑器里“保存”或者“另存为”就能够把文件保存为.gitignore了。

配置别名

给Git配置好别名,就能够输入命令时偷个懒。
配置方法:

$git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch

--global参数是全局参数,也就是这些命令在这台电脑的全部Git仓库下都有用。

每一个仓库的Git配置文件都放在.git/config文件中
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:

$ cat .gitconfig
[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
[user]
    name = Your Name
    email = your@email.com

别名就在[alias]后面,要删除别名,直接把对应的行删掉便可。
配置别名也能够直接修改这个文件,若是改错了,能够删掉文件从新经过命令配置。

搭建Git服务器

  1. 第一步,安装git:
    $ sudo apt-get install git

  2. 第二步,建立一个git用户,用来运行git服务:
    $ sudo adduser git

  3. 第三步,建立证书登陆:
    收集全部须要登陆的用户的公钥,就是他们本身的id_rsa.pub文件,把全部公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

  4. 第四步,初始化Git仓库:
    先选定一个目录做为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

$ sudo git init --bare sample.git
Git就会建立一个裸仓库,裸仓库没有工做区,由于服务器上的Git仓库纯粹是为了共享,因此不让用户直接登陆到服务器上去改工做区,而且服务器上的Git仓库一般都以.git结尾。而后,把owner改成git:
$ sudo chown -R git:git sample.git

  1. 第五步,禁用shell登陆:
    出于安全考虑,第二步建立的git用户不容许登陆shell,这能够经过编辑/etc/passwd文件完成。找到相似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash
改成:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户能够正常经过ssh使用git,但没法登陆shell,由于咱们为git用户指定的git-shell每次一登陆就自动退出。

  1. 第六步,克隆远程仓库:
    如今,能够经过git clone命令克隆远程仓库了,在各自的电脑上运行:

`$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.`
剩下的推送就简单了。

参考文献

史上最浅显易懂的Git教程!

相关文章
相关标签/搜索