菜鸟标准:知道pwd ,rm 命令是什么。
一、Git 是什么。
git 是目前世界上最先进的分布式版本控制系统
二、SVN与Git
1.版本控制系统
SVN 是集中式版本控制系统,版本库是集中放在中央服务器的。
Git 更倾向于分布式模式。也就是每个开发人员从中心版本库/服务器上 checkout 代码后会在自己的机器上克隆一个自己的版本库。当突遇没有网络的环境时,分布式的操作模式将是一个巨大的恩赐。
你不必做出补丁包,通过email 方式发送出去,只需要创建一个分支,向项目团队发送一个推请求,就能让你的代码保持最新,而且不会在传输过程中丢失。GitHub.com 就是其中一个优秀的案例。
2.数据方式存储
Git 元数据存储方式,而svn 按文件 。.git 目录处于机器上的一个克隆版的版本库,它拥有中心版本库中所有东西,如标签,分支,版本记录等。如果你把.git 目录的体积和.svn 相比较,会发现它们相差很大。
3.分支不同
分支在SVN中就是版本库中的另一个目录。如果你想知道是否合并了一个分支,你需要手工运行命令: svn propget svn:mergeinfo 来确认代码是否被合并。所以,经常会发生分支被遗漏的情况。
Git 却可以从同一个目录下快速在多个分支间切换。因为很容易发现未被合并的分支,你能简单而快捷的合并这些文件。
4.全局的版本号
Git 没有,SVN有。SVN的版本号实际是任何一个相应时间的源代码快照,因此也被认为是从CVS 进化到SVN 的最大突破。也有开发者指出,可以使用GIT 的 SHA-1 来唯一的标识一个代码快照。用途相同,但并不能完全代替SVN 里容易阅读的数字版本号。
5内容完整性
Git 内容存储使用的是SHA-a 哈希算法。这能确保代码内容的完整性,尤其遇到磁盘故障和网络问题时降低对版本库的破坏。
版本控制要结合公司策略选用合适的工具。版本控制不只是工具,工具也不只是代码管理。
由于 SVN 是集中式,会出现耦合。所以要求开发代码规范。当然,任何不可运行的代码的提交都是没有意义的(即提交的粒度:原子性)。
三、安装Git
msysgit 是 windows版的Git ,可直接网上下载。安装成功后,在开始菜单里 “Git - Git Bash” 会弹出一个类似命令窗口,表示Git安装成功。
因为Git 是分布式版本控制系统,需要填写用户名和邮箱作为一个标识。所以,在命令行中输入:
git config --global user.name "yourname"
git config --global user.email "youremail@qq.com"
注:global 表示机器上所有Git 仓库都会使用这个配置。
四:操作步骤
1.创建版本库 repository
举例:在D 盘 gitdemo文件目录下新建一个gitdemo1 版本库
2.修改并提交仓库
在gitdemo1 目录下新建记事本 readme.txt, 内容为1
此时,在readme.txt 增加一行 22
在命令行中输入git status , git diff readme.txt
我们可以看到,readme.txt 内容从一行1 改成 二行22 内容
此时可以放心提交到仓库了。
git add
git commit
3.版本回退
在readme.txt 中增加一行 333
git log 命令显示从最近 到最远的显示日志
可以使用git log -pretty=oneline 演示如下
版本回退操作,有两种命令。
1.git reset -hard HEAD^ , 如果回退到上上个版本,改成HEAD^^, 回退100 个版本
git reset -hard HEAD~100
版本回退,使用 git reset --hard
问题:已经关掉一次命令行,或者333 的内容版本号我们并不知道,我们如何知道 要增加333 内容的版本号呢。
git reflog
增加内容333的版本号为 fa2740f
git reflog --hard fa2740f 来恢复
4工作区与暂存区
工作区:电脑上看得到的目录,或者需要新建的目录文件等
版本库:工作区有一个隐藏目录.git , 这属于版本库。版本库中存放很多东西,其中最重要的就是stage (暂存区), 还有Git 为我们自动创建了第一个分支master , 以及指向 master 的一个指针HEAD
前文已知道,Git 提交文件到版本库有两步
1.git add , 把文件添加到暂存区
2. git commit 提交更改,把暂存区的所有内容提交到当前分支上。
在readme.txt 增加一行4444, 新增文件 test.txt
git add 命令添加到暂存区中,git status 查看状态
git commit 提交全部文件
5.Git 撤销修改和删除文件操作
1.撤销修改
在readme.txt 文件中增加一行 55555
在我未提交前,我发现添加 55555 内容有误,可以有几种方法恢复以前版本。
第1:如果知道要删除的内容,直接手动更改,然后add 添加到暂存区,最后 commit 掉
第2:恢复到上一个版本: git reset --hard HEAD^
可否直接使用撤销命令呢?
cat readme.txt 查看当前内容
先git status 查看一个当前状态
git checkout --file 把文件在工作区做的修改全部撤销。这里有两种情况:
第1:readme.txt 自动修改后,还没有放到暂存区,使用撤销修改就回到和版本库一模一样的状态
第2.另外一种是readme.txt 已经放入暂存区,又作了修改,撤销修改就回到添加暂存区后的状态。
对于 第2种情况,我们继续假定readme.txt 添加一行内容为666666 ,
git add 添加到暂存区,
接着添加内容 7777777
此时我们想通过撤销命令让其回到暂存区后的状态。
2删除文件
假如我们在版本gitdemo1 目录下添加一个文件 b.txt
继续查看 b.txt 文件已经删除了,此时有两个选择
1.直接commit
2.从版本库中恢复被删除的文件
注:没有commit 之前,可以使用命令 git checkout -- b.txt 执行文件恢复操作
6远程仓库
先注册gitHub 帐号
本地Git 仓库与GitHub 仓库之间通过SSH 传输加密的。
第1:创建SSH key 。用户主目录下如果没有 .ssh 目录,目录下没有 id_rsa和 id_rsa.pub 两个文件,执行以下命令:
ssh-keygen -t rsa -C "youremail@example.com"
注:id_rsa 是私钥,一般不透露。id_rsa.pub 是公钥,可以告诉任何人。
第2:登录github, 打开 settings - Add SSH Key , (进入路径可不同,有多种方式),填上任意title, 在Key 文本框里粘贴 id_rsa.pub 文件内容。
操作1:添加远程库
保持本地Git 仓库 和 githug 上的仓库进行远程同步
首先,github 右上角 “New repostory”
Repository Name 填 gitdemo01 ,点击创建
此时testgit 仓库是空的,我们可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到github 仓库。
本地运行命令
git remote add origin https://github.com/xxx/gitdemo01.git
使用 git push 命令将本地内容推送到远程,实际上是把当前分支 master 推送到远程。
注:此时远程库是空的,我们第一次推送 master 分支时,加上 -u 参数,Git 不但会把本地master 分支内容推送的远程新的 master 分支,还会把本地master 分支和远程 master 分支关联起来,在以后的推送或者摘取时就可以简化命令。推送成功后,可以立刻在github 页面上看到远程和本地仓库内容已同步。
此后,本地修改可通过命令修改提交:
git push origin master
现在,我们拥有了一个真正的分布式版本库。
操作2:从远程克隆到本地
首先登录github , 创建名为 gitdemo02 新仓库,注意多一步勾选 Initialize this repository
此时,本地获取同步目录 gitdemo02
7创建与合并分支
HEAD 严格来说,不是指向提交,而是指向master , master 指向提交,所以,HEAD 指向当前分支。
每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支,截止目前,只有一条时间线,在Git 里,这个分支称之为 主分支,即master 分支。
首先,创建 dev 分支,然后切换到 dev 分支上。
git branch dev
git checkout dev
两条命令可以合并为:
git checkout -b , -b 表示创建并切换
git branch 列出所有分支,并在当前分支前显示星号。
我们在readme.txt 添加内容7777777。
查看内容,并提交。
切换到主分支 master 上,继续查看内容
git check master
可以看到,添加到分支dev 上的内容 7777777 不见了。因为这里是master .
使用命令:git merge 命令,可以合并指定分支到当前分支上。
此时,可以删除dev 分支。
命令:git branch -d name
小结创建与合并分支:
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout -b name
合并某分支到当前分支:git merge name
删除分支:git branch -d name
8如何解决冲突
新建一个分支 branch02
在readme.txt 中添加一行88888888,然后提交。
切换到master ,在最后一行添加 99999999
现在我们需要在分支上来合并 branch02, 发现冲突。
注:<<<<<<, ======, >>>>>> 用于标记不同分支的内容。
<<<HEAD 指主分支修改的内容。>>>branch02 指branch02 上修改的内容。
我们可以本地修改并保存
使用git log 可查看分支合并情况
9分支管理策略
通常合并分支时 , git 一般使用"Fast forward "模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 -no-ff 来禁用此模式。
demo演示
1.创建dev 分支
2.修改readme.txt 内容
3.添加到暂存区
4.切换回主分支 master
5.合并dev 分支,使用命令 git merge -no-ff -m 注释 dev
6.查看历史记录
分支策略:主分支master 通常用来发布新版本,一般不允许在上面干活。
常在分支dev 上干活,分支代码稳定后可以合并到主分支master 上来。
10bug 分支
在Git 中,每个bug 都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临朝的分支删除掉。
比如404错误。当前dev 分支上的工作还没有提交,或者工作进行一半时候,我们无法提交。怎么办呢?Git 提供一个stash 功能,可以把当前工作现场进行隐藏,等以后恢复工作后继续工作。
命令stash ,并查看状态
git stash
git status
首先,我们要确定在哪个分支上修复bug, 比如,在主分支master 上来修复,现在我们在master 分支上创建一个临时分支,
演示:
在master 分支上创建临时分支 issue-404
查看内容,修改后查看内容,修改完成后,切换到master 主分支上并完成合并,最后删除issue-404分支。完成后,回到dev 分支上开始干活
现在工作区是干净的,如何恢复工作场呢?我们可以使用命令git stash list 来查看。
工作场还在,Git 把stash 内容存放在一边,恢复工作可以使用如下两个方法:
1.git stash apply , 恢复后stash 内容并不删除,你需要使用命令 git stash drop 删除。
2.git stash pop ,恢复的同时把stash 内容也删除。
11 多人协作
远程克隆时,实际上Git 自动把本场的master 分支和远程的master 分支对应起来了,并且远程库的默认名称是origin
1.查看远程库信息:git remote
2.查看远程库详细信息:git remote -v
分为抓取分支,推送通知。
1.推送分支
推送分支就是把该分支上所有本地提交到远程库中,推送时,要指定本地分支。这样,Git就会把该分支推送到远程训对应的远程分支上。
命令:git push origin master
推送成功。
假如需要推送到dev 分支上,命令:git push origin dev
哪些分支要推送呢?
1.master 主分支需要保持与远程同步
2.一些bug 分支不需要推送到远程,可以先合并到主分支上,再把主分支master 推送到远程。
2.抓取分支
模拟一下多少协作场景。成员将各自修改推送到各自的master 分支上。另一同事在另一台电脑(注意配置SSH key ),或者同一电脑不同目录克隆,新建目录名字gitdemo2
我们首先把dev 分支推送到远程中。
在将gitdemo2 目录克隆到本地
现在小伙伴要在dev 分支上开发,必须把远程的origin 的dev 分支到本地来,于是可以使用命令创建本地dwv 分支 : git checkout -b dev origin/dev
现在可以开发了,开发完成后把dev 推送到远程库即可。
命令:
git add readme.txt
git commit -m "readme.txt 修改xxx内容"
把现在在dev 分支推送到远程:git push origin dev
此时,小伙伴最新提交的与我试图推送的有冲突。
先用git pull 把最新提交的从origin/dev 抓下来,然后在本地合并,解决冲突再进行推送。
oh, no 命令 git pull 也失败了,原因是没有指定本地dev 分支与远程 origin/dev 分支的链接。根据提示,设置 dev 和 origin/dev 链接。
git branch --set-upstream dev origin/dev
此时,git pull 一下。bingo 成功了。合并有冲突,需要手动解决。解决方法和分支管理中解决冲突完全一样。解决后,提交,再push
git add readme.txt
git commit -m "merge & fix readme.txt"
git push origin dev
因此,多人协作工作模式一般是这样的
1.git push origin branch-name 推送
2.推送失败,远程分支比本地更新的早,需要先git pull 试图合并。
3.如果合并有冲突,解决冲突,并在本地提交。再用git push origin branch-name 推送。
总结:
日常使用Git 建议
1.日志输出参数 .示例 git log --oneline --graph
2.查看文件详细变更:示例:git -log -p filename
3.查看文件中指定位置的变更 示例:git log -L 1, 1:some-file.txt
4.查看尚未合并的变更 示例:git log --no-merges master
5.查看其他分支中的文件 示例:git show some-branch:some-file.js
6.关于变更基线的几点说明 示例:git pull --rebase
7.本地合并后保留分支结构 示例 git merge --no-ff
8 修复而非新建提交 示例:git commit --amend
9 Git 中的三种状态及相互转换 示例:git reset --hard HEAD 与 git status -s
10撤销而不产生提交信息 示例:git revert -n
11用第三方差异工具查看整个工程而非单个目录的差异 示例:git difftoll -d
12忽略空格变更 示例:git diff -w 或 git blame -w
13 追加文件中的部分变更 示例:git add -p
14 发现并清理无用分支 示例:git branch -a
15 暂存部分文件 示例 git stash --keep-index 或 git stash -p
16写好提交信息 示例:-应用这次提交,可以更新**README文件**
--应用这次提交,为调用GET/user/:id API 追加确认
--应用这次提交,回退到**11111*版本*
17Git自动补全 https://git-scm.com/book/en/v1/Git-Basics-Tips-and-Tricks#Auto-Completion
18创建常用命令的别名
示例 git config --global alias.l "log --oneline --graph"
这个命令会创建一个新的git 别名l ,git l 代替git log -oneline -graph
也可以在alias 附加其他的参数。如git l -author = "Mike"
19 快速定位故障版本 示例: git bisect
http://git-scm.com/docs/git-bisect#_bisect_run
原文链接:http://note.youdao.com/noteshare?id=6614c88657195d90d44808c1ef31e6ad&sub=EDABD299B4E64713AD41AA09E77909D6
公众号:一只阿木木
- GitHub创建仓库,并与git本地仓库关联
登录后头像右上角点击: 起名再create 后 会跳转到下面页面: 先在git上复制执行第一条指令,创建一个readme文档 然后再用第二条初始化仓库 第三步将readme文档添加至暂存区 然后提交一 ...
- 2015年12月01日 GitHub入门学习(三)GitHub创建仓库
序:创建自己的GITHub账号,并创建自己第一个仓库,尝试通过msysgit客户端,往仓库提交文件. 一.创建GitHub账户 链接地址:https://github.com/join,很简单,自己创 ...
- github创建仓库,往github上上传自己的项目
k第一步: 在github上创建仓库 第二步: 创建一个新的项目,填写项目名称,描述 创建完成之后,跳转到下面的页面,下面红框中的网址要记住,在后面上传代码的时候需要使用 这个地址必须要记住!!! 第 ...
- git+sourcetree创建仓库
1.git上创建版本库 2.安装sourcetree 3.创建空目录 我本地空目录为D:/shenghuojia 4.打开sourcetree,点击clone/new ,选择clone reposit ...
- Git之创建仓库并上传/更新项目版本
1.Git配置 使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名,每次提交记录里都会包含这些信息.使用git config命令进行配置: $ git config ...
- GIT的创建和使用
1.创建git文件模式 https://www.cnblogs.com/wupeiqi/p/7295372.html 参考地址 先看这个 初始化仓库 git init 在本地新建一个rep ...
- 菜鸟级的Git与GitHub使用总结(转)
菜鸟级的Git与GitHub使用总结 原创 2016年12月01日 14:58:30 1792 前言 这几天一直在折腾学习Git和GitHub的使用.几天下来,在网上查阅了大量的资料,总算有一些成果. ...
- 如何将git本地创建的项目推送到github仓库
除了集中式的版本控制系统CVS和SVN外,还有目前世界上最先进的分布式版本控制系统Git,它的创始人是创建了linux的大神 - linus.GitHub网站与2008年开始服役,为开源项目免费提供G ...
- Git创建仓库的方法(github翻译)
…通过命令行创建一个新的仓库 echo "# GitTest" >> README.md # 船舰一个说明文件,说明内容是 "# GitTest" ...
随机推荐
- 1052. Linked List Sorting (25)
题目如下: A linked list consists of a series of structures, which are not necessarily adjacent in memory ...
- OpenCV3.0 3.1版本的改进
摘要 OpenCV现在更新到了3.1版本,相对OpenCV2有了很大改进,其中对于硬件加速,移动开发(IOS,android)的支持成为亮点. 新版的OpenCV采用了内 ...
- JSP标签JSTL的使用(1)--表达式操作
单纯的使用jsp脚本来进行逻辑处理,显得代码很是杂乱.为了更加简洁也为了便于代码的阅读,于是JSTL应运而生. 库文件下载地址: 我自己上传的一份压缩文件,里面包含了所有需要的jar包,而且不需要积分 ...
- 使用UE4/Unity创建VR项目
一.主要的步骤是说一下使用UE4,在此之前先说一下使用unity创建的VR项目 1.unity创建oculus rift dk2项目 在unity中创建一个简单的场景,让摄像机能看见场景中的物体,不对 ...
- 分布式内存网格Hazelcast源码导读
去年项目需要看了hazelcast源码,当时记录的笔记. Node是节点的抽象,里面包含节点引擎.客户端引擎.分区服务.集群服务.组播服务.连接管理.命令管理.组播属性.节点配置.本地成员.tcp地址 ...
- Chapter 2 User Authentication, Authorization, and Security(9):防止登录名和用户查看元数据
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39003679,专题目录:http://blog.csdn.net/dba_huangzj ...
- SVN---搭建幸福之家
SVN百度百科对她这样进行阐述:SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从 ...
- 06_Android中ArrayAdapter的使用
1 目标界面 2 编写AndroidManifest.xml文件 <?xml version="1.0" encoding="utf-8"?> ...
- [WinForm]C# .net防止一个程序(WinForm)重复运行的方法。
最近比较忙,邮件预警系统暂停了没时间去处理,临时处理:直接执行exe文件! 可是问题来了: 我点击了两次,原来几乎在同时执行这个进程,我在程序中有线程时间睡眠2秒一次等待队列,打开进程果然两个MAIL ...
- javascript的介绍,实现和输出以及语法-javascript学习之旅(1)
javascript的介绍 : 1.javascript死互联网最流行的脚本语言,可用于web和html,并且可用于服务器,pc和移动端 2.javascript脚本语言: 1.是一种轻量级的脚本语言 ...