Git介绍


1.工作原理

Git是目前世界上最先进的分布式版本控制系统。

Workspace: 工作区
Index / Stage: 暂存区
Repository: 本地仓库
Remote: 远程仓库

2.SVN与Git的最主要的区别?

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

3.操作

$ git config --global user.name "ccpang"
$ git config --global user.email "ccpang96@163.com" git config --list //查看自己的配置
git config --global credential.helper store //配置客户端长期存储密码

git config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。

4.创建本地仓库

什么是本地仓库?

英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”

git init    把目录变成git可以管理的仓库。

5.把文件添加到本地仓库

git add readme.txt      将readme.txt文件添加到暂存区
git add -A 保存所有的修改
git add 保存新的添加和修改,但是不包括删除
git add -U 保存修改和删除,但是不包括新建文件
git add . 提交所有的文件夹
(index) git commit -m "提交readme.txt" 把文件提交到本地仓库(repository) git status 查看文件的状态 Untracked files 这种情况出现在新建几个文件(版本中不存在的),但是没有提交到暂存区的的时候
Changes not staged for commit 这种情况出现在版本已有文件遭到修改但是还没提交到暂存区的时候
Changes to be committed 这种情况出现在提交到暂存区之后的时候 //当文件被修改时,再次使用git status出现以下代码
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a") git diff readme.txt 查看文件修改了哪些内容
当使用上面这个命令或者其他命令以后,再输入命令,命令无法显示。
使用Backspace后退键删除光标前的所有内容,然后输入reset,然后回车
使用git log或者git diff后,如果命令很长,则使用q退出

6.版本回退

git log     从近到远的显示日志  

git log --pretty=oneline       从近到远显示日志 每个一行

git reset --hard HEAD~1     往上回退1个版本

git reset --hard HEAD~100   往上回退100个版本

cat readme.txt          查看readme.txt文件的内容

git reflog              查看提交的版本号 

git reset --hard xxxxxxx    恢复到某个版本

7.理解工作区(workspace)与暂存区(index)的区别

工作区:就是你在电脑上看到的目录,比如目录下Git里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。

本地仓库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。

我们前面说过使用Git提交文件到版本库有两步:

第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。

第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。

8.Git撤销文件操作

git checkout -- readme.txt         //丢弃未提交到暂存区的修改   即把在工作区做的修改全部撤销

9.删除文件操作

rm b.txt       删除b.txt

git check -- b.txt     没有commit之前,恢复b.txt文件

远程仓库


1.创建ssh密钥

本地Git仓库和github仓库之间的传输是通过SSH加密的,所以需要一点设置:

第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:

ssh-keygen -t rsa -C "ccpang96@163.com"

id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

存放路径:C:\Users\Administrator\.ssh
密码:*******

2.将本地Git仓库与远程仓库关联

git remote -v //查看git对应的远程仓库地址
git remote rm origin //删除关联对应的远程仓库地址
git remote -v //查看是否删除成功,如果没有任何返回结果,表示OK
git remote add origin https://github.com/ccpang96/LinuxGit.git //重新关联git远程仓库地址
git删除远程仓库文件
git rm –r –n --cached b.txt //加上-n并不会删除文件而是展示要删除的文件列表
git rm -r -- cached .history //删除文件history
git rm –r -- cached b.txt //实际删除 暂存区文件
git commit –m “删除b.txt”
git push origin master
当push的是空文件夹时,这是因为文件夹是从github上clone下来的,所以得先删除文件夹内的.git文件,
git remote add origin https://github.com/ccpang96/testgit.git
git push -u origin master
git查看本地仓库中的文件
git ls-files 查看文件状态
git status //查看文件状态 红色表示工作区中的文件需要提交 绿色表示暂存区的文件需要提交
git status –s //简化日志输出格式 git对比
git diff //查看工作区与暂存区的不同
git diff - -cached //查看暂存区与本地仓库的不同
git diff HEAD //查看工作区与仓库区的不同 git日志观察
git log //查看提交日志
git log - -oneline //简洁的日志
git push -f github master //强制push 从工作区提交文件到暂存区
git add 文件夹/ //添加整个文件夹及内容
git add –A //将工作区当前目录下的所有文件提交到暂存区
git add - -all //将工作区当前目录下的所有文件提交到暂存区 将文件从暂存区提交到本地仓库
git commit –m “提交说明” //将文件从暂存区添加到仓库区,生成版本号
git commit - - amend –m “提交说明” //修改提交说明 分支管理
git branch //查看分支
git branch –d 分支名称 //删除分支
git branch 分支名称 // 创建一个分支
git checkout 分支名称 //切换分支 在当前分支的任何操作都不会影响到其他分支,除非进行了分支合并
git checkout –b 分支名称 //创建并切换分支
git merge 分支名称//将其他分支的名称合并到当前分支 从远程仓库pull代码到本地
git pull --rebase origin master
git fetch origin master //获取远端的origin/master分支
git log –p master..origin/master //查看本地master与远端origin/master的版本差异
git merge origin/master --allow-unrelated-histories //合并远端分支origin/master到当前分支

使用 git push命令,实际上是把当前分支master推送到远程

由于远程库是空的,我们第一次推送master分支时,加上了 –u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在github页面中看到远程库的内容已经和本地一模一样了,上面的要输入github的用户名和密码如下所示:

从现在起,只要本地作了提交,就可以通过如下命令:

git push origin master

把本地master分支的最新修改推送到github上了,现在你就拥有了真正的分布式版本库了。

3.从远程库克隆

git clone https://github.com/ccpang96/testgit2          从远程库中将testgit2克隆到本地库

创建与合并分支


1.创建新的分支并合并

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

git checkout -b  dev    :表示创建并切换到dev分支上

相当于以下两条命令
git branch dev 查看分支,会列出所有分支,当前分支前会添加一个星号
git checkout dev 切换到dev分支上 git merge dev 将dev分支上的内容合并到master上 git branch -d dev 删除dev分支

在分支上对文件进行修改后,一定要add /commit,不然还只是一个本地文件。

当合并分支出现矛盾时(同时修改了文件):

Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,

fenzhi1 是指fenzhi1上修改的内容,我们可以修改下如下后保存:

git log         查看分支合并情况

2.分支管理策略

通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 –no-ff来禁用”Fast forward”模式。

首先我们来做demo演示下:

git checkout -b dev     创建一个dev分支

然后修改readme.txt内容,添加到暂存区。

切换回主分支(master)。 合并dev分支,使用命令

git merge -no-ff-m "注释(merge with no-ff)" dev           -no-ff表示禁用fast forward

分支策略:首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。

这样在dev上修改的东西,就可以合并到master上来了,可以用来push到仓库里。

3.bug分支


在开发中,会经常碰到bug问题,那么有了bug就需要修复,在Git中,分支是很强大的,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。比如我在开发中接到一个404 bug时候,我们可以创建一个404分支来修复它,但是,当前的dev分支上的工作还没有提交。比如如下:

git stash              把当前的工作现场隐藏起来,等以后恢复现场后继续工作

参考链接

1.https://www.zhihu.com/search?type=content&q=Git%E6%95%99%E7%A8%8B
2.https://juejin.im/post/5c2ecd3e6fb9a049ef26b6c4#heading-3

最新文章

  1. Backbone源码解析(六):观察者模式应用
  2. Python遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例
  3. [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式
  4. NYOJ题目198数数
  5. 【Prince2科普】Prince2七大主题之概论
  6. spring ioc DI 理解
  7. XTUOJ 1246 Heartstone 贪心
  8. 快速搭建MongoDB分布式集群
  9. python使用一个集合代替列表
  10. telnet模拟http訪问
  11. Scrollview中嵌套ListView(自定义组件解决)
  12. .Net Core在Ubuntu上操作MySql折腾实录
  13. Boolean 相关
  14. JS创建对象之原型模式
  15. Docker 网络部分的简单学习以及转帖别人的blog
  16. JavaScript 教程 之基础教程
  17. 详解基于朴素贝叶斯的情感分析及 Python 实现
  18. JS代码判断IE6,IE7,IE8,IE9
  19. Attr类中进行类型推断
  20. Mybatis 的配置xml和properties放在jar包以外的一种方法

热门文章

  1. MyBatis笔记二:配置
  2. jquery.cookie.js实现cookie记住用户名和密码
  3. 每天一个Linux常用命令 命令
  4. Android jniLibs下目录详解(.so文件)
  5. 说一下HTML5与传统HTML的区别
  6. android studio 设计任务内容和识别内容界面 (android stuido design task layout)
  7. 一键对centos7.6安装python3环境已经pip3
  8. 同源策略 - JSONP - CORS
  9. 快速求排列C(m,n)加取模
  10. 模拟+细节题——cf1236D