docker&Jkenkis&maven程序员

Git - 基础(持续更新中)

2018-07-31  本文已影响133人  村长225

理解

快照而非增量更新

增量更新

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


快照

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

操作本地化

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

完整性保障

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

只增加数据

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

工作区域与文件状态

工作区、暂存区和Git仓库

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

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

文件状态生命周期

文件状态生命周期

基本工作流

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

配置

配置文件路径

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

必要配置

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 config user.name
Jian Zhang
$ 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

帮助

资源

初始化仓库

$ 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 git@github.com:google/guava.git # 使用SSH协议
$ git clone https://github.com/google/guava.git # 使用HTTPS协议

基础操作

$ 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为绿色,代表文件为新添加文件,并且已经暂存
$ 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为绿色,在左边,代表文件已修改并且已暂存
$ 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

提交

移除文件

移动文件 | 重命名文件

忽略文件

查看提交历史

撤销操作

远程仓库

打标签

上一篇下一篇

猜你喜欢

热点阅读