Git
Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不需要服务器端软件支持。Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS)、工作管理系统等。
git常用命令
git提交本地分支到远程分支 - 搜索技术 - 博客园
Git与SVN区别点
Git是分布式的,SVN不是。这是Git和其他非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
SVN是集中式版本管理系统的代表,中央代码库存储着所有代码提交者的代码,而每个项目的参与者只负责代码的提交,中央代码库则保存着完整版的所有代码。
Git则是建立在本地库基础之上的分布式版本管理工具,最终可以使得任何代码的提交者都可以成为“中央代码库”。Git的根本思想和基本工作原理主要是在本地复制一个“代码库”,每次提交的代码均是推送到本地代码库中,节约了由于网络带宽所带来的限制,不至于出现提交5MB的代码而需等待20分钟的情况。另一方面,一旦中央代码库的服务器出现“崩溃”,那么任何“本地库”均可以还原中央代码库。
-
-
Git与SVN的存储方式不同。Git把内容按元数据方式存储,而SVN是按文件。
-
Git分支和SVN的分支不同,分支其实就是版本库中的另外一个目录。
-
Git没有一个全局的版本号,而SVN有一个全局的版本号。
-
Git的内容完整性要优于SVN。Git的内容存储使用的是SHA-1哈希算法,这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
-
在使用Git前我们需要先安装Git。Git目前支持在Linux/Unix、Solaris、Mac和Windows平台上运行。
linux下安装git
执行如下命令,安装Git。
yum -y install git
安装后,可以直接在命令行操作。
windows下安装git
完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。
在开始菜单里找到"Git"->"Git Bash",会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。
Git 工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。git clone
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。add commit
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
基本概念
-
工作区:就是你在电脑里能看到的目录。
-
暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
-
版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
"HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
-
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。
-
图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
-
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
-
当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
-
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
-
当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
-
当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。
-
当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
-
当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
基础配置
执行如下命令,查看Git版本号
git --version
执行如下命令,配置用户名称。
说明:
需要将下面命令中的username修改为要配置个人的用户名称。
git config --global user.name "username"
执行如下命令,配置电子邮件地址。
说明:
需要将下面命令中的test@XXX.com修改为要配置个人的电子邮件地址。
git config --global user.email test@XXX.com
执行如下命令,查看所有配置信息。
git config --list
git config --list
Git版本库又名仓库,英文名repository。可以把版本库简单的理解成一个目录,Git可以管理目录中的所有文件,并跟踪每个文件的修改、删除,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
先在本地创建一个目录。
初始化操作
执行如下命令,使用当前目录作为Git仓库,进行初始化。
该命令执行完后会在当前目录生成一个.git 目录。
git init
克隆操作
使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。
克隆仓库的命令格式如下。
git clone <repo> <directory>
参数说明:
-
repo:Git仓库地址。
-
directory:本地目录。
a. 执行如下命令,克隆Ruby语言的Git代码仓库Grit。
如:
git clone git://github.com/schacon/grit.git mytest
Git本地仓库有三大区域:工作区、暂存区、版本区。创建、修改文件等操作是在工作区,git add命令是将工作区的内容添加到暂存区,git commit命令将临时存区内容添加到本地仓库中。
基本操作
Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。
本章将对有关创建与提交你的项目快照的命令作介绍。
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,后面我们会详细介绍。
说明:
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
添加文件
git add命令语法如下。
添加一个或多个文件到暂存区。
git add [file1][file2]...
添加指定目录到暂存区,包括子目录。
git add [dir]
添加当前目录下的所有文件到暂存区。
git add .
提交文件
git commit命令语法如下。
提交暂存区到本地仓库中。
git commit -m 'message'
参数说明:
提交暂存区的指定文件到仓库区。
git commit [file1] [file2] ... -m 'message'
执行如下命令,将Aliyun.txt文件提交到暂存区。
git add Aliyun.txt
执行如下命令,查看当前仓库文件状态。
git status
回退版本
git reset命令用于回退版本,可以指定退回某一次提交的版本。git reset命令语法如下。
git reset [--soft | --mixed | --hard] [HEAD]
参数说明:
HEAD和HEAD~0表示当前版本。
HEAD^和HEAD~1表示上一个版本。
HEAD^^和HEAD^2表示上上一个版本。
HEAD^^^和HEAD^3表示上上上一个版本。
执行如下命令,查看历史提交记录。
git log
文件比较
git diff命令用于比较文件的不同,即比较文件在暂存区和工作区的差异。git diff命令显示已写入暂存区和已经被修改但尚未写入暂存区文件的区别
git diff HEAD -- Aliyun.txt
分支管理
1. 查看分支。
执行如下命令,查看分支。
git branch
2. 创建分支。
执行如下命令,创建分支。
git branch test
3. 切换分支。
a. 执行如下命令,切换分支。
git checkout test
b. 执行如下命令,查看分支是否已经切换。
git branch
5. 删除分支。
a. 执行如下命令,删除分支。
注意:如果您要删除的分支是当前工作分支,必须切换到其他分支后,才能删除。
git branch -d test
不能跨分支查看其他分支的文件。
执行如下命令,将test2分支合并到当前master分支。
git merge test2
查看当前分支包含的文件
ls
要在其他分支操作,切换到该分支,执行编辑,add,commit即可
撤销文件
1. 文件修改后还没有被放到暂存区,撤销修改就能回到版本库未修改前状态。
git checkout Aliyun.txt
实际为重新从版本库拿了一份到本地,将本地的修改给覆盖了。
2. 文件修改后添加到暂存区,需要先撤销暂缓区文件的更改,再继续撤销本地的修改。
git reset HEAD Aliyun.txt
git checkout Aliyun.txt
这里如果没有reset,直接checkout,则会发现没有变化。
如果删除了工作区的文件,可以再checkout一份。
git checkout Aliyun.txt
直接删除不需要的文件。
执行如下命令,从仓库中删除b.txt文件。
git rm b.txt
执行如下命令,将删除操作提交到仓库。
git commit -m 'delete b.txt'
执行操作后,工作区的b文件被删除。
git标签
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。
比如说,我们想为我们的 runoob 项目发布一个"1.0"版本。 我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD)"v1.0"的标签。
-a 选项意为"创建一个带注解的标签"。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。
$ git tag -a v1.0
Git 远程仓库(Github)
Git 并不像 SVN 那样有个中心服务器。
目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上。
(git本地版本库是无法让其他人员访问的)github是国外的。
国内的 Git 托管服务——Gitee(gitee.com)。
详细教程见菜鸟教程
本地生成SSH key (SSHkey是为了连接github仓库)
$ ssh-keygen -t rsa -C "youremail@example.com"
github上创建SSH key并粘贴本地生成的key
验证是否成功,输入以下命令:
$ ssh -T git@github.com
说明已成功连上 Github。
在github远程仓库创建仓库
可以从这个仓库克隆出新的仓库,也可以把本地仓库的内容推送到GitHub仓库。
# 提交到 Github
$ git remote add origin git@github.com:tianqixin/runoob-git-test.git
$ git push -u origin master
push出现的异常
参考:
git push 异常问题及Personal access token的使用 - 简书
在github生成accesstoken
push成功
如果在github仓库上进行了修改,则使用如下命令,将修改更新至本地版本库master分支
(此时本地工作区未更新)
$ git fetch origin
使用以下命令将更新同步到本地,操作后,本地工作区更新。
$ git merge origin/master
删除远程仓库你可以使用命令:
git remote rm [别名]
如origin就是那一串git地址的别名
Git 服务器搭建
参考Git 服务器搭建 | 菜鸟教程
自己搭建一台 Git 服务器作为私有仓库使用。
之前老徐提供的就是一个git服务器私有仓库。