美文网首页docker&Jkenkis&maven程序员
Git - 基础(持续更新中)

Git - 基础(持续更新中)

作者: 村长225 | 来源:发表于2018-07-31 12:49 被阅读133次

理解

快照而非增量更新

增量更新

其它版本系统把版本看成一组基础文件以及在上面进行的增量操作。


快照

Git把版本看成一组文件的快照,每一次提交保存的都是文件在提交时刻的状态。

操作本地化

由于Git在本地保存了完整的仓库,因此除非你需要与远程同步代码,或者推送代码到远程仓库,几乎所有操作都可以在本地进行。在没有网络或者VPN的时候,你依然可以修改提交代码,查看文件历史版本,创建新分支或者合并分支。

完整性保障

Git内部使用SHA-1哈希算法来计算文件、目录结构或提交信息的校验值。使用Git时你会看到大量类似这样的24b9da6552252987aa493b52f8696cd6d3b00373校验值。Git内部数据库使用文件内容的校验值而非文件名来保存文件。因此你不可能避开Git而随意修改文件内容、目录结构或者提交信息。举个简单的例子,提交信息中包含目录结构校验值,目录结构中包含文件的校验值;如果修改了文件内容,那么文件校验值会随之改变,进而会导致目录结构校验值改变,最终会导致提交校验值改变。(有点像区块链)

只增加数据

Git通常指往仓库增加数据,你很难主动删除已经保存在仓库的内容。在未提交的时候,你可能丢失数据或者弄乱文件,但是一旦你提交到仓库中,你就很难把数据删除了。所以在使用git时你可以做各种各样的实验,而不用担心把已提交数据弄乱。

工作区域与文件状态

工作区、暂存区和Git仓库

三个工作区域 - 工作区、暂存区和Git仓库

  • 工作区 - 从仓库中检出(checkout)的特定版本文件,供你使用和修改
  • 暂存区 - 暂存区域是一个文件,用于保存下次提交的文件列表信息
  • Git仓库 - Git用来保存项目元数据和对象数据库的地方(.git/)

四种文件状态 - 未跟踪、已修改、已暂存和已提交

  • 未跟踪 - 所有未纳入Git管理的文件都处于未跟踪(untracked)状态
  • 已跟踪 - 所有已纳入Git管理的文件都处于已跟踪(tracked)状态
    • 未修改 | 已提交 - 当你将已暂存文件提交到本地仓库中时,文件处于未修改(unmodified)或者叫已提交(committed)状态
    • 已修改 - 当文件在工作区中被修改时,文件处于已修改(modified)状态
    • 已暂存 - 当一个已修改文件被标记用于下次提交时,文件处于已暂存(staged)状态

文件状态生命周期

文件状态生命周期
  • 未跟踪 → 已暂存:将新文件纳入Git管理
  • 未修改 → 已修改:修改工作区文件
  • 已修改 → 已暂存:将工作区修改好的文件添加到暂存区
  • 未修改 → 未跟踪:将原先由Git管理的文件移除管理
  • 已暂存 → 未修改:将暂存区的文件提交

基本工作流

  1. 在工作目录中修改文件
  2. 暂存已修改文件,这会将文件快照放入暂存区域
  3. 提交更新,生成一次新的提交,该提交会保存暂存区域所有文件的快照并将其永久存储到Git仓库

配置

配置文件路径

  • /etc/gitconfig - 全局配置文件,使用git config --system option value来进行配置
  • ~/.gitconfig - 单用户配置文件,使用git config --global option value来进行配置
  • .git/config - 单仓库配置文件,仓库根目录使用git config option value来进行配置

备注1:配置优先级 - 单仓库配置文件 > 单用户配置文件 > 全局配置文件
备注2:可以使用git config --system --edit | git config --global --edit | git config --edit来直接编辑配置文件

必要配置

  • 配置用户名 - git config --global user.name "Jian Zhang"
  • 配置邮箱 - git config --global user.email zhangjian@example.com

SSH公钥配置

目的:允许使用SSH协议克隆仓库、拉取以及推送代码
优点:一次配置,永久生效,无需每次输入用户名和密码
示例:git clone git@github.com:google/guava.git

使用SSH协议与远程仓库交互
生成SSH公钥和私钥
$ ssh-keygen -t rsa -b 4096 -C "zhangjian@example.com" # 之后一直回车即可

将SSH公钥内容复制粘贴到GitHub账号设置

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCu5ncRBtZCASrIAcHob+ZUQcHj+rQPEQJwGQbSYsGfLW8vpwVVC+8kMofXtkda2MBuZVApFfYg3UPojFz/m1XkqhKFyYIa/xqeqWiVDuMXznhf++/t1jYu8kUXTWqqYcQXMse4LIuNVXvfbQ4Jy+ZIg8Iw0XSXHpy4UevXpUdkzEExkT4ar0asdfa2b5Z/3kjbWRlHaJms9K13FH4G4glNY5oFC0kuvYJDxxxG4EscFHbkE58kEMk3e/CtYVcdSV5fMYXP2y60bLT+L5Ac2y+qDjuLcNX1BAF7/S9/eNXySe98CBbejDJTO2bzDQmixZwrq0LqNLxXMHOAl/Is5 zhangjian@example.com
GitHub SSH公钥配置

可选配置

配置别名

  • git co - git config --global alias.co checkout
  • git br - git config --global alias.br branch
  • git ci - git config --global alias.ci commit
  • git st - git config --global alias.st status

配置编辑器

  • git config --global core.editor vim | git config --global core.editor emacs

配置命令

  • git config option - 查询单个配置信息
$ git config user.name
Jian Zhang
  • git config -l | git config --list - 查询所有配置信息
$ git config -l
user.name=Jian Zhang
user.email=zhangjian@example.com
alias.co=checkout
alias.br=branch
alias.ci=commit
alias.st=status
core.editor=vim

帮助

  • git --help - 获取帮助
  • git help command | git command --help | man git-command - 获取单个命令帮助

资源

初始化仓库

  • git init - 在已有目录中初始化仓库
$ mkdir project && cd project && git init
Initialized empty Git repository in /Users/zhangjian/workspace/project/.git/
$ tree -a
.
└── .git
    ├── HEAD
    ├── config
    ├── description
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   ├── prepare-commit-msg.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags

9 directories, 14 files
  • git clone URL - 从远程仓库克隆已有项目
$ git clone git@github.com:google/guava.git # 使用SSH协议
$ git clone https://github.com/google/guava.git # 使用HTTPS协议

基础操作

  • git add file | git add directory - 跟踪新文件
$ touch README; git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)
---------------------------------------------------------------------------------------------------
$ git status -s
?? README # 此处??为红色,代表文件未被跟踪
---------------------------------------------------------------------------------------------------
$ git add README; git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   README

---------------------------------------------------------------------------------------------------
$ git status -s
A  README # 此处A为绿色,代表文件为新添加文件,并且已经暂存
  • git add file - 暂存已修改文件
$ echo "abc" > README; git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   README

no changes added to commit (use "git add" and/or "git commit -a")
---------------------------------------------------------------------------------------------------
$ git status -s
 M README # 此处M为红色,在右边,代表文件已修改但是未暂存
---------------------------------------------------------------------------------------------------
$ git add README; git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   README

---------------------------------------------------------------------------------------------------
$ git status -s
M  README # 此处M为绿色,在左边,代表文件已修改并且已暂存
  • git status | git status -s - 查看文件状态
    • ?? - 该文件未被跟踪,未纳入Git管理
    • _M - 该文件已修改,但是尚未暂存
    • M_ - 该文件已修改,并且已经暂存
    • MM - 该文件已修改,并且已暂存,但是暂存之后再次被修改,再次修改的内容尚未暂存
    • 待补充
$ touch README; git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)
---------------------------------------------------------------------------------------------------
$ git status -s
?? README

提交

移除文件

移动文件 | 重命名文件

忽略文件

查看提交历史

撤销操作

远程仓库

打标签

相关文章

  • Git - 基础(持续更新中)

    理解 快照而非增量更新 其它版本系统把版本看成一组基础文件以及在上面进行的增量操作。 Git把版本看成一组文件的快...

  • Git(持续更新中)

    一.一些包 git-gui: Git的一种基于Tcl/TK的图形用户界面;gitk:是另一种用于Tcl/T编写的但...

  • git全集「持续更新中。。。」

    写在前面 谁都想岁月静好,可现实是大江东流。你只有努力奔跑,才能留在原地。 岁月匆匆,时不我待,莫辜负大好时光,只...

  • Swift:概念解释

    持续更新中... github:Swift基础实例github:SwiftBasicTableView type ...

  • git 持续更新

    查看分支:git branch 创建分支:git branch 切换分支:git checkout ...

  • 2.3 Git 基础 - 查看提交记录

    提交记录git log 2.2 Git 基础 - 记录每次更新到仓库(删除和改名)2.4 Git 基础 - 撤销操...

  • Git 随手记(持续更新中...)

    一、git clone 部分文件/文件夹 在进行项目开发时,我们有时候会遇到这样一种需求:整个的 project ...

  • Git常用基础语句整合(持续更新)

    一、提交 二、分支 三、实用

  • git基础操作

    GitHub(持续更新中) 一、克隆项目到本地 1、在桌面上右击点git bash here 2、输入 git c...

  • git

    Git 基础 最近更新 Git Flow 明日更新 From 2018年6月11日22:55:11

网友评论

  • 张建脑残粉:学习了,有好多地方还是不是太明白,平时只是用,缺从来没想过底层的实现,感谢大神的分享!
    村长225:@张建脑残粉 后面会写更底层的一些东西,这些还只是表面

本文标题:Git - 基础(持续更新中)

本文链接:https://www.haomeiwen.com/subject/ffucvftx.html