码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2016-04-17 23:11:18      阅读:939      评论:0      收藏:0      [点我收藏+]

标签:

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 "youremail@example.com"

生成ssh 公钥和私钥

关联远程库

1
git remote add origin git@server-name:path/repo-name.git

推送

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

克隆

1
git clone git@github.com: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>

解决冲突

Rudy@RUDY ~/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 administrator@192.168.1.13: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 git@github.com:michaelliao/learngit.git
git@github.com是远程地址,我们连接自建的server要改成administrator@ipaddress这样就能够识别远程仓库地址和我们要使用的用户,后面: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 administrator@192.168.199.171
    输入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 administrator@192.168.199.171:yourpath/testrepo

认证身份

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

1
$ git clone administrator@192.168.199.171:yourpath/testrepo
Cloning into ‘testrepo‘...
administrator@192.168.199.171‘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

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

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

标签:

原文地址:http://blog.csdn.net/tham_/article/details/51169644

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!