Git 基础

概述

版本控制系统

  1. 集中化版本控制系统:集中化版本控制系统是一种将项目的变更历史保存在一个中央服务器上的版本控制系统,各个客户端上面保存各自的版本,新客户端复制项目时只是复制项目的最新版本,这样当中央服务器损坏时会丢失项目变更历史。
  2. 分布式版本控制系统:分布式版本控制系统在集中化版本控制系统上进行了改进,在分布式版本控制系统中所有的客户端保存的内容都与中央服务器一样,而不仅是项目的最新版本,这样当中央服务器损坏时,随便找一个客户端的文件恢复即可。

Git 的三种状态

  1. 已修改(modified):已修改表示修改了文件,但还没保存到数据库中。
  2. 已暂存(staged):已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  3. 已提交(committed):已提交表示数据已经安全的保存在本地数据库中。

Git的三个工作区域

  1. 工作目录:是对项目的某个版本独立提取出来的内容。 这些是从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上以供使用或修改。
  2. 暂存区域:是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。
  3. Git仓库:是 Git 用来保存项目的元数据和对象数据库的地方。 是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

Git 的工作流程

  1. 在工作目录中修改文件。
  2. 暂存文件,将文件的快照放入暂存区域。
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

分支合并冲突

  • 概念:当两个分支对同一个文件的同一部分进行了不同的修改时,两分分支合并时就会引发合并冲突。使用git merge命令合并时git会在文件有冲突的地方标记出来以便查看。
  • 解决:与文件修改者商讨解决文件冲突的部分,解决冲突后再进行合并。

名词

  1. 标签(tag):为提交记录打标签可以用于版本标识,例如v.1.0,v.1.1等,标签存储在本地不会随着每次代码提交而自动提交,需要专意使用提交标签命令来提交标签。
  2. 裸仓库(bare repository):一个没有工作目录,只包含 .git 目录内容的文件夹。

安装和配置

  • window 安装,略

  • linux 安装:

    检查是否安装了 git

    git --version
    

    安装 git

    yum -y install git
    
  • 查看版本:git --version

  • 查看配置及配置文件:git config --list --show-origin

  • 设置全局用户名:git config --global user.name "用户名"

  • 设置全局用户邮箱:git config --global user.email 邮箱地址

  • 在特定的项目中去掉 --global 可以设置项目独有的用户名和密码。

  • 查看配置信息: git config --list

配置文件

  • /etc/gitconfig :包含了系统上每一个用户及他们的仓库的通用配置。
  • .git/config :只包含当前用户和仓库的配置。.git/config 配置文件的优先级高于/etc/gitconfig

从远程仓库拉取和推送

  1. git clone <url>:从远程仓库地址<url>克隆仓库
  2. git config --global credential.helper store:生成一个文件,记录git账号密码,这样只第一次需要输入一个仓库账号密码。
  3. git pull:将远程仓库有的本地没有的拉取下来。
  4. git push <remote-name> <branch-name>:将将分支<branch-name>推送到远程仓库<remote-name>,使用clone克隆一个远程仓库时会自动将远程仓库命名为origin

分支

  • 创建分支:git branch 分支名称
  • 切换分支:git checkout 分支名称
  • 将指定分支合并到当前分支:git merge 分支名称
  • 删除分支:git branch -d 分支名称
  • 查看所有分支:git branch
  • 查看所有分支的最后一次提交:git branch -v
  • 查看已合并到当前分支的分支:git branch --merged
  • 查看未合并到当前分支的分支:git branch --no-merged

基本使用

  • 初始化仓库:git init ,会创建一个 .git 的目录,这个目录包含Git仓库所需要的所有文件。
  • 查看仓库的状态: git status
  • 撤销指定文件的修改:git checkout -- 文件名
  • 撤销所有文件的修改:git checkout .
  • 将所有改变提交到暂存区: git add -A
  • 撤销指定文件的暂存:git reset HEAD 文件名
  • 撤销所有文件的暂存:git reset HEAD .
  • 将暂存区提交到仓库: git commit -m "提交说明"
  • 将仓库退回到上一个版本:git reset --hard HEAD^,一个 ^ 代表一个版本,如退回到上两个版本的命令为git reset --hard HEAD^^
  • 将仓库退回到指定的版本:git reset --hard 版本号
  • 从仓库中移除文件:rm 文件名
  • 查看提交日志: git log [-p] [-number] ,日志按时间降序排列,-number 参数可以选择展示的日志数量,-p 参数会展示提交的差异。其他参数略。
  • 创建标签且写备注:git tag -a 标签名 -m "备注"
  • 查看指定标签:git show 标签名
  • 查看所有标签:git tag
  • 后期创建标签:git tag -a 标签名 版本号
  • 删除标签:git tag -d 标签名
  • 选择标签版本:git checkout 标签名

.gitignore 文件可以设置哪些文件不会被仓库跟踪,设置格式如下:

*.a           //不跟踪所有的 .a 文件
!lib.a        //跟踪所有的 lib.a 文件,优先级高于 *.a 配置
/file         //不跟踪当前目录下的 file 文件
dir/          //不跟踪 dir 目录
dir/*.txt     //不跟踪 dir 目录下的 .txt 文件,不影响其子目录文件的跟踪
dir/**/*.txt  //不跟总 dir 目录及其子目录下的 .txt 文件

常用命令

本地仓库

git config --list:列出所有 Git 当时能找到的配置。

git help <verb>:寻找Git命令verb的帮助信息。

git init:创建一个Git仓库并初始化。

git clone <url> [name]:克隆远程仓库,重新命名(可选)

git status:查看文件的状态。

git add [fileName] [-A]:暂存指定文件,或暂存全部有更改的文件。此时文件还没有被提交到Git仓库。

.gitignore文件:指定不跟踪的文件。

git diff:查看已修改尚未暂存的文件与已提交文件之间的详细变更情况。

git diff --staged:查看已修改且暂存的文件与已提交文件之间的详细变更情况。

git commit -m "<explain>":提交已暂存的文件到仓库,[explain]是本次提交的说明。

git commit -a -m "<explain>":省略文件的暂存步骤,直接将所有修改的文件提交到仓库。

git log [parameter]:列出仓库的提交记录历史。

git checkout -- <fileName>:撤销fileName文件的修改。

git reset HEAD <fileName>:撤销fileName文件的暂存。

git tag [parameter]:列出所有的标签。

git tag -a <tag-name> [-m <tag-explain>]:创建一个标签并注释。

git show <tag-name>:查看标签信息与提交信息。

git tag -a <tag-name> <index>:给以往的提交打标签。<index> 是提交标识。

git push <remote-name> [<tag-name> <--tag>]:将指定标签或全部标签推送到远程仓库,标签默认不会推送到远程仓库,需要显示推送。

git tag -d <tag-name>:删除指定标签。

分支

git branch <branch-name>:创建分支。

git checkout <branch-name>:切换分支。

git branch -d <branch-name>:删除分支。

git branch -D <branch-name>:强制删除分支,若删除未合并的分支可以用强制删除。

git branch:列出所有的分支,标有星号(*)的分支表示当前HEAD指向的分支。

git branch -v:列出所有分支和每个分支的最后一次提交。

git branch [--no] --merged:查看哪些分支已合并(未合并)到当前分支。

git log --oneline --decorate:查看各个分支所指向的对象,HEAD指向当前指针所在的分支。

git log --oneline --decorate --graph --all:查看分支的分叉情况。

git merge <branch-name>:将指定分支合并到当前分支(即HEAD指向的分支)。

git rebase <branch-name>:以变基的方式将指定分支合并到当前分支。

远程仓库

git remote [-v]:查看所有远程服务器的简写或[详细信息]。

git remote add <remote-name> <url>:添加一个远程仓库,<url>是远程仓库地址,<remote-name>是自定义的远程仓库标签。

git fetch <remote-name>:拉取远程仓库中有但本地没有的信息。

git push <remote-name> <branch-name>:将分支 <branch-name> 推送到远程仓库 <remote-name>,使用clone克隆一个远程仓库时会自动将远程仓库命名为origin

git remote show <remote-name>:查看一个远程仓库的信息。

git remote rename <old-name> <new-name>:修改远程仓库的名字。

git remote rm <remote-name>:移除一个远程仓库。


Git 多账户配置

以创建两个账号为例:

  1. 清除设置的全局邮箱和用户名

  2. 生成 账户一账户二sshkey 并命名为 id_rsa_oneid_rsa_one

    ssh-keygen -t rsa -C "one@email.com"
    ssh-keygen -t rsa -C "two@email.com"
    

    在创建 sshkey 的时候可以修改默认名称,如图:

  3. ./ssh 目录下创建 config 文件,现在两个账户连接的都是 github ,文件内容如下:

    # server one
    Host git@github.com # 服务器别名
    HostName git@github.com # 服务端地址
    User _Name_ # 用户名
    PreferredAuthentications publickey # 验证方式,这里选 SSH
    IdentityFile ~/.ssh/id_rsa # 连接使用的 SSH 文件
    # server two
    Host git@github.com
    HostName git@github.com
    User _Name_
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_two
    
  4. SSH 公钥写入到要连接的仓库上。

  5. 检查连接是否成功

    ssh -T git@gitlab.fe-iu.com
    
    // 成功会输出 Welcome to ........
    
  6. 如果连接不成功的话使用一下步骤:

    进入 .ssh 文件夹

    查看文件内容: ls

    启用 ssh-agent: ssh-agent bash

    将所有账户的私钥加入管理: ssh-add 私钥名称

  7. 最后 .ssh 文件目录如下:

  8. 注意之后的 git 操作要在 ssh-agent 启动的状态下运行。