Git学习总结

258 阅读5分钟

Git介绍

———本文是学习廖雪峰老师的Git教程之后所写的笔记,方便记忆,提高。

导图

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

版本控制就是可以在一个项目,管理、控制自己写的不同版本的代码。可用于团队协作、在不修改原代码的情况下通过分支开发新功能以及临时修改程序bug等。同时,还可以记录下代码修改操作,便于查看和管理代码。简单理解,就是一个管理代码的系统。

此外,还要弄清分布式与集中式的区别:

区别 集中式 分布式
互联网 必须 非必须,可以本地操作
中央服务器 无,仅用于交换代码
便捷性 低,依赖服务器
安全性
主要软件 SVN,CVN Github,BitKeeper

Git安装

  • Linux上安装方式: sudo apt-get install git
  • Mac上安装方式:通过homebrew安装或通过Xcode安装
  • Windows上安装Git:直接到官网下载安装包安装

安装完后,还要对git进行设置

$git config --global user.name "Your name"
$git config --global user.email "example@email.com"

配置个人信息,--global全局参数表示机器上所有git仓库都使用这个配置

创建版本库

版本库(reposity)就是一个代码目录,目录里的所有文件都可通过Git进行管理。

创建代码:

$ mkdir newCode
$ cd newCode
$ git init 

运行结果:

Initialized empty Git repository in /Users/taokexia/newCode/.git/

git init:把目录变成git管理目录。在目录下会生成.git文件(Linux下,通过ls -ah可查看该文件),没事不要手动修改目录,避免破坏版本库

如果使用的是Window系统,为避免因字符集的问题出错,要确保目录名不含中文

把文件添加到版本库

不要使用Windows自带的记事本编辑任何文本文件,会造成错误。

使用git add (文件名)往当前代码库添加文件。可一次添加多个文件。
使用gti commit -m (注释内容)把文件提交到仓库,-m表示添加本次提交的说明,最好有意义,明白本次提交代码的主要作用,便于以后查看

Git版本控制

查看版本库

使用git status查看当前代码库的状态,了解到当前代码是否上传。(常用) 常见有三种状态:

  • 还没有提交修改
# On branch master
# Changes not staged for commit
  • 以及提交修改
# On branch master
# Changes to be committed:
  • 提交成功
# On branch master
nothing to commit (working directory clean)

使用git diff (fileName) 查看文件修改的地方。
使用git log查看提交的历史记录,使用参数--pretty=oneline简洁显示

window下查看结果:

git log

图片中comit行显示的16进制数是commit id(版本号)可用于控制版本。

跳转版本库

git reset --hard HEAD:查看当前版本号,HEAD指针指向当前版本号

结果显示为:

HEAD is now at 143cc02 three hello

使用git reset往之前的版本号跳:

如要跳转到上一版本的代码库,使用代码git reset --hard HEAD^,使用HEAD^^表示跳转到上两个版本,HEAD~100表示跳转到上100个版本

注意:跳转后,git log显示也会发送改变,只显示当前版本号之前的历史信息。

使用git reset跳往后面的版本号:

git reset --hard 143cc02,143cc02为版本号前几位数字。 查看版本号方式:
git reflog记录你的每一次命令,并提供了跳转的号码

版本转换

暂存区和工作区

工作区:代码库所在的文件夹就是工作区。工作区有隐藏目录.git,为版本库。
版本库里包括暂存区(stage),分支和指针HEAD
git工作时,当接收到add命令时,把文件添加到暂存区,再通过commit把暂存区文件添加到分支。即需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

暂存区

注意:
每修改一次文件,git add把文件加入到暂存区,再修改文件,暂存区内的内容没有发生变化,这时候如果使用git commit则最后一次修改的内容没有保存到分支中。避免的方法是:没修改一次文件,就使用add添加一次文件。

修改操作

撤销修改:
使用git chekcout -- (文件名)来撤销对文件的修改,如果文件修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态。如果已经添加到暂存区,则撤销修改就回到添加到暂存区后的状态
如果想把暂存区的修改撤销掉,使用代码git reset HEAD (文件名),文件重新回到工作区。

删除操作:
使用git rm (文件名)删除代码库里的文件。
如果想恢复删除的文件,则使用git checkout -- (文件名),用版本库里的版本替换工作区的版本。

远程仓库

Git可以通过服务器管理代码,每个人都可以从这个服务器仓库克隆一份代码到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也可以从服务器仓库中拉取别人的提交,完成协作开发。

实现远程管理可以通过Github网站,Github是提供Git仓库托管服务的免费网站,通过SSH加密进行代码传输。

Github设置SSH
创建SSH key:$ ssh-keygen -t rsa -C "youremail@example.com"
创建完成后,可以在目录里看到.ssh目录,里面有id_rsaid_rsa.pub两个文件,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

设置SSH:登陆GitHub,打开“Account settings”,“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你看到已经添加的Key

ssh

SSH作用:GitHub通过SSH识别出你推送的提交确实是你推送的

远程仓库操作

添加远程库:
Github仓库与本地仓库同步操作: 首先,登陆GitHub,创建一个新的仓库 在Repository name填入仓库名,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库,仓库目前没有任何代码。\

在本地代码目录下,使用$ git remote add origin git@github.com:(用户名)/(仓库名).git,这样,本地就关联了远程库。远程库的名字就是origin,这是Git默认的叫法,也可以改成别的。

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会推送代码,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时只需要使用git push origin master命令。

从远程库克隆:
使用git clone git@github.com:(用户名)/(仓库名).git克隆一个本地库。

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

分支管理

创建合并分支

创建分支:
当我们创建新的分支,会创建一个分支指针,例如Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。Git创建分支主要进行操作:创建一个dev指针,改变HEAD指针指向。工作区文件没有任何变化。
此后,对工作区的修改和提交主要针对的是dev分支,而master分支没有变化

创建代码:

$ git checkout -b dev

checkout命令加上参数-b表示创建并切换,等价于:

$ git branch dev
$ git checkout dev

查看代码:

git branch

会列出所有分支,在当前分支前面会标一个*

$ git branch
* dev
  master

切换分支代码:

$ git checkout master

切换到master分支

合并分支:
Git合并直接把master指向dev的当前提交,就完成了合并,通过修改指针实现合并,工作区没有任何变化。合并完成之后,最后的步骤是删除dev指针。

合并代码:

$ git merge dev

合并指定分支到当前分支。如果合并没有发生冲突,常见的模式是:Fast-forward,表示这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

如果合并的两分支都有了各自的提交,则可能会发生冲突,这时合并模式就不是Fast-forward,这时必须手动解决冲突
通过git status获取冲突的文件, 在冲突的文件内容里面,git会对冲突的部分进行标记,使用<<<<<<<=======>>>>>>>标记出不同分支的内容,修改完冲突后保存文件。使用add,commit命令传递文件,合并完成。

使用$ git log --graph --pretty=oneline --abbrev-commit可以查看分支合并图

删除分支代码:

git checkout -d dev

因为创建、合并和删除分支非常快,所以使用分支完成某个任务,合并后再删掉分支,这样更安全。

分支管理策略

Fast-forward模式下,删除分支后,会丢失分支信息。强制禁用Fast-forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

禁用Fast-forward代码:

git merge --no-ff -m "description" (合并分支名)

--no-ff表示禁用Fast-forward模式,-m表示添加描述,不使用Fast-forward模式,merge后分支dev指针位置没有变化,HEAD指针指向master

分支管理原则:

  • 保持master分支稳定,仅用于发布新版本
  • 主要在dev分支上编写代码,要发布新版本时才合并到master
  • 每个人都可以有自己的dev分支,时不时地往dev上合并分支

bug分支: 遇到程序出bug时,常见的做法是建立新的临时分支,进行修复,修复后再合并分支,删除临时分支。
此外,如果当前项目只进行了一半,可以使用git stash功能,把当前工作现场储藏起来,等以后恢复现场后继续工作。

git stash list

查看储存的工作环境,恢复工作环境代码

git stash apply #恢复,不过恢复后需要删除stash内容
git stash drop #删除
git stash pop #恢复的同时,删除stash
git stash apply stash@{0} #如果有多个stash,可以指定恢复的stash

Feature分支: 通过创建Feature分支,可以在不影响主程序的情况下,给程序添加新的功能,完成后,再合并,删除分支。

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

多人协作: 查看远程库信息:git remote
查看远程库更详细信息:git remote -v
推送分支:git push origin master,推送master分支到远程库中

推送原则:

  • master主分支,要时刻与远程同步
  • dev是开发分支,也需要与远程同步
  • bug分支只用于在本地修复bug,就没必要推到远程
  • feature分支是否推到远程,取决于是否需要合作开发

抓取分支:
clone远程库使,默认只克隆master分支,可在本地往远程库推送dev分支,如果发生推送冲突,可使用git pull把最新的提交从origin/dev抓下来,在本地合并,解决冲突,再推送。

如果git pull也失败了,提示no tracking information,则原因是没有指定本地dev分支与远程origin/dev分支的链接,设置代码:

$ git branch --set-upstream dev origin/dev

多人工作模式:

  1. git push origin (分支名)推送自己的修改
  2. 推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
  3. 如果合并有冲突,则解决冲突,并在本地提交
  4. 没有冲突或者解决掉冲突后,再用git push origin (分支名)推送就能成功

标签管理

由于版本的commit id难于记忆,一般使用标签标记版本号,便于记忆,操作

创建标签:
切换到需要打标签的分支上,使用git tag (name)就可以打一个新标签。
使用git tag (name) (commit id)给对应的commit id的版本打上标签
git tag查看标签,创建带有说明的标签:

  • -a指定标签名,
  • -m指定说明文字,
  • -s指用私钥签名一个标签,签名采用PGP签名 git show (标签姓名)查看标签信息

操作标签:
删除标签:git tag -d (标签名)
推送一个本地标签:git push origin (标签名)
可以推送全部未推送过的本地标签:git push origin --tags
删除一个远程标签:git push origin :refs/tags/<标签名>

自定义Git

git config --global color.ui true让Git显示颜色,会让命令输出看起来更醒目

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

使用git add -f (文件名)强制添加文件
使用git check-ignore检测忽略文件

忽略文件的原则:

  • 忽略系统生成文件
  • 忽略编译生成的中间文件、可执行文件等
  • 忽略你自己的带有敏感信息的配置文件

.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

配置别名:

$ git config --global alias.st status

git st等价于git status

配置文件存放位置`每个仓库的Git配置文件都放在.git/config文件中``,别名就在[alias]后面

搭建Git服务器:
答建Git服务器首先需要准备一台运行Linux的机器

  1. 安装gitsudo apt-get install git\
  2. 创建一个git用户,用来运行git服务:sudo adduser git
  3. 创建证书登录:所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个
  4. 初始化Git仓库,sudo git init --bare (版本库名).git
  5. 禁用shell登录,编辑/etc/passwd文件,改为git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
  6. 克隆远程仓库,通过git clone命令克隆远程仓库