版本控制——Git 使用笔记,以及Windows搭建Git服务器

Git和Github的关系

链接:http://www.zhihu.com/question/21907548/answer/95284202

来源:知乎

Git是一款免费、开源的分布式版本控制系统

Github是用Git做版本控制的代码托管平台

相当于本地、公司服务器、Github网站服务器都装Git做版本控制,只不过Github的服务器强大些,对全球用户托管的项目用Git做版本控制!

正是由于Github用Git做版本控制,所以可以轻松的记录项目的变迁史,然后有了下图

git是一张弓,github是靶子,你的源代码是箭

前言

实验室的项目需要用到一个版本管理系统进行管理,鉴于Git如此风靡,所以正好拿来用,顺便学习一下。一下是Git学习的笔记,大部分内容来自廖雪峰的Git教程

为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。所以一切操作几乎都是在一瞬间完成的。

集中式VS分布式

集中式版本控制系统,版本库是集中存放在中央服务器的。所有的修改都要经过中央服务器。

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库。

Git的特点就是,没有中央服务器,大家都是中央服务器

创建版本库

初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:

  1. 第一步,使用命令git add <file>,可反复多次使用,添加多个文件;
  2. 第二步,使用命令git commit,完成。

查看状态

要随时掌握工作区的状态,使用git status命令。

如果git status告诉你有文件被修改过,用git
diff
可以查看修改内容。

版本回退

HEAD指向的版本就是当前版本(HEAD指向当前的分支)

因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

返回过去,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

工作区VS版本库VS暂存区

  • 工作区(Working Directory):就是你在电脑里能看到的目录
  • 版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  • 暂存区(stage) : 版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

git add命令实际上就是把要提交的所有修改放到暂存区(Stage)

执行git commit就可以一次性把暂存区的所有修改提交到分支。

Git跟踪的是修改,每次修改,如果不add到暂存区,那就不会加入到commit中。

撤销修改

  • 还没有git add到暂存区的代码

    git checkout 从暂存区或者版本库签出(取消工作区代码),例:git
    checkout -- readme.txt

  1. 暂存区有代码,签出暂存区代码
  2. 暂存区没代码,签出版本库代码
  • 已经添加到暂存区的代码,git reset HEAD readme.txt

    再用checkout命令

  • 已经commit的代码

    在推送到远程版本库之前切换版本,git reset --hard 版本号

  • 删除文件(删除也是一个修改操作)

    git rm用于删除一个文件(类似于git add将更改放到暂存区)

    git commit 提交

github远程仓库

提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库

生成ssh密钥

1
ssh-keygen -t rsa -C "[email protected]"

生成ssh 公钥和私钥

关联远程库

1
git remote add origin [email protected]:path/repo-name.git

推送

使用命令git push -u origin master第一次推送master分支的所有内容,每次本地提交后,只要有必要,就可以使用命令git
push origin master
推送最新修改;

克隆

1
git clone [email protected]:michaelliao/gitskills.git

分支管理

Git用master(主分支)指向最新的提交,再用HEAD指向当前分支

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

解决冲突

[email protected] ~/learngit (master|MERGING)

相当于另外创建了一个分支,保存冲突,提交时以这个分支为准

分支策略

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以

修复bug,保存现场状态

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git
stash pop
,回到工作现场。

git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。

新的feature分支

开发一个新feature,最好新建一个分支;

如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

多人协作工作

实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin

试图推送:可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示no tracking information

说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

标签管理

发布一个版本时,我们通常先在版本库中打一个标签。标签也是版本库的一个快照

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

查看所有标签git tag

新建标签git tag <name>,默认为HEAD,也可以指定一个commit id;

指定标签信息,git tag -a <tagname> -m "blablabla..."

用PGP签名标签,git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;

推送一个本地标签git push origin <tagname>

推送全部未推送过的本地标签git push origin --tags

删除一个本地标签git tag -d <tagname>

删除一个远程标签git push origin :refs/tags/<tagname>

忽略特殊文件

问题

有些时候,必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件,每次git status都会显示“Untracked files …”

解决办法

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

忽略文件的原则是:

  • 忽略操作系统自动生成的文件,比如缩略图等;
  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

配置别名

git config --global alias.st status设置st为status的别名

1
git config --global alias.lg "log --color --graph --pretty=format:‘%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset‘ --abbrev-commit"

在windows下复制版本库

注意路径

1
git clone [email protected]:c:/GitProject/testrepo

git init VS git init –bare

git init初始化的版本库用户也可以在该目录下执行所有git方面的操作。但别的用户在将更新push上来的时候容易出现冲突。

使用git init –bare方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This
operation must be run in a work tree”)

这个就是最好把远端仓库初始化成bare仓库的原因

在裸仓库中只能切换分支,不能合并分支

Windows上搭建Git服务器

需要的软件

首先你要有一个git环境。git 是分布式版本管理软件,大家都是服务器,大家都是客户端,所以客户端和服务器的安装文件是一样的。

Git支持ssh和http,所以我们要想在git服务器和客户端之间通信通过ssh,就需要再windows server下面安装一个ssh服务器,能够处理ssh请求。COPSSH是一个windows下的SSH服务器,可以远程管理电脑系统。

TortoiseGit 是git的图形化管理工具。如果对git命令行比较熟悉,可以不用安装。

在Server上安装msygit

下一步,下一步,下一步

在Server上安装ssh服务器

安装CopSSH软件

下一步,下一步,下一步

配置用户

添加系统的administrator用户到SSH服务器当中,之后git需要通过这个用户才能访问。

设置了密码验证,公钥验证

在使用github连接远程仓库的时候我们需要用到命令:

git remote add origin [email protected]:michaelliao/learngit.git

[email protected]是远程地址,我们连接自建的server要改成[email protected]这样就能够识别远程仓库地址和我们要使用的用户,后面:path要改成我们git仓库的地址,稍后有例子。

配置COPSSH的安装目录

COPSSH获得了ssh请求,如何才能调用git命令呢,需要:

  1. 将Git安装目录yourpath\Git\libexec\git-core文件夹下的git-upload-pack.exegit.exegit-receive-pack.exegit-upload-archive.exe这4个文件复制到SSH的安装路径1yourpath\ICW\bin1下。
  2. 将Git安装目录yourapth\Git\bin\libiconv-2.dll复制到yourpath\ICW\bin下。

    这样COPSSH就可以帮我们调用git命令了

    测试连接

    本地打开gitbash,ssh连接服务器:ssh [email protected]

    输入administrator的密码后就通过ssh远程连接到了服务器上,在这上面可以通过git命令做操作。

建库操作

使用通过ssh远程登录的账户调用git命令建库

关于裸库

git init初始化的版本库用户也可以在该目录下执行所有git方面的操作。但别的用户在将更新push上来的时候容易出现冲突。

使用git init –bare方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This operation must
be run in a work tree”)

这个就是最好把远端仓库初始化成bare仓库的原因。

在裸仓库中只能切换分支,不能合并分支

远程clone,push,pull

clone

在本地打开gitbash,输入

git clone [email protected]:yourpath/testrepo

认证身份

服务器怎么知道clone,push的人的身份呢,COPSSH使用了系统用户的密码,在我们clone的时候,需要输入administrator的密码,这样就完成了身份验证,并不需要把我们本地的公钥加入的COPSSH用户的公钥当中。

1
$ git clone [email protected]:yourpath/testrepo
Cloning into ‘testrepo‘...
[email protected]‘s password:
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

克隆的过程是,克隆过来整个版本库,包括远程的各个分支,在本地创建master分支,把远程的master分支内容克隆到本地的master分支上。

所以我们克隆过来的是master分支,如果我们想获远程取别的分支上的内容,如dev:

git branch -a获取所有分支内容

1
$ git branch -a
* (detached from origin/dev)
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev
  remotes/origin/master

git checkout -b dev remotes/origin/dev新建dev分支,内容来自remotes/origin/dev

push

git push origin dev

推送当前的分支到远程的dev分支

pull

git pull origin dev

含义是获取远程dev分支上的内容到本地工作的分支。

所以也可以通过

  1. 在本地创建dev分支

    git checkout -b dev

  2. 拉取远程dev分支的内容

    git pull origin dev

    来获取远程dev分支的内容到本地dev分支

    TortoiseGit

    客户端软件,图形化界面,下一步即可。

时间: 04-15

版本控制——Git 使用笔记,以及Windows搭建Git服务器的相关文章

Windows搭建Git、TortoiseGit

1. Git 简介: Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件. Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持. Git 与 SVN 区别 GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.Git 与 SVN 区别点: GIT 是分布式的,SVN不

Git学习笔记(2)-Eclipse中Git插件使用

目前我使用的Eclipse luna版本中已经集成了git插件,这里就不介绍如何安装Git插件了,不懂可以看其他的博客. 上篇笔记介绍了Git的基本指令,实际开发中我基本都使用eclipse插件进行代码提交和更新,下面就介绍下Eclipse中如何使用Git插件. 首先看一张Git管理代码原理图: 从这张图中可知道Git管理代码涉及到4个地方, Remote:远程仓库,或者叫远程分支,一个项目由多个人开发时,远程仓库就是中央代码库. Repository:本地仓库,顾名思义就是安装在本地的代码库,

GIT入门笔记(20)- git 开发提交代码过程梳理

git开发提交流程新项目开发,可以直接往master上提交老项目维护,可以在分支上修改提交,多次add和commit之后,也可以用pull合并主干和本地master,解决冲突后再push 1.检出代码 git clone http://gitserver/kubernetes/api-gateway-controller.git git clone http://gitserver/kubernetes/api-gateway-engine.git 引入为eclipse工程,修改代码 2.提交代

Git学习笔记(一) --- --- git的安装及本地仓库的创建,github上仓库的连接方式

首先了解git的作用是什么,本地仓库,中央仓库都是干什么的? Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个"服务器"仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交. 一. git的下载与安装: 1. 下载地址:https://www.git-scm.com/download/win 2. 安装,注意改一下安装路径并且牢记你装在

git学习笔记一:eclipse安装git插件

1.打开eclipse,点击在help->Install New Software,打开如下界面: 2.点击add按钮,按照下图填入 3.点击ok,一路next,安装好后,重启eclipse. 4.其他插件也同样的操作,如SVN. SVN Location:http://subclipse.tigris.org/update_1.8.x 原文地址:https://www.cnblogs.com/huanlingjisi/p/8782390.html

windows搭建web服务器

1.安装web管理工具 控制面板--->程序和功能--->打开或关闭功能 2.将internet信息服务中的所有选项全部勾上,并点击确定. 3.打开浏览器,输入http://localhost/ ,如果出现以下界面说明安装成功 4.允许程序或功能通过windows防火墙 5.设置成功之后,会在生成一个指定的路径,这个路径就是我们的web服务器的共享路径 6.然后我们右键目录,---->共享--->可以设置谁能够访问该目录,以及访问的权限. 7.打开浏览器,去其他计算机上输入本机的i

Windows 搭建域服务器和DNS

标签:SQL SERVER/MSSQL SERVER/数据库/DBA/域控制器 概述 因为很多高性能高可用方案都会在域环境中组建,所以了解创建域的一些知识对搭建那些高可用方案很有必要. 环境:windows 2008 r2 企业版 域服务器IP:192.168.2.10 PC机IP:192.168.2.12 DNS:192.168.2.10 目录 概述 安装域 添加角色 执行dcpromo.exe 加入域 创建域用户 总结 安装域 添加角色 使用添加角色的主要好处是该步骤会检查服务器的配置,需要

windows搭建FTP服务器

在自己电脑本地搭建一个FTP用于测试 第一步:配置IIS Web服务器 1)控制面板中找到“程序”并打开--> 2) 程序界面找到“启用或关闭Windows功能”并打开 或者两步也可以简化为一步:按[Win + R]快捷键打开运行对话框,输入“optionalfeatures”后,按回车键 从“启用或关闭Windows功能”弹窗中找到Internet Information Services(或者中文版Internet信息服务)并打开 1.5 配置IIS并点击确定后等待它完成 第二步:配置IIS

windows 搭建svn服务器

1. 下载Subversion服务器 for windows 访问http://subversion.apache.org/packages.html下载安装 2. 下载TortoiseSVN客户端 访问http://tortoisesvn.net/downloads.html下载,安装 3.创建svn版本库(用cmd)(不用dos导致期望文件系统格式在 1 到 6 之间 发现格式 7) svnadmin create E:\work\SVN 4.启动永久服务 sc create svnserv