git教程
(一)不同系统安装方式
1、Linux
输入 git
查看有没有安装
输入 sudo apt-get install git
完成Git的安装
2、Mac OS X
a:从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。(推荐)
b:一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
3、Windows
从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
(二)查看/修改用户名和邮箱地址
用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变。每次commit都会用用户名和邮箱纪录。
查看用户名、邮箱地址、密码:
git config user.name
git config user.email
修改用户名、邮箱地址、密码:
git config --global user.name "username"
git config --global user.email "email"
git config user.password "123456"
(三)创建版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
git init
创建一个版本库
首先,选择一个合适的地方,创建一个空目录:
$ mkdir learning_git
$ cd learning_git
$ pwd
$ git init
mkdir 命令用于创建文件
pwd 命令用于显示当前目录。
通过git init
命令把这个目录变成Git可以管理的仓库
Git为我们自动创建的第一个分支master
,以及指向master的一个指针
叫HEAD
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库,
可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的
没事千万不要手动修改这个目录里面的文件。
如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
(四)查看,添加,提交文件夹
git status
命令可以让我们时刻掌握仓库当前的状态
git status
git add
把文件添加到仓库
可一次性添加所有文件(git add .
),也可单独添加文件(git add filename
),或者反复多次使用,添加多个文件
git add .
git add README.txt
git add file1.html file2.html
git commit
把文件提交到本地仓库
git commit -m '提交说明'
-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
eg: 该目录添加一个READEME.txt文件,把它 添加到仓库
(五)时光穿梭
git status
命令可以让我们时刻掌握仓库当前的状态
我们试着修改README.txt文件内容,
接着git status
命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
git status
git diff
查看difference
显示的格式正是Unix通用的diff格式
git diff README.txt
git log
命令查看历史提交版本记录
显示从最近到最远的提交日志。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数
git log
git log --pretty=oneline
一大串类似 026e9 …的是commit id(版本号)
,和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示
git GUI 可视化工具查看Git历史
每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线
git GUI 可视化教程
git reset
命令版本回退
首先,Git必须知道当前版本是哪个版本
用 HEAD
表示当前版本,也就是最新的提交。HEAD^
表示上一个版本,HEAD^^
表示上上一个版本。HEAD~100
表示往上100个版本
--hard
参数
回退方式有 HEAD
方式, 也有 id 版本号
回退方式,版本号可以写完整,也可以是前7位
git reset --hard HEAD^
git reset --hard feac7aaa698d8187afa2d077e7b24fc6c11dece2
git reset --hard feac7aa
git reflog
命令查看命令历史,记录你的操作命令
以上回退版本之后,又想回到之前的本版,我们需要lit log 再查找 id。
当然最简便的方法就是用git reflog
命令查看更改记录,里面有记录之前切换的版本
git reflog
工作区(Workspace),暂存区(Index / Stage),版本库/本地仓库(Repository)
当前的电脑能看到的目录,比如我的 learning_git 文件夹就是一个工作区
工作区的目录.git
,就是Git的版本库。
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
每次修改,如果不用git add到暂存区,那就不会加入到commit中。
git checkout -- file
撤销丢弃工作区的修改
当我们需要丢弃工作区某个文件的修改,在还没有 commit 之前,就可以用这种方式
git checkout -- file
-- 必须存在,否则会被理解为切换分支
git reset HEAD^ <file>
撤销暂存区的修改,重新放回工作区
commit
之后,想撤销 commit 修改
可以单独撤销某个文件的修改,或者撤销整个commit
完成撤销操作后,就恢复到了上一次的commit状态。
git reset HEAD^ <file>
git reset --soft HEAD^
--mixed
保留工作空间改动代码,撤销commit,撤销git add . 操作
git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。
--soft
不删除工作空间改动代码,撤销commit,不撤销git add .
--hard
毫无保留,删除工作空间改动代码,撤销commit,撤销git add .
rm file
删除文件
你可以选择直接在文件管理器中把没用的文件删了,或者用rm命令删了
如果删错了,因为版本库里还有,所以可以很轻松地把误删的文件恢复到最新版本
rm test.txt
git checkout -- test.txt
合并特定commits 到另一个分支
1、合并某个分支上的单个commit(cherry-pick
)
feature 分支上的commit 62ecb3 非常重要,你现在只需要将62ecb3 合并到develop,而不合并feature上的其他commits
git log
dd2e86 - 76cada - 62ecb3 - 5a6057 [feature]
git checkout develop
git cherry-pick 62ecb3
2、合并某个分支上的一系列commits(rebase
)
假设你需要合并 feature 分支的 commit 76cada ~ 62ecb3 到 develop 分支
git checkout -b rebase 62ecb3 // 建一个rebase新分支只取到 62ecb3
git rebase --onto develop 76cada^ // 新分支--onto 76cada^ 指明你想从哪个特定的commit开始
(六)远程仓库(Remote)
Git是分布式版本控制系统
,同一个Git仓库,可以分布到不同的机器上。就是每个开发人员可以从中心版本库的服务器上chect out代码到本地机器上克隆一个自己的版本库。在离线等情况下,你仍然能够在你本地提交文件,查看历史版本记录,创建项目分支等。
其实一台电脑上也是可以克隆多个版本库的,只要不在同一个目录下。不过,这并没有什么意义。
实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
好在这个世界上有个叫GitHub
的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库:https://github.com/。
SSH Key
注册GitHub账号后。由于本地Git仓库和GitHub仓库之间的传输是通过SSH
加密的,所以,需要一点设置:
1、创建SSH Key
ssh-keygen -t rsa -C "youremail@example.com"
把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
2、GitHub中,Add New SSH Keys:
点“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
远程先创建仓库,克隆到本地
a: New --> creat repository 新建一个项目
Repository name: 仓库名称(输入名字,最好不要使用中文)
Description(可选): 仓库描述介绍
Public, Private : 仓库权限(公开共享,私有或指定合作者)
Initialize this repository with a README: 添加一个README.md
gitignore: 不需要进行版本管理的仓库类型,对应生成文件.gitignore
license: 证书类型,对应生成文件LICENSE
b: git clone
把项目克隆到本地
本地先创建仓库,提交到远程
创建关联远程分支
git checkout -b my-test //在当前分支下创建my-test的本地分支分支,并切换到新分支(-b)
git push origin my-test //将my-test分支推送到远程
git branch --set-upstream-to=origin/my-test //将本地分支my-test关联到远程分支my-test上
git branch -a //查看远程分支
本地\远程仓库版本回退
git log //查看历史提交记录,选择要回退的版本号,commit后面一串字符
git reset --hard 8622e0f10...... // 回退本地版本 (本地版本)
git push -f //强制回退远程仓库到当前版本 (远程仓库)
移除本地分支
需要切换到其它分支之后删除当前分支
git branch -d <BranchName>
强制删除 :
git branch -D <BranchName>
删除远程分支:
git push origin :XXXX
命令行的各种退出方式
git log
如果commit(提交)比较多,git log 的内容就会比较多;当满屏放不下,就会显示冒号。
查看更多:回车(往下滚一行)、空格(往下滚一页
退出:英文状态下 按 q
git commit 、git merge
该命令没有带-m参数时,会跳出commit change log
(COMMIT_EDITMSG)界面,因为涉及到是否要保存编辑内容,所以退出命令有多种。
保存并退出:
(1)按 Esc 键
退出编辑模式,英文模式下输入 :wq
,然后回车(write and quit)。
(2)按 Esc 键
退出编辑模式,大写英文模式下输入 ZZ
,然后回车。
不保存退出:
按 Esc 键
退出编辑模式,英文模式下输入 :q!
,然后回车。
按 Esc 键
退出编辑模式,英文模式下输入 :qa!
,然后回车。
学习地址:
https://www.cnblogs.com/ximiaomiao/p/7140456.html
更新远程分支列表
有时会遇到git branch -a时总是不出现新的分支或者远程已经没有的分支在本地还有,这时就需要更新下本地的git分支保持和远程分支一致,使用下面命令即可:
git remote update origin --prune
(六)说说常见的版本控制管理工具,以及它们的区别
项目源代码的版本管理工具中,比较常用的主要有:Git、CVS、SVN 、VSS、ClearCase、Mercurial 、StarTeam、BitKeeper
GIT:
最初是从Linux起家的,非常依赖文件系统的一些特性。
Git 是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
CVS:
一个开源工具,与后面提到的SVN是同一个厂家:Collab.Net提供的。
CVS是源于unix的版本控制工具,对于CVS的安装和使用最好对unix的系统有所了解能更容易学习,CVS的服务器管理需要进行各种命令行操作。目前,CVS的客户端有winCVS的图形化界面,服务器端也有CVSNT的版本,易用性正在提高。
SVN:
在CVS 的基础上,由CollabNet提供开发的,也是开源工具,目前越来越受到大家的欢迎,估计将来可能会成为最著名,使用最广泛的工具。
在权限管理,分支合并等方面做的很出色,他可以与Apache集成在一起进行用户认证。不过在权限管理方面目前还没有个很好用的界面化工具。
是一个跨平台的软件,支持大多数常见的操作系统。
VSS:
Microsoft提供的,可以与VS.net进行无缝集成,成为了独立开发人员和小型开发团队所适合的工具,当规模较大后,其性能通常是无法忍受的,对分支与并行开发支持的比较有限。
Git与CVS 的区别 :
分支更快、更容易。
支持离线工作;本地提交可以稍后提交到服务器上。
Git 提交都是原子的,且是整个项目范围的,而不像 CVS 中一样是对每个文件的。
Git 中的每个工作树都包含一个具有完整项目历史的仓库。
没有哪一个 Git 仓库会天生比其他仓库更重要。
Git与SVN 的区别:
1、Git是分布式的,SVN不是。这个是最主要的区别
所谓分布式。就是每个开发人员可以从中心版本库的服务器上chect out代码到本地机器上克隆一个自己的版本库。在离线等情况下,你仍然能够在你本地提交文件,查看历史版本记录,创建项目分支等。
需要做一点声明,Git并不是目前第一个或唯一的分布式版本控制系统。还有一些系统如 Bitkeeper, Mercurial 等也是运行在分布式模式上的,但Git在这方面做的更好,而且有更多强大的功能特征。
2、Git 把内容按元数据方式存储,而SVN是按文件
.git 目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签、分支、版本记录等。
3、Git 分支和SVN的分支不同
Git 的分支,你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。
4、Git 没有一个全局的版本号,而SVN有
5、Git 的内容完整性要优于SVN
Git教程:https://www.liaoxuefeng.com/wiki/896043488029600