Git分布式版本控制工具
一、安装Git
1、下载Windows版的Git:msysgit;官方下载地址:http://msysgit.github.io,安装选定要安装的目录(路径杜绝中文),剩下的按照默认安装即可,参考:GIt安装教程 。
2、安装完成后,在开始菜单里找到“Git”->“Git Bash”,弹出一个类似命令行的窗口;或是在CMD命令提示符下,输入git回车可以看到很多提示,就说明Git安装成功!
3、初始化目录 生成隐藏文件 .git 负责版本的保存
mu@mu-PC MINGW64 /c/guotianbao
$ git init
Initialized empty Git repository in C:/guotianbao/.git/
4、安装完成后,因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址,在命令行输入:
mu@mu-PC MINGW64 /c/guotianbao (master)
$ git config --local user.name 'guotianbao' mu@mu-PC MINGW64 /c/guotianbao (master)
$ git config --local user.email 'gmu1592618@gmail.com'
二、常用命令
1.基本命令
-1.查看状态
$ git status //查看工作区状态
$ git diff //若git status提示有文件被修改,则可执行此命令查看修改的内容
执行git status命令会看到两部分,上边是文件提交的暂存区,下边是文件所在的工作区;在当前工作区,而没有提交到暂存区的文件颜色是红色的,提交到暂存区的文件是绿色的,如果工作台面是干净的话,证明所有文件已提交到仓库。
-2.提交数据
$ git add . #提交所有文件
$ git commit -m "自定义提交信息" #提交注释
$ git add . 把文件从工作区提交到暂存区
$ git commit 把暂存区的所有内容提交到当前分支(仓库)
-3.查看文件信息
$ git ls-tree head #查看版本(分支)中所有的文件
$ git ls-files -s #查看暂存区和版本中所有文件的详细信息
$ git ls-files #仅查看所有的文件名
-4.查看所有日志
$ git log //显示操作日志
$ git log --pretty=oneline //显示精简信息
$ git reflog //查看所有的日志
-5.回滚版本
#方式一: (三步操作)
$ git reset --soft 版本号 #从分支回到暂存区
$ git reset head 文件 #从暂存区回到修改过的内容
$ git check out 文件 #从修改过的文件到原文件
#方式二: (两部步操作)
$ git reset --mix 版本号 #从分支回到修改过的内容 == git reset 版本号
$ git check out 文件 #从修改过的文件到原文件
#方式三: (一部步操作)
$ git reset --hard 版本号 #从分支回到原文件
-6.删除文件
$ git rm test.txt
$ git commit -m "remove test.txt"
2. 场景案例模拟
示例一:
1. 创建msg.py 写入短信功能代码并提交到分支
mu@mu-PC MINGW64 /c/guotianbao (master)
$ git add . mu@mu-PC MINGW64 /c/guotianbao (master)
$ git commit -m '开发短信功能'
[master (root-commit) 99afeac] 开发短信功能
1 file changed, 1 insertion(+)
create mode 100644 msg.py
2.回滚到无短信功能的版本
mu@mu-PC MINGW64 /c/guotianbao (master)
$ git log
commit 99afeacb8e856c7c4fd66cde1d633923703775f7 (HEAD -> master)
Author: guotianbao <gmu1592618@gmail.com>
Date: Sat Nov 4 08:09:18 2017 +0800 开发短信功能 mu@mu-PC MINGW64 /c/guotianbao (master)
$ git reset --hard 99afeacb8e856c7c4fd66cde1d633923703775f7
HEAD is now at 99afeac 开发短信功能
3.直接再次回滚到有短信功能的版本
mu@mu-PC MINGW64 /c/guotianbao (master)
$ git reflog
99afeac (HEAD -> master) HEAD@{0}: reset: moving to 99afeacb8e856c7c4fd66cde1d633923703775f7
39b29ba HEAD@{1}: commit: 增加aaa
99afeac (HEAD -> master) HEAD@{2}: reset: moving to 99afeacb8e856c7c4fd66cde1d633923703775f7
99afeac (HEAD -> master) HEAD@{3}: commit (initial): 开发短信功能 mu@mu-PC MINGW64 /c/guotianbao (master)
$ git reset --mix 39b29ba
Unstaged changes after reset:
M msg.py mu@mu-PC MINGW64 /c/guotianbao (master)
$ git checkout msg.py # 底下两部操作等于 git reset --hard 版本号
git reset --mix 版本号
git checkout 文件名
示例二:
stash 将工作区做的所有修改(做到一半的操作)保存到一个临时地方
#- 正在写代码(a.txt),发现线上代码(a.txt)有bug,先把现在代码保存到临时空间
#- 修改完bug(a.txt)提交,再次取回之前保存的文件,这时发现之前保存的代码和提交的bug是同一个文件,有冲突
#- 这时(a.txt)中两者都保留,手动保留想要的代码,再次提交
#临时保存现在写的代码
git stash #去修改出现bug再次提交
bug....# 解决bug的过程
git add .
git status
git commit -m "修改完bug"
git status #切回之前保存的状态 git stash pop
-如果修改的文件和保存的文件是同一个文件,则此文件中会保留两者的代码,需手动改回自己需要的代码
- 如果不是同一个文件,则直接提交
git stash pop
git add .
git status
git commit -m "bug上又一次修改"
具体过程
3.分支
dev #负责开发新功能
bug #负责修复线上的bug
master #线上代码
###分支 #dev分支
git branch #查看所有分支
* master #前面有*号代表是当前分支 git branch dev #创建dev分支 git branch #查看所有分支
dev
* master #前面有型号代表是当前分支 git checkout dev #切换到dev分支 git branch
* dev #当前分支
master #bug分支
git branch bug #给master创建一个bug分支
git branch #查看当前分支
bug
dev
* master #当前所在分支 git checkout bug #切换到bug分支
git branch
* bug
dev
master #修改完bug 把bug分支和master合并
git checkout master #切换到master分支,然后合并bug分支
git merge bug # 删除分支
git branch -d bug #只删除完成合并之后的dev分支
git branch -D bug #强制删除dev分支
创建、合并、删除分支
4.远程仓库
由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要如下设置:
第1步:创建SSH Key。在用户主目录下(例如:C:\Users\Administrator\),看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen.exe //创建SSH key 【公钥和私钥,连接省却了用户名密码的输入】git窗口下,直接执行ssh-keygen.exe,默认往下执行,然后把公钥复制到github上
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“settings”,“SSH and GPG Keys ”页面,然后,点“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,最后点击“Add Key”按钮完成。
说明:为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。
假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
添加远程仓库
1、登录GitHub网站,并按网站要求创建一个新的仓库;
2、根据GitHub网站提示,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
3、本地仓库与GitHub上相应的仓库建立关联,代码如下:(git@github.com:tianbaoo/test.git为我新建的仓库路径)
$ git remote add origin git@github.com:tianbaoo/test.git
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
4、把本地库的内容推送到远程库上,用git push命令,实际是把当前分支master推送到远程。
$ git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令(不用带-u参数)。当然也可以不写!就需要你手动输入yes
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告,这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
5、通过GitHub上的仓库来克隆出新的本地仓库(可以在任意一个文件夹下,建议最好在一个固定的盘下方便于管理),要克隆一个仓库,首先必须知道仓库的地址,然后使用 git clone命令克隆从远程库克隆到本地(说白了就是下载版本库)。代码如下:
$ git clone git@github.com:tianbaoo/test.git //应用场景:切换办公地点:家和公司,第一次都能从远程库上克隆然后进行开发!
注意点:执行clone命令,实质上内部已经完成了初始化git库和本地与远程库连接的过程(内部config文件,已写好命名,同时远程库名字默认为origin)!
也许还注意到,GitHub给出的地址不止一个,还可以用 https://github.com/tianbaoo/test.git 这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
本地和远程仓库
#本地代码推送到远程仓库
git remote add origin git@github.com:tianbaoo/test.git #设置远程仓库并设置别名origin
git checkout master #把当前分支切换到master分支
git push origin master #推送到master分支 #从远程仓库拉代码
git clone git@github.com:tianbaoo/test.git
cd test/
git branch #只下载master分支
#* master
git branch -a #查看所有分支 有远程的分支
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
git branch dev origin/dev #拉远程分支的代码
git branch
dev
* master
常用命令
现实场景:
在公司进行开发代码,代码没有写完,想要回家加班继续写,然后应该把公司的代码push到服务器上
$ git remote add origin https://github.com/tianbaoo/test.git #给自己的远程库起origin别名 $ git checkout master # 切换到master分支
$ git push origin master # 把master分支推送到GitHub上
回到家以后先把代码clone下来,进行修改后,再push到远程仓库上
$ git clone https://github.com/tianbaoo/test.git #去GitHub上把代码复制下来 $ cd test/ #进入test文件夹 $ git branch dev origin/dev #创建一个跟远程仓库同名的dev分支
$ git checkout dev #切换到dev分支下 #写代码. . .
. . .
. . . $ git add . #加到暂存区
$ git commit -m '自定义提交信息' #加到分支
$ git push origin dev #把dev分支提交到远程仓库orgin
公司:
git checkout dev
#选其中一个
git fetch origin dev #从远程拉到本地的仓库 还需要 git reset --hard 文件
git pull origin dev #从远程拉到原文件 #----------提交成功完成-----------
功能11
git add .
git commit ...
git push origin dev
#----------忘记提交,下班回家-------
功能12:
git add .
git commit ...
git push origin dev
回家:
git branch dev
git pull origin dev
功能13:
git add .
git commit ...
git push origin dev #现在处于功能12没有提交的状态
#先拉代码查看功能13和功能12是否有冲突,如果有冲突,手动修改 不能直接提交
公司:
获取代码,
git pull origin dev 无冲突:过
有冲突:
手动解决
git add .
git commit -m '解决冲突'
后续
情景:
第一步:在github上创建项目myblog,然后本地在blog目录下启动GIT执行命令git init
第二步:git add . 然后再次 git commit -am "第一次提交项目"
导致github上的版本里有文件和本地版本冲突,下面给出冲突原因:
$ git push -u origin master
Username for 'https://github.com': tianbaoo
To https://github.com/tianbaoo/myblog.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/tianbaoo/myblog.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
解决方法:
git push -u origin master -f
上述问题仅会在第一次提交可能出现。
重点:对于多人协调开发时,提交也可能会出现冲突,因为别人可能已经比你更快的提交了,此时你只能把远程的克隆下来,合并,解决冲突后再提交
git工作的一般流程:http:
/
/
blog.csdn.net
/
javyzheng
/
article
/
details
/
50311175
Git分布式版本控制工具的更多相关文章
- it入门之:学会使用Git 分布式版本控制工具
环境:window 工具:git & TortoiseGit 下载安装以及配置环境变量 :略略略 创建Github账户:登录https://github.com/用自己的常用邮箱创建账户,用来 ...
- 痞子衡嵌入式:备受开源社区推崇的分布式版本控制工具(Git)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是分布式版本控制工具Git. 1.为什么需要版本控制系统? 单人软件项目开发过程,往往很多功能都是逐步增加的,在代码开发过程中,有的时候功 ...
- 分布式版本控制工具:git与Mercurial(zz)
分布式版本控制工具:git与Mercurial [收藏此页] [打印] 作者:cyfdecyf 2007-12-26 内容导航: 第1页 [IT168 技术文档] 说到版本控制工具,很 ...
- 开源分布式版本控制工具 —— Git 之旅
Git 主张的分布式代码库与文件快照的设计思想,相对于传统 CVS.SVN 等集中式.文件差异式版本控制工具是一种挑战与颠覆.Git 带来了离线提交.轻量级分支等诸多便利.不过,也有人质疑 Git 的 ...
- Git分布式版本控制教程
Git分布式版本控制Git 安装配置Linux&Unix平台 Debian/Ubuntu $ apt-get install git Fedora $ ) $ dnf and later) G ...
- git分布式版本控制玩法
git分布式版本控制玩法 Git distributed version control play github的配置安装步骤:1.下载git bash(从http://www.git-scm.com ...
- Git 分布式版本控制的常见命令
Git 的作用: (1)方便多人协同开发; (2)方便版本控制 Git 分布式版本控制的主要区域及命令图,下面会详细讲解: 创建项目并将切换至项目目录下 1. 创建本地仓库: git init ...
- 复习宝典之Git分布式版本控制
查看更多宝典,请点击<金三银四,你的专属面试宝典> 第三章:Git分布式版本控制 1)git文件状态 git中的文件有以下几种状态: 未跟踪(untrack):表示文件为新增加的. 已修改 ...
- 分布式版本控制工具Git
一.Git技术简介 Git是一个分布式版本控制系统,与集中式的SVN不同. 1. 主要特点 集中式特点: 所有人的资源全部保存在中央服务器. 所有人开发前都需要从中央服务器上下载同步其他人的代码才能继 ...
随机推荐
- 【c++】面向对象程序设计之关于继承
面向对象程序设计的核心思想是数据抽象(类的接口与实现分离).继承和动态绑定 基类 虚函数:基类希望派生类各自定义适合自身的版本的函数 在c++中,当我们使用基类的引用或指针调用虚函数时将发生动态绑定. ...
- 转: Code Review 程序员的寄望与哀伤
转自: http://www.cnblogs.com/mindwind/p/5639008.html 一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产 ...
- [Tools] Convert SVG to a PDF in Node with PDFKit and SVG.js
Given a epxress application and an svg template, we want to draw some text, date onto it and convert ...
- QVector的内存分配策略
我们都知道 STL std::vector 作为动态数组在所分配的内存被填满时.假设继续加入数据,std::vector 会另外申请一个大小当前容量两倍的区域(假设 n > size 则申请 n ...
- c语言-01背包问题
01背包问题 问题:有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 分析: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选 ...
- 编资源bundle时图片文件变成tiff的解决方法
一般,编写SDK的时候,如果SDK还带了一些资源文件,那么最理想的是将资源文件也打包成为bundle给应用方一起使用.而在编资源bundle时,有时会发现编译好后的图片文件从png转成了tiff,这样 ...
- Android 平板中 自己定义键盘(popuwindow) 居于屏幕左下方 仿微信的password输入界面
之前博客中,介绍过使用谷歌提供的键盘的一些api,能够非常好地自己定义键盘,參考我之前的博客链接:android 自己定义键盘 ,这个有一个局限性,仅仅能占满屏幕,无法做到仅仅能占一部分的 ...
- OpenStack Live Migration
About live migration of KVM virtual machines with NFS storage, from Mirantis blog: click this link w ...
- this、call和apply、bind
this关键字: JavaScript的this关键字,总是指向一个对象,具体指向哪个对象,是根据运行时函数指向环境动态绑定的.简单来说,this就是谁调用指向谁.具体使用中,this的指向,大致可以 ...
- angularjs开发常见问题-2(angularjs内置过滤器)
在angular中内置了几个经常使用的filter,能够简化我们的操作. 过滤器使用 '|' 符号,概念有点相似于linux中的管道. 1.filter (过滤) filter能够依据条件过滤数据.样 ...