抄自廖雪峰的官方网站

完整图文请访问https://github.com/Mrlution/study/tree/master/git

关于repository

我认为repository是一个存放代码代码的地方

使用git

安装

windows安装完毕后要

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

你的电脑里以后可能会有许许多多个项目,每一个项目的代码都放进一个单独的仓库。 config命令的--global参数让你在所有的仓库里面都使用上面的身份。

如果这个身份与github中Public profile配置中的Public email一致,github会在git push之后记录Contributions(profile 那里的绿格子)

创建本地仓库

在本地新建一个目录dir并执行

git init

这个仓库dir就建好了,当前目录下的.git是Git用来跟踪管理版本库的。这个仓库只能跟踪当前目录dir下的文件

将本地文件添加入仓库

在本地新建源文件a.txt后,通过

git add a.txt

将文本文件添加入仓库,或者

git add .

将所有文件添加入仓库,

然后进行必要的说明

git commit -m "wrote a  file"

这就是一次提交

连接远程仓库

仓库可以是本地仓库也可以是远程仓库。在连接远程仓库如Github仓库前,你应当在远程建好仓库,并且获得提交到远程仓库的权限。

也就是说,你要

  1. 新建远程仓库
  2. 生成ssh key```ssh-keygen -t rsa -C "youremail@example.com"``,将本地的ssh key 添加到github
  3. 测试是否可以和github通信ssh git@github.com。如果有 You've successfully authenticated表示连接成功

当你完成上面的操作后,你在本地有一个仓库dir,在github上有一个仓库study,然后你可以将两个仓库连接起来。

在本地仓库dir下执行

git remote add origin git@github.com:mrlution/study.git

就将本地仓库dir和远程仓库study连接起来了。

接下来

git push -u origin master

将本地master分支推送到远程仓库, -u 参数会将本地master分支和远程master分支关联,下次推送可以不用-u参数,默认推送到远程master分支

版本回退

存档

每次commit就是一次存档,一个版本。每次提交git都会把他们按时间串成一条线。可以从未来回到某一次commit。每次提交都会有一个commit id

查看提交历史

通过

git log

查看最近的提交日志,可以看到commit id

回退

当前版本用HEAD表示,上一个版本用HEAD(或HEAD~1)表示,上上一个版本用HEAD^(或HEAD2)表示,上100个版本用HEAD100表示。

穿越到过去,到达上一次保存,通过

git reset --hard HEAD^

如果要到回到未来,则要找到未来的版本的id

git reflog

上面这条命令会记录你的每一次命令和它的id如如22cc221

然后乘坐时光机

git reset --hard 22cc221

概念解释

工作区

如上面的dir目录就是工作区

版本库

工作区有一个隐藏目录.git,这个就是Git的版本库。Git的版本库里有一个称为stage(或者叫index)的暂存区,还有Git自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

我们把文件往Git版本库里添加的时候,是分两步执行的:

  1. 用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  2. 用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。git commit只负责把暂存区的修改提交了。

    可以简单理解为,需要提交的修改通通放到暂存区,再一次性提交暂存区的所有修改到分支。
git status

查看当前状态,例如有哪些修改没有通过git add添加到stage而处于未为commit做好准备的状态,有哪些文件从来没通过git add添加到stage而处于未追踪状态,本地仓库领先远程仓库多少个commits等等

撤销修改

git checkout -- readme.txt

意思就是,把readme.txt文件在工作区的修改全部撤销,根据有没有执行git add分为两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

git reset HEAD -- readme.txt

可以把暂存区的修改撤销掉(unstage),重新放回工作区,然后再执行上面的

git checkout -- readme.txt

把修改从工作区撤销掉

但是如果推送到了远程仓库那么这修改就会被别人看见了

删除文件

工作区删除文件后,使用git rm test.txt从版本库删除文件

工作区误删文件后,使用git checkout -- test.txt用版本库里的版本替换工作区的版本或者说成恢复

关于远程仓库是否有人冒充

克隆远程仓库

新建一个目录file作为新仓库的工作区,在该目录下

git clone git@github.com:mrlution/study.git

即可将远程的一个仓库克隆到本地。

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

分支管理

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

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

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上.

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支

新建dev分支

git branch dev

切换到dev分支

git checkout dev

另外git branch命令可以查看当前分支

dev分支的工作完成,我们就可以切换回master分支:

git checkout master

git merge命令用于合并指定分支到当前分支,把dev分支的工作成果合并到master分支上:

git merge dev

合并完成后,就可以放心地删除dev分支了

git branch -d dev

分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。所以,团队合作的分支看起来就像这样:

创建bug分支

假如要修复master分支上的bug,而你在你自己的分支上工作

保存当前工作区,把当前工作现场“储藏”起来,等以后恢复现场后继续工作

git stash

切换到master分支

git checkout master

创建bug分支

git checkout -b issue-101

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支

然后回到原来的工作分支

并且从stash恢复工作现场,同时清空stash

git stash pop

开发新feature也可以像修复bug一样新建分支

多人协作

查看远程库信息,使用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;

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin 推送自己的修改;

  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

  3. 如果合并有冲突,则解决冲突,并在本地提交;

  4. 没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。

变基rebase

标签

切换到要打标签的分支,为最新的commit打上标签

git tag v1.0

通过commit id为某个历史commit打上标签

git tag v0.9 f52c633

显示所有标签

git tag

Github的使用

点“Fork”就在自己的账号下克隆了一个别人的仓库

如果你希望项目的官方库能接受你的修改,你就可以在GitHub上发起一个pull request

删除原本的远程库关联

git remote rm origin

关连多个远程库

请不要给两个远程库都取名origin

git remote add github git@github.com:michaelliao/learngit.git
git remote add gitee git@gitee.com:liaoxuefeng/learngit.git

推送到github

git push github master

推送到gitee

git push gitee master

git配置

Git回顾的更多相关文章

  1. 天天都在用Git,那么你系统学习过吗?(一)学习过程

    你系统学习Git了吗? 使用Mac编程的好处,不是因为Mac长得好看 Git内容学习准备 如果你还没有用Git,就不要写代码了. GitHub仓库的使用. 新员工入职的时候,会让他先用一周的时间去学习 ...

  2. GIT学习——天天都在用Git,那么你系统学习过吗?(学习过程)

    你系统学习Git了吗? 学习圣思园张龙老师的Git课程. 使用Mac编程的好处,不是因为Mac长得好看 Git内容学习准备 如果你还没有用Git,就不要写代码了. GitHub仓库的使用. 新员工入职 ...

  3. Git命令回顾

    团队从Eclipse迁移到Android Studio之后,也从SVN迁移到Git了. 一直忙于需求迭代无暇做迁移,现在才开始做,相见恨晚,好东西,高大上,词穷. 回顾和记录一下git的一些基本操作. ...

  4. git操作回顾:

    1. git查看自己的本地分支: ***:~/mysite/mysite$ git branch * master 2. 查看远程分支: ***:~/mysite/mysite$ git branch ...

  5. 回顾 git 常用命令

    git init      在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹.   git clone      获取一个u ...

  6. 拾遗:Git 常用操作回顾

    温故而知新,可以为师矣. Git 布局 工作区---->暂存区---->本地仓库---->远程仓库 Create Repository git init PATH git add P ...

  7. git &github 快速入门

    本节内容 github介绍 安装 仓库创建& 提交代码 代码回滚 工作区和暂存区 撤销修改 删除操作 远程仓库 分支管理 多人协作 github使用 忽略特殊文件.gitignore 1.gi ...

  8. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  9. 记一次git amend事故处理方案

    一.问题回顾 问题是git commit --amend 引起的. 一条commit已经push到远端develop了,但是后来又在这条commit上进行了amend操作,导致这条commit的哈希码 ...

随机推荐

  1. python pandas使用数据透视表

    1) 官网啰嗦这一堆, pandas.pivot_table函数中包含四个主要的变量,以及一些可选择使用的参数.四个主要的变量分别是数据源data,行索引index,列columns,和数值value ...

  2. Collections集合工具类的方法

    addAll & shuffle: 返回类型为boolean类型,执行完操作不接收也行: 其中,静态方法,与对象无关,类名点方法名直接调用: 点点点为可变参数,随便填写几个参数都可以: sor ...

  3. interface接口——公共规范标准

    黑马课程学习记录: 个人理解也可以看成一个类:源代码还是.java,编译后的字节文件还是.class 抽象类中可以含有普通成员方法,但是有抽象方法的必须是抽象类或者接口, 接口中只能含有抽象方法: 创 ...

  4. linux安装部署Nginx

    两个参考地址: NGINX的百度百科:https://baike.baidu.com/item/nginx/3817705?fr=aladdin NGINX的中文网站:http://www.nginx ...

  5. ztree使用实例

    一.当某节点被选择或被取消选择时获取所有被选择的节点: <link rel="stylesheet" href="./static/libs/ztree/css/m ...

  6. PDF文档导出

    代码如下: /// <summary> /// 获取html内容,转成PDF(注册) /// </summary> public void DownloadPDFByHTML( ...

  7. Oracle数据库的入门之一

    Oracle的介绍: Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle ...

  8. django 动态生成PDF文件

    可以通过开源的Python PDF库ReportLab来实现PDF文件的动态生成. 一.安装ReportLab ReportLab库在PyPI上提供,可以使用pip来安装: $ pip install ...

  9. LSTM算法原理理解

    神经网络 模拟人类大脑神经网络结构,每个神经元和其他的神经元相互连接,当它兴奋的时候会向相连的神经元发送化学物质,从而改变神经元的电位,当神经元的电位超过阈值,它会被激活,向其他神经元发送化学物质.其 ...

  10. Mybatis的Mapper接口方法不能重载

    今天给项目的数据字典查询添加通用方法,发现里边已经有了一个查询所有数据字典的方法 List<Dict> selectDictList(); 但我想设置的方法是根据数据字典的code查询出所 ...