版本控制 | Git

一、Git 下载与配置

1.1 下载地址:

Windows: https://git-scm.com/download/win
Mac: https://git-scm.com/download/mac
Linux/Unix: https://git-scm.com/download/linux

1.2 配置

/*配置 user.name 和 user.email*/
$ git config --global user.name ‘your_name’
$ git config --global user.email ‘’

$ git config --local  user.name ‘your_name’    # local 只对某个仓库有效
$ git config --global user.name ‘your_name’    # global 对当前用户所有仓库有效
$ git config --system user.name ‘your_name’    # system 对系统所有登录的用户有效
优先级排序:local > global
/*查看配置信息*/
$ git config --list --local
$ git config --list --global
$ git config --list --system

二、建立 git 仓库

2.1 建立本地 git 仓库

$ cd 项目目录
$ git init                       # 在当前目录下增加一个 .git 目录。
$ git init <directory>           # 指定目录创建空的 git 仓库,创建一个名为 directory,只包含 .git 子目录的空目录。

2.2 从远端 git 仓库拉取

$ git clone <repo>               # 位于 <repo> 的仓库克隆到本地。
$ git clone <repo> <directory>   # 位于 <repo> 的仓库克隆到本地。

2.3 git 传输协议:

* 本地协议:/path/to/repo.git 与 file:///path/to/repo.git。
* http/https 协议:网络协议。
* ssh 协议:常用的智能协议,需要公私钥。
    * 哑协议:   哑协议传输进度不可见,只能协议传输可见。
    * 智能协议:智能协议比哑协议传输速度快。

$ git clone --bare  /path/.git git_name.git (哑协议)
$ git clone --bare  file:///path/.git git_name.git (智能协议)

三、提交 commit

git 提交流程:当前项目 -> git add -> 暂存区 -> git commit -> Git仓库

$ git status                         # 查看 git 当前状态。
$ git add files                      # 添加文件到暂存区。
$ git add -u                         # -u 是 update 的意思,保存修改和删除,不包括新建文件。
$ git add -A                         # -u 是 all 的意思,将文件的修改,文件的删除,添加到暂存区。
$ git add .                          # 保存新的添加和修改,但是不包括删除。

$ git commit -m ‘Add Info’           # 提交暂存区信息到 git 仓库。
$ git commit --amend                 # 对最近一次提交的 message 进行变更。

$ git push                           # 将提交的更改发送到远端仓库。    
$ git push origin master             # 将本地的 master 分支推送到 origin 主机的 master 分支。

四、分支操作

$ git checkout                       # 检出文件、检出提交、检出分支(检出提交会使工作目录和这个提交完全匹配。)    
$ git checkout master                # 回到 master 分支
$ git checkout commit_id file        # 查看某个分支下的 file 文件
$ git checkout -b dev                #  创建并切换分支
$ git branch                         #  查看本地分支
$ git branch -r                      #  查看远程分支
$ git branch -a                      #  查看本地和远程分支
$ git branch -d branchName           #  删除本地分支
$ git branch -d -r branchName        #  删除远程分支
$ git branch -D branchName           #  强制删除 branchName 分支
$ git branch -v                      #  查看本地分支信息
$ git branch -vv                     #  查看更多本地分支信息
$ git branch -av                     #  查看所有分支信息
$ git branch -m oldbranch newbranch  # 重命名分支
$ git branch -M oldbranch newbranch  # 强制重命名分支

五、查看 git 版本状态

commit 32d61abce038708176d1e0e409d1c2575a12f8fb ( 提交内容 SHA-1 校验总和 checksum ) 
Author: xxx <>
Date:   Tue Jan 7 18:27:24 2020 +0800
               
$ git log                            # 查看 git 上传管理日志 git 的版本历史。(当前分支)
$ git log -all                       # 查看 git 上传管理日志 git 的版本历史。(所有分支)
$ git log —-stat                     # 查看哪些文件被更改了,以及每个文件相对的增删行数。
$ git log -p                         # 显示每个提交全部的差异(diff)。
$ git log --oneline                  # 让提交记录在一行展示(展示一行)。
$ git log --oneline —all             # 让提交记录在一行展示(展示所有)。
$ git log --oneline --all -n4        # 让提交记录在一行展示(展示所有分支最近的 4 条记录)。
$ git log --oneline --all -graph     # 让提交记录在一行展示, 展示方式为图表的方式。
$ git log --author=“<pattern>”       # 查看指定作者的提交

六、设置不需要 git 管理的文件夹

配置 .gitignore 文件(文件名必须为 .gitignore)
folder/
*fiels
...

七、多人协作

$ git remote                         # 允许你创建,查看和删除与其他仓库之间的连。列出你和其他仓库之间的连接
$ git remote -v                      # 列出你和其他仓库之间的连接并显示每个连接的 url。
$ git remote add <name> <url>        # 创建一个新的远程仓库连接,添加之后,可将<name> 作为 <url> 便捷的别名在其他 git 命令中使用。
$ git remote rm <name>               # 移出别名为 name 的远程仓库连接。
$ git remote rename <old-name> <new-name>   
                                     # 移出别名为 name 的远程仓库连接。

$ git fetch <remote>                 # 将提交从远程仓库导入到你的本地仓库。

$ git pull <remote>                  # 相当于 git fetch + git merge。
$ git pull —rebase <remote>          # git rebase 合并远程分支和本地分支,不是 git merge。

$ git push                           # 将本地仓库中的提交转移到远程仓库中时要做的事。
$ git push <remote> <branch>         # 将指定的分支推送到 <remote> 。
临时修复
$ git stash                            # 将当前工作区临时存储。
$ git stash list                       # 查看临时存储。
$ git stash apply                      # 恢复临时存储到工作区,不删除 stash list 保留信息。
$ git stash pop                        # 恢复临时存储到工作区,删除 stash list 保留信息。
回滚错误修改
$ git revert                           # 用来撤销一个已经提交的快照。(本地已修改代码会删除)
$ git rebase                           # 变基操作(将当前分支  rebase 到 <base> )
举例:正在 A 分支下开发, master 发现了个错误需要修改
$ git checkout -b bugfix master        # 基于 master 分支创建一个快速修复分支
$ git commit -a -m ‘Fix bug’           # 提交所有修改的分支。
$ git checkout master                  # 合并回到 master
$ git merge bugfix                     # 合并修复的 bug
$ git branch -d bugfix                 # 删除 bug 修复分支
$ git checkout A                       # 回到 A 分支
$ git rebase master                    # 将 A 分支指向 master 分支的末端

八、常用命令

变更 message
$ git commit —amend                    # 变更最近一次的 commit message 信息。
$ git rebase -i super_commit_id        # 变更指定的 commit, super_commit_id(父亲 commit),
                                         变基操作团队开发时要注意,变更后 commit_id 会依次更改。
整理 commit 
$ git rebase -i super_commit_id        # squash 命令 合并分支。(合并连续的commit)
$ git rebase -i super_commit_id        # s 命令拼接commit     (修改 pick 顺序,将待合并的放到一起)
                                       # pick commit_1 
                                       # s commit_2
比较文件差异
$ git diff e1506a e1506a               # 比较两个分支间的不同。
$ git diff HEAD HEAD^1                 # 比较 HEAD 与 HEAD 的父亲。
$ git add files                        
$ git diff --cached                    # 比较暂存区与 HEAD 文件之间的差异。
$ git diff                             # 比较工作区与暂存区之间的差异。
$ git diff branch_a branch_a files     # 比较不同分支下的相同文件之间的差异。
暂存区操作 ( reset )
$ git reset HEAD                       # 取消暂存区所有文件 >> 保留工作区->取消暂存区。
$ git reset HEAD -- files              # 取消暂存区制定文件 >> 保留工作区->取消暂存区。
$ git reset --hard commit_id           # 删除指定的提交 commit
文件操作
$ git rm files                         # 删除指定文件 = rm files + git rm files。
$ git mv file newfile                  # 重命名 git 暂存区与 git 仓库中的文件信息。
图形化界面
$ gitk                                 # 通过图形化界面查看 git

九、分离头指针(detached HEAD)

当前正工作在没有分支的情况下。
(当你切换到 master 分支上处理事情的时候,在没有分支的状态下编写的变更,分离头指针上面的变更可能会被清除掉。)

$git log
commit e1506a04abbee1b5545bedcdca8b40f7d628d545 (HEAD -> master)   # 指向 master 的分支。

十、git 目录

.git % ls
COMMIT_EDITMSG    config        gitk.cache    index        logs        refs
HEAD        description    hooks        info        objects
 .git % ls -al
total 48
drwxr-xr-x  13 xx  staff  416  1  4 11:04 .
  7 xx  staff  224  1  4 10:40 ..
-rw-r--r--   1 xx  staff    5  1  4 10:40 COMMIT_EDITMSG
-rw-r--r--   1 xx  staff   23  1  4 09:56 HEAD                 // 本地目录的引用。
-rw-r--r--   1 xx  staff  137  1  4 09:56 config               // 本地配置信息
-rw-r--r--   1 xx  staff   73  1  4 09:56 description
-rw-r--r--   1 xx  staff  129  1  4 11:04 gitk.cache
drwxr-xr-x  14 xx  staff  448  1  4 09:56 hooks
-rw-r--r--   1 xx  staff  270  1  4 10:40 index
drwxr-xr-x   3 xx  staff   96  1  4 09:56 info
drwxr-xr-x   4 xx  staff  128  1  4 09:57 logs
drwxr-xr-x  11 xx  staff  352  1  4 10:40 objects             // 核心 commit,tree,blob
drwxr-xr-x   4 xx  staff  128  1  4 09:56 refs                // 分支,tag 信息

git 对象 commit,tree,blob,三者之间的关系:

  • git 中文件的存储 blob 不是由文件名存储的,是按文件的内容存储的,文件内容相同,在 git 中就代表相同的东西。
  • 查看文件信息命令:$ git cat-file -p commit_id
  • commit
    • tree
      • blob
      • blob
    • parent
      • tree
        • blob
      • author
      • committer
    • author
    • committer
      测试 git 中文件结构为 /doc/README.md,README.md 内容为 hello, world 时:
      当执行了 git add files 和 git commit 时 objects 目录中发生了什么

1、git add files

% find objects -type f
objects/4b/5fa63702dd96796042e92787f464e28f09f17d
% git cat-file -t 4b5fa63702 
blob
目标文件中创建了blob,blob 的信息为:hello, world

2、git commit

% find .git/objects -type f
.git/objects/3c/4fde2ab9b012a02b1d2c67bb66c0b7339e1fbc   (tree / doc)
.git/objects/4b/5fa63702dd96796042e92787f464e28f09f17d   (blob / data)
.git/objects/96/4acce37de78ac2e818af6ee7b46a85ba65883b   (commit / 提交请求)
.git/objects/46/fa040ce9c80920d335d5b0c654f33e6ee3431b   (tree / README.md)
% git cat-file -t 3c4fde2a      % tree 
% git cat-file -p 3c4fde2a      % 040000 tree 46fa040ce9c80920d335d5b0c654f33e6ee3431b    doc
% git cat-file -t 4b5fa637      % blob
% git cat-file -p 4b5fa637      % hello, world
% git cat-file -t 964acce3      % commit
% git cat-file -p 964acce3      % tree 3c4fde2ab9b012a02b1d2c67bb66c0b7339e1fbc
                                  author kong <> 1578211573 +0800
                                  committer kong <> 1578211573 +0800
                                  CREATE FILE
% git cat-file -t 46fa040c      % tree
% git cat-file -p 46fa040c      % 100644 blob 4b5fa63702dd96796042e92787f464e28f09f17d    README.md

Reference From:
https://git-scm.com/docs
https://github.com/geeeeeeeeek/git-recipes/wiki

相关推荐