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

linux下设置Git的更多相关文章

  1. linux下设置git代理访问.

    有时候克隆仓库巨慢无比,需要设置代理. 一般情况下 proxychains 可以搞定的. 但是某些情况,如go 安装模块的时候是调用git的.这个时候proxchains就不行了. go 也可以通过设 ...

  2. linux下设置 git ssh 代理

    /root/.ssh (以下为 root权限的操作) 1. 生成key. $ ssh-keygen 一路回车,直到生成 id_rsa, id_rsa.pub 1.1 chmod 400 id_rsa. ...

  3. Linux下Jenkins+git+gradle持续集成环境搭建

    Linux下Jenkins+git+gradle持续集成环境搭建 来源:IT165收集  发布日期:2014-08-22 21:45:50 我来说两句(0)收藏本文   一.项目介绍 和 linux ...

  4. 【转】在Linux下搭建Git服务器

    在 Linux 下搭建 Git 服务器 环境: 服务器 CentOS6.6 + git(version 1.7.1)客户端 Windows10 + git(version 2.8.4.windows. ...

  5. linux下解决git clone太慢

    此教程同样也适用与vscode下载太慢的问题 git和vscode会自动使用http_proxy,https_proxy环境变量的代理,所以我们只需要设置这个环境变量即可 前提 需要一个可用的代理,这 ...

  6. ***Linux下使用git命令及github项目

    在linux下搭建git环境1.创建Github账号,https://github.com2.Linux创建SSH密钥: ssh-keygen  ##一直默认就可以了 3.将公钥加入到Github账户 ...

  7. Linux下设置网卡静态ip

    Linux下设置网卡静态ip 如果是服务器版,没有图形界面只用用命令行修改配置文件 如果是客户端版本,可以用图形界面 配置的前提是要在root用户下才能重启网卡服务 图形界面: system-conf ...

  8. Ubuntu Linux下设置IP的配置命令

    Ubuntu Linux下设置IP的配置命令 今天装了Ubuntu,但是发现不能上网,开始排查问题: 1.首先确定网络连接是否正确,所用的网线是否可以正常工作 2.查看网卡是否能正常工作,检测的方法如 ...

  9. 环境部署(三):Linux下安装Git

    Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理,是目前使用范围最广的版本管理工具. 这篇博客,介绍下Linux下安装Git的步骤,仅供参考,当然,还是yum安装 ...

随机推荐

  1. Pytest 通过文件名类名方法执行部分用例

    • 场景:只执行符合要求的某一部分用例,通过类与方法的命名实 现.通常编写测试方法时 • 解决:直接输入文件名,类名 pytest test_class_01.py • pytest -v -s te ...

  2. Python之字符串正则匹配

    需求: 正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配(因为是贪婪匹配 ). 而你想修改它变成查找最短的可能匹配. import re text2 = 'Computer says &q ...

  3. 解决.Net MVC 中出现 非介入式客户端验证规则中的验证类型名称必须唯一。下列验证类型出现重复: required 的bug

    最近在开动科技创新作品的开发,出现了一个让人很烦恼的错误,每次从浏览页跳转到编辑页时就会出现一下错误 非介入式客户端验证规则中的验证类型名称必须唯一.下列验证类型出现重复: required 上一下出 ...

  4. ElasticSearch中分词器组件配置详解

    首先要明确一点,ElasticSearch是基于Lucene的,它的很多基础性组件,都是由Apache Lucene提供的,而es则提供了更高层次的封装以及分布式方面的增强与扩展. 所以要想熟练的掌握 ...

  5. texindex - 对 Texinfo 索引文件排序

    SYNOPSIS 总览 texindex [OPTION]... FILE... DESCRIPTION 描述 为每个 Tex 输出文件 FILE 产生一个已排序的索引.通常对于文档 `foo.tex ...

  6. 三重循环之break

    while(1) { while(1) { while(1) { break; } } } //逻辑堪比绝技啊 脑洞开之注册表循环遍历方法

  7. C++中创建对象的时候加括号和不加括号的区别(转)

    c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...

  8. python使用xlrd读取excel数据

    一.安装xlrd 库的安装我这里就不说了.. 二.读取 excel 前提条件:excel文件名称为 excel_data.xlsx 1.打开excelw 文件 workbook = xlrd.open ...

  9. rest framework的框架实现之 (版本,解析器,序列化,分页)

    一版本 版本实现根据访问的的方式有以下几种 a : https://127.0.0.1:8000/users?version=v1  ---->基于url的get方式 #settings.pyR ...

  10. Python删除文件夹

    import os os.rmdir('OS-Demo-2') os.removedirs('OS-Demo-3/sub-Dir-1') os.removedirs()会自动将上一级文件夹也删除,谨慎 ...