Git教程1

文章目录

    • 1.Git简介
      • 1.1 Git诞生
      • 1.2 集中式vs分布式
      • 1.3 安装Git
        • Linux上安装Git
        • Windows上安装Git
      • 1.4 创建版本库
      • 1.5 把文件添加并提交到版本库
    • 2.时光机穿梭
      • 2.1 修改并提交
      • 2.2 版本回退
      • 2.3 工作区和暂存区
      • 2.4 管理修改
      • 2.5 撤销工作区和暂存区的修改
        • 把工作区中的修改撤销
        • 把暂存区中的修改回退到工作区
      • 2.6 删除也是修改操作
    • 3.远程仓库
      • 3.1 GitHub中添加SSH Key
      • 3.2 添加远程库
      • 3.3 删除远程库
      • 3.4 从远程库克隆
    • 4.分支管理
      • 4.1 本地创建与合并分支
      • 4.2 本地合并时解决冲突
      • 4.3 分支管理策略
        • 禁用Fast forward
        • 分支策略
      • 4.4 Bug分支(用stash保持工作区和暂存区数据)
      • 4.5 多人协作
        • 推送分支
        • 抓取分支
        • 远程推送时有冲突
        • 多人协作小结
        • Rebase
    • 5.标签管理
      • 5.1 创建标签
      • 5.2 操作标签
    • 6.其他
        • 6.1 使用GitHub
      • 6.1 忽略特殊文件
      • 6.2 SourceTree

1.Git简介

1.1 Git诞生

Git是目前世界上最先进的分布式版本控制系统
CVSSVN集中式版本控制系统

Linus花了两周时间用C写了一个分布式版本控制系统,这就是Git。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub。

1.2 集中式vs分布式

集中式版本控制系统:版本库集中存放在中央服务器。最大的毛病就是必须联网才能工作。

分布式版本控制系统:没有“中央服务器”,每个人的电脑上都是一个完整的版本库。你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

1.3 安装Git

Linux上安装Git

# 查看是否安装
git  

# sudo安装
sudo apt-get install git

# Git官网下载源码解压,依次输入:
./config  
make
sudo make install

Windows上安装Git

# 下载https://git-scm.com/downloads

# 在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

# 命令行输入user.name/user.email,让本地所有的Git仓库都使用这个配置
# 每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改
git config --global user.name "HF"
git config --global user.email "[email protected]"

# 查看并修改信息
git config --list  // 查看信息
git config --global --replace-all user.name "ishanfei"
git config --global --replace-all user.email "[email protected]"
git config --list  // 查看信息

1.4 创建版本库

cd e:
mkdir learngit
cd E:\
git init // 初始化仓库,目录下多一个.git目录

1.5 把文件添加并提交到版本库

把文件放到learngit目录下

此时文件是untracked files

如果想删除untracked files文件及目录
git clean -nf  // 先看看会删除哪些文件     git clean -nfd  // 先看看会删除哪些文件和目录
git clean -f  // 再删除文件               git clean -fd  // 再删除文件和目录

把文件添加到版本库:
git add readme.txt readme1.text
git add readme2.text

文件提交到版本库:
git commit -m "wrote a readme file"

2.时光机穿梭

2.1 修改并提交

修改readme.txt

git status  // 查看仓库状态

git diff readme.txt  // 查看修改

git add readme.txt

git commit -m "add distributed"

git status

也可以使用Git GUI:
Sign Off填写注释

2.2 版本回退

每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

git log / git log --pretty=oneline  // 查看提交日志
git reflog // 查看历史命令,寻找版本号

git reset --hard HEAD^   // 回退到上一次commit
git reset --hard 1094a   // 根据版本号回退到版本

回退到db5c3a后add新文件会形成一个新的路径。
Git教程1_第1张图片

2.3 工作区和暂存区

工作区就是电脑里能看到的目录,比如learngit文件夹就是一个工作区。

工作区中的隐藏目录.git,是Git的版本库。版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
Git教程1_第2张图片
git add把文件添加进去,实际上就是把文件修改添加到暂存区;
git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。 创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

2.4 管理修改

Git跟踪并管理的是修改,而非文件。

2.5 撤销工作区和暂存区的修改

把工作区中的修改撤销

git checkout -- readme.txt

把readme.txt文件在工作区的修改全部撤销。

把暂存区中的修改回退到工作区

git reset HEAD readme.txt
git checkout -- readme.txt

2.6 删除也是修改操作

git rm test.txt  // 删除文件
git rm -r aaaa/ // 删除文件夹
git commit -m "aa"  

git checkout -- test.txt  // 删除还原,用版本库版本替换工作区版本,无论工作区是修改还是删除,都可一键还原

3.远程仓库

3.1 GitHub中添加SSH Key

找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

第1步:创建SSH Key。打开Shell(Windows下打开Git Bash),创建SSH Key:

// ssh与-keygen之间没有空格
$ ssh-keygen -t rsa -C "[email protected]"

找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,添加Key

如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。这个方法我们后面会讲到的,相当简单,公司内部开发必备。

3.2 添加远程库

登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库。在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。

把本地仓库的内容推送到GitHub仓库

// 与GitHub远程库关联,远程库名字是origin
git remote add origin git@github.com:ishanfei/learngit.git

// 查看远程库信息
git remote -v

// 第一次推送master分支时,加上-u参数,Git不但会把本地master分支内容推送到远程新的master分支,还会把本地master分支和远程master分支关联起来,在以后的推送或者拉取时就可以简化命令。
// 之后push: git push origin master
git push -u origin master  

3.3 删除远程库

git remote -v   // 查看远程库信息
git remote rm origin  // 删除远程库

3.4 从远程库克隆

登陆GitHub,创建一个新的仓库,名字叫gitskills。勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件。

// Git克隆支持多种协议,默认使用ssh,但也可以使用https等其他协议。
// 使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
git clone git@github.com:ishanfei/learngit.git

4.分支管理

SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢。但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

4.1 本地创建与合并分支

在Git里,master分支是主分支。HEAD指向当前分支。当前分支会指向当前分支最新的提交点。

当我们创建新的dev分支时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

git branch  // 查看分支,当前分支前面会标一个*号。
git branch dev   // 创建分支
git switch master  // 切换分支
git switch -c master  // 创建并切换分支
git merge dev // 合并指定分支到当前分支
git branch -D dev  // 删除分支
git push origin master   // 推送到远程仓库

Git教程1_第3张图片
从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
Git教程1_第4张图片
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
Git教程1_第5张图片
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
Git教程1_第6张图片

4.2 本地合并时解决冲突

存在冲突,必须手动解决冲突后再提交。

4.3 分支管理策略

禁用Fast forward

禁用Fast forward,在merge时生成一个新的commit:

git merge --no-ff -m "merge with no-ff" dev // 加上-m参数,把commit描述写进去。

Git教程1_第7张图片

分支策略

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

干活都在dev分支上,dev分支是不稳定的,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本。

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

4.4 Bug分支(用stash保持工作区和暂存区数据)

git stash // 保存工作区

git stash list // 查看工作区

git stash pop // 恢复的同时把stash内容也删了      git stash apply stash@{0}  // 恢复指定stash

git stash list

复制一个特定的提交到当前分支:

git cherry-pick 4c805e2

4.5 多人协作

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

git remote -v  // 查看远程库的信息

推送分支

git push origin master  // 推送master到master

git push origin dev   // 推送dev

但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?

master分支是主分支,因此要时刻与远程同步;

dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

抓取分支

git clone git@github.com:ishanfei/learngit.git   // master

git switch -c dev2 origin/dev2   // ★★★★★★创建远程origin的dev2分支到本地dev2

git push origin dev2  // 推送

远程推送时有冲突

git branch --set-upstream-to=origin/dev2 dev2   // ★★★★★指定本地dev分支与远程origin/dev2分支的链接
git pull  // 把最新的提交抓下来
合并冲突
git push origin dev  // 再次push

多人协作小结

多人协作的工作模式通常是这样:

首先,可以试图用git push origin 推送自己的修改;

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

如果合并有冲突,则解决冲突,并在本地提交;

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

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

Rebase

5.标签管理

tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起,就不用指定commit号了。

5.1 创建标签

git branch
git switch master
git tag v1.0    // 默认标签打在最新提交的commit上,git tag -a v0.1 -m "version 0.1 released" 1094adb,用-a指定标签名,-m指定说明文字

git log --pretty=oneline --abbrev-commit
git tag v0.9 f52c633  // 打在之前的版本

git tag // 查看标签
git show v0.9 // 查看标签信息

5.2 操作标签

git tag -d v0.1  // 删除标签

git push origin v1.0  // 推送标签到远程
git push origin --tags  // 一次性推送全部尚未推送到远程的本地标签

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.9  // 
git push origin :refs/tags/v0.9  // 从远程删除

6.其他

6.1 使用GitHub

如何参与一个开源项目呢?比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页 https://github.com/twbs/bootstrap,点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:

git clone git@github.com:ishanfei/bootstrap.git

一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址[email protected]:twbs/bootstrap.git 克隆,因为没有权限,你将不能推送修改。

如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。
(进入fork出来的项目,Pull requests,New pull request)

6.1 忽略特殊文件

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

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa

创建后把.gitignore也提交到Git。

6.2 SourceTree

你可能感兴趣的:(Git教程,git)