Git学习及使用
一、认知git理论
1.git出现的背景
版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。
举个例子
如果你毕业写过论文,那么你肯定遇见过这个问题,你的论文由于各种原因,不停的修改,最后导师还不满意,又要重新改,无穷无尽。
到最后,你发现这TM一堆乱七八糟的文件,里面到底写了啥,又不敢随便删除,怕删了修改了的重要内容。
当你写完后,还要U盘拷贝或者邮件发送,但是如果你又修改过,那么和导师的版本又不一样,这么令人发指的操作,是不是希望有一个软件,帮你记录文件变动的操作,同时还能一起操作,对于变动,只需要查看软件记录,就可以。这就是git诞生的初衷。
2.git简介
git是一个开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目。
集中式和分布式版本控制系统
集中式版本控制系统
版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制,典型代表SVN
缺点:
集中式版本控制系统最大的毛病就是必须联网才能工作。
受网络速度影响,网速慢提交也会很慢。
如果集中式版本服务器宕机了,所有人都没法工作。
分布式版本控制
分布式版本控制,没有中央服务器的概念,每个人都有自己的版本库,因此每个人在工作时候,不需要联网,版本库本地即可管理。
既然每个人都是一个完整的版本库,同事之间如果需要协作开发,就需要找一个用于“交换文件”的中央服务器,这个服务器不存在也不影响大家干活,只是用于交换文件内容。
GIT最强大的功能还有分支管理,远甩SVN等软件。
Git和SVN的区别
Git是分布式的,SVN是集中式的
Git把内容按元数据方式存储,而Git是按文件:所有的资源控制系统都市把文件的元信息隐藏在一个类似.svn,.cvs等文件夹里。
Git分支和SVN的分支不同:分支在SVN中就是版本库中的另外一个目录。
Git没有一个全局的版本号,SVN有。
Git的内容完整性优于SVN,Git内容存储使用的是SHA-1的哈希算法,能确保内容的完整性。
二、Git的安装
1.Git不同系统环境的安装
在 Linux 上安装
如果你想在 Linux 上用二进制安装程序来安装 Git,可以使用发行版包含的基础软件包管理工具来安装。 如果以Centos 上为例,你可以使用 yum:
sudo yum install git
如果你在基于 Debian 的发行版上,请尝试用 apt-get:
sudo apt-get install git
在 Mac 上安装
在mac安装git方式很多,最简单是用brew包管理
安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
brew install git
如果你想安装更新的版本,可以使用二进制安装程序。 官方维护的 OSX Git 安装程序可以在 Git 官方网站下载,网址为 http://git-scm.com/download/mac。
Windows安装
在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”--->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
2.Git运行前的基本配置
既然已经在系统上安装了 Git,你会想要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
/etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。 --local 当前仓库配置
用户信息配置
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:
$ git config --global user.name "ryxiong"
$ git config --global user.email "275310126@qq.com"
Git相关配置命令
git --version # 查看git版本
git config --system --list # 查看系统所有linux用户的通用配置,此命令检查/etc/gitconfig
git config --global --list # 查看当前linux用户的配置,检查~/.gitconfig文件
git config --local --list # 查看git目录中的仓库配置文件,.git/config文件
git config --global user.name "ryxiong" # 配置当前linux用户全局用户名,这台机器所有git仓库都会用这个配置
git config --global user.email "275310126@qq.com" # 配置当前linux用户全局邮箱
git config --global color.ui true # 配置git语法高亮显示
git config --list # 列出git能找到的所有配置,从不同的文件中读取所有结果
三、码云远程仓库的创建
远程仓库就是你用来提交代码的远程地址。这里演示码云的远程仓库建立
新建或者加入一个组织,就可以建立你自己的远程仓库。
远程仓库的建立流程如下
git添加远程仓库的操作流程如下
在本地仓库(也就是提交代码的文件夹下)右键 git bash here命令,弹出git命令窗口,执行如下命令为本地仓库连接远程仓库。
四、Git的详细使用
1.git工作流程
使用git就是将本地文件(工作目录workspace)的文件,添加到暂存区(stage),然后提交到本地仓库(repository),最终可以协同开发,推送到远程仓库(remote)
2.建立Git仓库
git版本库,也叫做git仓库(repository),也就是一个文件夹。
这个目录的所有内容被git软件管理,所有的修改,删除,git都会跟踪记录,便于可以跟踪历史记录,以后可以还原文件。
git管理本地仓库
切换到本地仓库的文件夹,右键git bash here
执行如下命令
git init # 初始化本地仓库,用git来管理这个文件夹
使用git init 后会在该文件夹下生成一个.git文件夹,那么.git文件夹中有什么呢?
[root@pyyuc ~/git_learning/mysite ::]#tree .git
.git
├── branches
├── config 这个项目独有的配置
├── description
├── HEAD head文件指示目前被检出的分支
├── hooks hooks目录包含服务端和客户端的钩子脚本 hook scripts
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index index文件保存暂存区的信息,只有git add之后才会生成,默认还没有这个文件
├── info info目录是全局性排除文件,用于放置不想被记录在.gitignore文件中的忽略模式(ignored patterns)
│ └── exclude
├── objects 存储所有数据内容
│ ├── info
│ └── pack
└── refs refs目录存储指向数据(分支)的提交对象的指针
├── heads
└── tags
.git文件结构
获取远程仓库代码
如果你想获取github上的代码,或者你公司gitlab私有仓库的代码,可以使用git clone命令,下载克隆远程仓库的代码。
git clone https://github.com/django/django.git
你会发现所有的项目文件都在这里,等待后续开发。
3.git记录更新到本地仓库
在工作文件夹的每一个文件,只有两种状态,一个是未跟踪,一个是已跟踪
已跟踪的指的是已经被纳入git版本管理的文件,在git快照中有他的记录
未跟踪的是这个文件既不在git快照中,也不在暂存区
git init初始化时的工作文件夹,都属于已跟踪了,后续的编辑操作都会标记为,已修改文件,因此需要将修改后的文件,加入暂存区,然后提交暂存区的文件。
检查文件状态
git status:此命令查看git工作目录的文件,处于生命周期的哪一个状态 注意,只能在git工作目录中输入这个命令,他会去找.git文件夹
如果没有修改,git status会看到此状态,没有任何东西需要提交
[root@pyyuc ~/git_learning/mysite ::]git status
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
说明当前工作目录很干净,所有的已跟踪文件,已经被提交且未更改。 此时处在master默认分支。
如果修改过文件,查看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")
上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
4.git常用流程
1.第一次使用初始化
这种场景针对远程仓库中没有代码的情况,也就是没有本地仓库中没有的代码;
选择一个作为本地仓库的文件夹,如D:git_project
git config --global user.name "ryxiong" # 初始化git服务密码
git config --global user.email "275310126@qq.com" # 邮箱,初始化git服务帐号 git init # 初始化git本地仓库,生成.git文件夹 git remote add orgin 远程仓库地址 # 本地仓库关联远程仓库
2.如果远程仓库的代码,本地没有,先拉远程代码到本地
这种场景是远程仓库中有你想要保留的代码,这些代码在本地仓库中没有,需要先执行一个命令,将远程仓库代码复制到本地。
git pull origin master # 将远程仓库的代码复制到本地 git config --global user.name "ryxiong" # 初始化git服务密码
git config --global user.email "275310126@qq.com" # 邮箱,初始化git服务帐号 git init # 初始化git本地仓库,生成.git文件夹 git remote add orgin 远程仓库地址 # 本地仓库关联远程仓库
3.收集、修改、删除代码后提交远程仓库
当远程仓库和本地仓库连接完成后,所有代码的收集、修改、删除都可以使用下面的一套流程来完成。
git status # 查看git操作状态
git add "提交文件名" . 表示目录下所有文件
git commit -m "注释" 提交任务
git push origin master # 推送远程仓库
5.给文件重命名
我们还是在git版本库中操作,修改main.py为mymain.py
mv main.py mymain.py
# 查看状态
git status
# 直接mv的操作,会被git记录为两个形容,一、删除原有文件、二、新建了mymain.py文件
# 此时新文件还未被跟踪,需要git add , git commit
# 原本的main.py还需要从暂存区删除
[root@pyyuc ~/mysite ::]git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: main.py
Untracked files:
(use "git add <file>..." to include in what will be committed)
mymain.py
no changes added to commit (use "git add" and/or "git commit -a")
git rm main.py 删除暂存区的main.py
git commit -m "mv mymain.py" 提交新的mymain.py
这样的步骤很麻烦,可以直接git mv 命令即可
刚才的mv记录,可以通过git log查看历史记录,已经提交的id
可以通过git reset 回退历史版本,回退到改名之前
[root@pyyuc ~/mysite ::]git log
commit f60fa7f1312843aa57edc9464192c9d891f23fb5
Author: pyyu <yc_uuu@.com>
Date: Sat Dec :: +
mv mymain.py
commit 65e0a2239909fd5aabc5928ec4431de3f163a195
Author: pyyu <yc_uuu@.com>
Date: Sat Dec :: +
echo main.py
# 回退到上一次commit版本,(注意这个命令,很危险,慎用)
git reset --hard 65e0a2239909fd5aabc5928ec4431de3f163a195
--hard # 清空暂存区和工作目录资料
改名最正确的姿势
git mv main.py mymain.py
git commit -m "mv mymain.py"
6.Git保存提交记录
当你的代码写好了一部分功能,就可以保存一个"存档",这个存档操作就是git commit,如果代码出错,可以随时回到"存档"记录
查看"存档"记录,查看commit提交记录的命令 git log
git log命令显示,从最新的commit记录到最远的记录顺序。
git log --oneline 一行显示git记录
git log --oneline --all 一行显示所有分支git记录
git log --oneline --all - --graph 显示所有分支的版本演进的最近4条
git log - 显示最近4条记录
git log --all 显示所有分支的commit信息
git branch -v 查看分支信息
git help --web log 以web界面显示log的参数
7.git版本回退,回到过去
git log # 可以查看历史版本记录
git reset --hard # 命令可以回退版本
git reset --hard HEAD^ # 回退到上个版本
HEAD # 表示当前版版本
HEAD^ # 表示上个版本
HEAD^^ # 上上个版本
也可以直接git reset --hard 版本id号
五、git分支
1.git分支是什么
2.为什么用git分支
假设你要开发一个同性在线交友的网站,这个写代码的工作进行分配,分给两个小弟进行功能开发,一个是alex分支,一个是egon分支,他俩自己的分支别人看不到,当他俩代码写完后,合并到master主分支上,这样既保证主代码的安全,又能协同开发,互不影响。
3.git分支实战
git branch 分支名linux 创建分支linux
git checkout 分支名linux 切换分支到linux
git branch 查看当前分支情况,在哪一个就有*符
git check -- filename 一键还原文件,将git仓库的文件覆盖当前文件,危险命令
git checkout -b name 创建+切换新的分支
练习
创建linux分支,提交代码
git branch linux
git checkout linux
touch first.py
git add first.py
git commit -m “fenzhi linux commit v1”
此时切换回master分支,发现没有first.py文件
自动合并分支到master
git checkout master
git branch
git merge linux 合并linux分支到master分支
合并完最好删掉无用的分支
git branch -d linux
自动合并可能会出现冲突报错,需手动解决冲突,解决自己想要的内容
对同名同目录的同一个文件操作,修改同一行数据就会冲突
git checkout master
echo “master” >> readme
git commit -a -m “master commit “ 提交代码到master仓库
切换到linux分支,此时已经看不到master主干的代码修改
git checkout linux
echo “linux” >> readme
git commit -a -m "linux commit”
git checkout master 此时查看文件内容,应该只有master,并没有linux
git merge linux 合并linux分支的代码,发现有一行冲突(both modified),
master与linux字符串,手动修改后重新提交
git commit -a -m "master merge commit” 提交本地代码到代码仓库
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。
Git学习及使用的更多相关文章
- Git 学习看这篇就够了!
Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 可能新手会问"git和github有什么关系啊?" git是一个版本控制工具: githu ...
- Git学习笔记与IntelliJ IDEA整合
Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...
- git学习之branch分支
作为新手,站在我的角度肤浅的来理解,分支就是相当于开辟了一个新的临时工作区,在这个工作区进行文件代码改动,然后在合并到master主工作区,这样能保证主工作区的安全性和稳定性,对于团队协作尤为重要. ...
- git学习手册
#git学习手册 git: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 Linux内核开发而 ...
- Git学习笔记(10)——搭建Git服务器
本文主要记录了Git服务器的搭建,以及一些其他的配置,和最后的小总结. Git远程仓库服务器 其实远程仓库和本地仓库没啥不同,远程仓库只是每天24小时开机为大家服务,所以叫做服务器.我们完全可以把自己 ...
- Git学习笔记(四)
一.忽略特殊文件 在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件. 不需要从头写.gitignore文件,GitHub已经为我们 ...
- git 学习笔记6--remote & log
git 学习笔记6--remote & log 创建SSH Keys ssh-keygen -t rsa -C "1050244110@qq.com" 本地关联远程 git ...
- Git学习(4)基本操作
1.版本提交 首先,接着上个Git学习(3)继续 我们先修改test.txt文本内容,增加一些信息进去,然后保存: Add a new data 第一步:运行命令 git status 命令查看文件是 ...
- git学习(这个我没有整理,是我不断在学习的过程中,自己总结的,对象是我,不过有问题的,我们可以相互交流)
每次git提交,都会有一个parent指针,指向上一次的commit , 如果合并,master就和hotfix河道一起,就直接删除hotfix就OK 此时,虽然操作一样,大底层实现不一样 ...
- git学习笔记01-git最基本的工作原理分布式
git学习的网站 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 --廖雪峰老师 ...
随机推荐
- WebServiceBinding属性
属性 类型 读 写 说明 ConformsTo Wsiprofiles x x 绑定需要遵守的WS-I标准 EmitConformanceClaims Boolean 如果为true,当WSD ...
- java_第一年_JavaWeb(14)
EL :EL表达式主要用于获取数据.执行运算.获取对象.调用java方法: 获取数据 语法:"${标识符}" 会调用pageContext.findAttribute方法,从pag ...
- 中标麒麟系统安装rpm文件
打开终端,获得su权限. cd到rpm所在文件夹,输入指令,rpm -ivh rpm的名称
- CSRF verification failed. Request aborted.错误解决办法
在Django项目的页面,提交form表单POST请求时,会出现报错:CSRF verification failed. Request aborted. 需要在form表单中加:{% csrf_to ...
- 解决 vue-cli构建项目自动打开浏览器问题
1.打开项目下的config/index.js 2.找到module.exports的 dev下的 autoOpenBrowser ,将 false 改成 true 3.控制台输入:npm run d ...
- idea旗舰版续命
首先鼓励大家使用正版!我一直用的是免费的社区版,但发现有一些功能被阉割了,比如weblogbic就不支持,无奈现在的项目要用到这个,只能去下载旗舰版. 旗舰版需要付费,作为程序员的我为了一个临时的项目 ...
- ZYNQ系列
赛灵思公司(Xilinx)推出的行业第一个可扩展处理平台Zynq系列.旨在为视频监视.汽车驾驶员辅助以及工厂自动化等高端嵌入式应用提供所需的处理与计算性能水平. 中文名 ZYNQ系列 开发商 赛灵 ...
- Taro -- 获取用户手机号
1. 安装 Taro 脚手架工具 安装 Taro 开发工具 @tarojs/cli 使用 npm 或者 yarn 全局安装 $ npm install -g @tarojs/cli $ yarn gl ...
- Linux性能优化从入门到实战:08 内存篇:内存基础
内存主要用来存储系统和应用程序的指令.数据.缓存等. 内存映射 物理内存也称为主存,动态随机访问内存(DRAM).只有内核才可以直接访问物理内存. Linux 内核给每个进程都提供了一个独立的 ...
- window 批处理脚本获取上级目录
1 SET CurrDir=%CD% CD.. SET InstPath=%CD% CD %CurrDir% 2 pushd.. set parent=%cd% popd 参考: https://ms ...