当前位置:   article > 正文

【工具篇-Git】Git配置管理工具

【工具篇-Git】Git配置管理工具

【工具篇-Git】Git配置管理工具

一、入门

1. 简介

Git

Git是一个分布式版本管理系统(VCS),最早由Linux之父Linus使用C语言开发,主要有以下四个概念:

  • Workspace:工作区,即工作目录
  • Index / Stage:暂存区,指.git目录下的index文件
  • Repository:仓库区或本地仓库,就是工作目录下的隐藏目录.git
  • Remote:远程仓库,一般是代码托管平台上或服务器上搭建的的仓库

2. 安装

  1. 查看git
    命令行输入git查看是否已安装git

  2. 安装git

    • Windows/Mac
      在Git官网下载安装程序,然后按照提示安装即可

    • Linux
      命令行输入:

        sudo apt-get install git   
      
      • 1

3. 配置

命令行输入:

git config --global user.name <user-name>  
git config --global user.email <user-email>  
  • 1
  • 2

其中,<user-name>是用户名,<user-email>是用户邮箱

  • 说明
    • --system参数将配置应用于所有用户
    • --global参数将配置应用于本用户
    • --local参数将配置应用于本仓库

4. git入门示例

  1. 创建仓库

    1. 新建空目录gitdemo,并进入到gitdemo
    2. 命令行输入git init命令初始化仓库。这时该目录下会多出一个.git隐藏目录
  2. 编辑文件
    在gitdemo(或其子目录)下新建文本文档readme.txt,内容如下:

    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    
    • 1
    • 2
  3. 添加到仓库

    1. 命令行输入如下命令把工作区中的内容添加到暂存区

      git add readme.txt  
      
      • 1
    2. 命令行输入如下命令把暂存区中的内容提交到版本库

      git commit readme.txt -m "the first commit"    
      
      • 1

二、版本管理

1. 创建仓库

  1. 进入已有目录或新建空目录(推荐)并进入
  2. 使用git init命令初始化仓库
    注意
    git只能跟踪文本文件的变化,例如.txt, .html, .java等;对于二进制文件,只能进行管理,无法跟踪变化,例如.docx, .img等

2. 添加到仓库

  1. 使用git add <file>命令把工作区中文件<file>变化添加到暂存区

  2. 使用git commit <file> -m <comment>命令把暂存区中的内容提交到版本库,其中,-m 参数和后面的说明<comment>可以省略,但为了查找方便,建议添加说明,例如:

    git commit -m "the fitst commit"  
    
    • 1

3. 版本回退

  1. 使用git log --pretty=oneline命令按照从近到远的顺序显示提交历史,--pretty=oneline参数表示只显示精简信息,可以省略,例如:

    git log  
    
    • 1
  • 说明
    • HEAD表示最新提交的版本,HEAD^表示上一个提交的版本, HEAD^^表示上上一个提交的版本……依此类推
    • HEAD~<n>表示最新提交之前的第<n>个版本
  1. 使用git reset --hard <version>命令回退到<version>标识的版本,其中<version>可以用HEAD格式表示,也可以用<commit id>表示(可以不写全),例如回退到上一个版本(9bd243df8476a7b4e1a6eba21f2433789a79e673标识的版本):

    git reset --hard HEAD^  
    
    • 1

    git reset --hard 9bd243  
    
    • 1
  • 说明

    • 使用<commit id>可以回退版本,也可以在回退后恢复到回退前的版本,例如,如果当前已经回退到9bd243df8476a7b4e1a6eba21f2433789a79e673所标识的版本之前,恢复到该版本可以使用如下命令:

      git reset --hard 9bd243  
      
      • 1
    • 如果忘记了commit id,可以使用git reflog命令查看命令历史

4. 查看状态

git status命令查看状态信息

5. 查看区别

git diff <version> -- <file>命令显示版本库中<version>标识的版本和工作区中版本的差别,例如显示版本库中readme.txt的最新版本和工作区中版本的差别

git diff HEAD -- readme.txt  
  • 1

6. 撤销修改

  1. 如果已经把变动添加到暂存区,使用git reset HEAD <file>命令撤销暂存区中的变动
  2. 命令git checkout -- <file>撤销工作区中文件<file>的所有变动,回退到最近一次git addgit commit的状态
    注意
    区分git checkout -- <file>git checkout <branch>

7. 删除文件

  1. git rm <file>命令删除暂存区文件
  2. 如果要删除删除版本库中的文件,再执行git commit命令提交暂存区即可
  3. 如果要恢复工作区中的文件,使用git checkout -- <file>撤销工作区中的变动(这里是指删除)即可

三、远程仓库

1. 添加远程仓库

  1. 在github或gitee等支持Git的平台上创建一个仓库,例如仓库gitdemo
  2. 使用git remote add origin <repo-name>命令关联远程仓库<remote-repo>,其中,origin是惯用名,可以根据需要更改,例如改为giteegithub
  3. 使用git push origin <branch-name>命令将当前分支推到远程仓库的<branch-name>分支。第一次推送时,-u参数把本地分支和远程仓库分支关联起来,可以简化后续使用时的命令

2. 删除远程仓库

git remote rm <remote-repo>命令删除远程仓库<remote-repo>,建议删除前先查看远程仓库信息

3. 查看远程仓库

  • git remote命令查看远程仓库的信息
  • git remote -v命令查看远程仓库的详细信息

4. 克隆远程仓库

git clone <remote-repo>命令克隆远程仓库<remote-repo>到本地
注意
Git执行多种协议,如ssh、https等,推荐使用ssh协议

5. 抓取远程分支

git pull <remote-repo>命令抓取远程仓库<remote-repo>到本地

四、分支管理

1. 创建分支

  • git branch <branch-name>命令创建一个新的分支,名字为<branch-name>,例如:

    git branch dev  
    
    • 1

    新版Git可使用git switch <branch-name>命令

  • git chechout -b <branch-name>命令创建并切换到分支<branch-name>,例如:

    git checkout -b dev  
    
    • 1

    新版Git可使用命令git switch -b <branch-name>

  • git checkout -b <branch-name1> origin/<branch-name2>命令在本地创建与远程分支<branch-name2>对应的分支<branch-name1>,并切换到该分支,建议<branch-name1><branch-name2>名字相同

2. 切换分支

git chechout <branch-name>命令切换当前分支为<branch-name>,例如:

git checkout dev  
  • 1

3. 查看分支

  • git branch命令查看所有分支,其中当前分支前用*标识
  • git log --graph命令查看含有分支合并图的历史信息

4. 合并分支

  • git merge <branch-name>命令将分支<branch-name>合并到当前分支,例如:

    git merge dev  
    
    • 1

    --no-ff参数表示不使用Fast forward合并模式,而是使用基础合并(新的提交),此时建议使用-m参数指定提交说明

  • 注意

    • Fast forward合并模式是指合并时,将当前分支指针指向待合并分支指针所指的版本
    • 合并分支冲突时需要先解决冲突,然后再提交,合并后完成合并
  • git cherry-pick <commit id>命令将<commit id>标识的版本合并到当前分支,例如:

    git cherry-pick 9bd243  
    
    • 1

    其中,9bd243df8476a7b4e1a6eba21f2433789a79e673是一个版本标识

5. 删除分支

  • git branch -d <branch-name>命令删除分支<branch-name>,例如:

    git branch -d dev  
    
    • 1
  • git branch -D <branch-name>命令强行删除分支<branch-name>,例如:

    git branch -D dev  
    
    • 1

6. 关联分支

git branch --set-upstream-to <branch-name1> origin/<branch-name2>命令将本地分支<branch-name1>与远程分支<branch-name2>关联起来

7. rebase

git rebase命令将交叉分支整理成直线分支

8. 管理未提交分支

  • git stash命令保存正在进行的未提交分支的工作现场

  • git stash list命令查看保存的现场

  • git stash apply命令恢复保存的现场

  • git stash drop命令删除保存的现场

  • git stash pop命令恢复并删除保存的现场
    例如:
    一次bug修复前:

      git stash  
    
    • 1

    bug修复后:

      git stash apply  
      git stash drop  
    
    • 1
    • 2

      git stash pop  
    
    • 1

分支策略

  • master分支:非常稳定,仅用来发布新版本,时刻与远程同步
  • dev分支:不稳定,供开发使用,发布新版本时合并到master分支,时刻与远程同步
  • bug分支:本地修复bug,无需推送到远程
  • other分支:每个人在自己的分支上工作,并合并到dev分支

多人协作

  1. 尝试git push origin <branch-name>推送自己的变动
  2. 如果推送失败,使用git pull抓取以合并分支;如果提示no tracking information,则使用git branch --set-upstream-to <branch-name1> origin/<branch-name2>
  3. 如果合并冲突,则解决冲突,并在本地提交
  4. 如果没有冲突或已经解决了冲突,使用git push origin <branch-name>推送

五、标签管理

1. 创建标签

  • git tag <tag-name>命令创建一个标签<tag-name>,例如:

    git tag v1.0.0  
    
    • 1
  • git tag <tag-name> <commit id>命令为<commit id>标识的版本创建标签<tag-name>

  • git tag -a <tag-name> -m <comment> <commit id>命令为标签<tag-name>指定说明<comment>

2. 查看标签

  • git tag命令查看标签,其中标签按字母顺序排列
  • git show <tag-name>命令查看标签说明

3. 删除标签

  1. git tag -d <tag-name>命令删除标签<tag-name>
  2. 如果标签推送到远程,删除远程标签应再执行命令git push origin :refs/tags/<tag-name>

4. 推送标签

  • git push origin <tag-name>命令推送标签到远程(创建的标签都在本地,不会自动推送到远程)
  • git push origin --tags命令推送尚未推送的所有标签到远程

六、自定义Git

1. 忽略特殊文件

  1. 在工作区创建.gitignore文件,然后把需要忽略的文件名或规则填写到该文件中去。该文件本身需要放到版本库中进行管理
  2. 使用git status命令检查上述文件中的规则是否正确。规则中,*表示匹配所有,!表示不匹配
  3. 如果不正确,使用命令git check-ignore -v <file>检查规则

2. 配置别名

  • git config --global alias.<alias> <name>命令为<name>配置别名<alias>,例如:

    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"  
    
    • 1
  • .git/config文件是Git的配置文件,[alias]后是已经配置的别名

文件忽略原则

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

七、常用命令

1. 配置Git

# 显示配置信息
$ git config --list

# 编辑配置文件
$ git config -e [--global]

# 配置用户信息
$ git config [--global] user.name [<user-name>]
$ git config [--global] user.email [<user-email>]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2. 新建仓库

# 当前目录下新建仓库
$ git init

# 新建目录并将其初始化为仓库
$ git init [<dir>]

# 克隆项目及其提交历史
$ git clone [<url>] 

# 克隆项目及其提交历史,并指定本地文件夹名称
$ git clone [<url>] [<dir>]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3. 添加

# 添加指定文件到暂存区
$ git add [<file1>] [<file2>] ...

# 添加指定目录及其子目录到暂存区
$ git add [<dir>]

# 添加当前目录下所有文件、文件夹到暂存区
$ git add .

# 分多次提交同一文件的多处变动,添加每个变动都需要确认
$ git add -p
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4. 删除

# 删除工作区中指定文件,并在暂存区记录本次删除
$ git rm [<file1>] [<file2>] ...

# 停止追踪指定文件,但该文件仍保留在工作区
$ git rm --cached [<file>]

# 更改文件名,并在暂存区记录本次变动
$ git mv [<old-name>] [<new-name>]  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5. 提交

# 提交暂存区所有内容到仓库
$ git commit -m [<comment>]

# 提交暂存区的指定文件到仓库
$ git commit [<file1>] [<file2>] ... -m [<comment>]

# 提交自上次提交后工作区的变动到仓库
$ git commit -a

# 提交时显示所有变动信息
$ git commit -v

# 替代上一次提交
$ git commit --amend -m [<comment>]

# 重做上一次提交,同时提交指定文件的变化
$ git commit --amend [<file1>] [<file2>] ...  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

6. 撤销

# 恢复暂存区的指定文件到工作区
$ git checkout [<file>]

# 恢复某次提交中的指定文件到暂存区和工作区
$ git checkout [<version>] [<file>]

# 恢复暂存区的所有文件到工作区
$ git checkout .

# 暂存区中的指定文件重置为上一次提交的版本,但工作区不变
$ git reset [<file>]

# 暂存区与工作区重置为上一次提交的版本
$ git reset --hard

# 当前分支的指针重置为指定提交,并重置暂存区为该提交的版本,但工作区不变
$ git reset [<version>]

# HEAD指针重置为指定提交,同时重置暂存区和工作区为该提交的版本
$ git reset --hard [<version>]

# HEAD指针重置为指定提交,但保持暂存区和工作区不变
$ git reset --keep [<version>]

# 当前分支新建提交,并将指定的版本撤销到该提交
$ git revert [<version>]

# 存储并移除未提交的变动
$ git stash

# 存储的未提交变动移入工作区,但不删除存储
$ git stash apply

# 删除存储的未提交变动
$ git stash drop

# 存储的未提交变动移入工作区,并删除存储
$ git stash pop
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

7. 查看

# 显示文件的变化
$ git status

# 显示文件变化的简短信息
$ git status -s

# 显示当前分支的提交历史
$ git log

# 显示当前分支的提交历史和每次提交发生变动的文件
$ git log --stat

# 图形化显示分支合并历史
$ git log --graph    

# 显示每次提交的tag信息
$ git log --decorate

# 显示指定作者的提交历史
$ git log --author=[<author-name>]    

# 显示根据时间筛选的log信息
$ git log [--since] [--util] [--before] [--after]

# 根据关键词搜索提交历史
$ git log -S [<keyword>]

# 显示某次提交之前的所有提交说明,每个说明占一行
$ git log [<tag>] <version> --pretty --oneline

# 显示某次提交之前符合搜索条件的所有提交说明
$ git log [<tag>] <version> --grep <condition>

# 显示某个文件包括改名在内的提交历史
$ git log --follow [<file>]
$ git whatchanged [<file>]

# 显示指定文件的每一次变动
$ git log -p [<file>]

# 显示最近n次提交
$ git log -<n> --pretty --oneline

# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn

# 显示指定文件的修改者、修改时间、修改内容等历史信息
$ git blame [<file>]

# 显示暂存区和工作区的差异
$ git diff

# 显示暂存区中指定文件和上一次提交的差异
$ git diff --cached [<file>]

# 显示工作区与当前分支最新提交的差异
$ git diff HEAD

# 显示两个分支分开后的差异
$ git diff [<version1>]...[<version2>]

# 显示未提交的变动行数
$ git diff --shortstat "@{0 day ago}"

# 显示某次提交的元数据和内容变化
$ git show [<version>]

# 显示某次提交发生变动的文件
$ git show --name-only [<version>]

# 显示指定提交中指定文件的变动内容
$ git show [<version>]:[<file>]

# 显示当前分支的最近提交
$ git reflog
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

8. 远程同步

# 获取远程仓库的所有变动
$ git fetch [<remote-repo>]

# 显示所有远程仓库
$ git remote -v

# 显示某个远程仓库的信息
$ git remote show [<remote-repo>]

# 增加一个新的远程仓库,并命名
$ git remote add [<repo-name>] [<url>]

# 获取远程仓库的变动,并与本地分支合并
$ git pull [<remote-repo>] [<branch-name>]

# 推送本地指定分支到远程仓库
$ git push [<remote-repo>] [<branch-name>]

# 强行推送当前分支到远程仓库
$ git push [<remote-repo>] --force

# 推送所有分支到远程仓库
$ git push [<remote-repo>] --all
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

9. 分支管理

# 显示所有本地分支
$ git branch

# 显示所有远程分支
$ git branch -r

# 显示所有本地分支和远程分支
$ git branch -a

# 新建一个分支但不切换分支
$ git branch [<branch-name>]

# 新建一个分支并切换到该分支
$ git checkout -b [<branch-name>]

# 新建一个指向指定提交的分支
$ git branch [<branch-name>] [<version>]

# 新建一个分支并与指定的远程分支建立联系
$ git branch --track [<branch-name>] [<remote-branch>]

# 切换到指定分支,并更新工作区
$ git checkout [<branch-name>]

# 切换到上一个分支
$ git checkout -

# 本地分支与指定的远程分支建立联系
$ git branch --set-upstream [<branch-name>] [<remote-branch>]

# 合并指定分支到当前分支
$ git merge [<branch-name>]

# 合并指定提交到当前分支
$ git cherry-pick [<version>]

# 删除分支
$ git branch -d [<branch-name>]

# 删除远程分支
$ git push origin --delete [<branch-name>]
$ git branch -dr [<remote/branch>]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

10. 标签管理

# 显示所有tag
$ git tag

# 为当前提交新建一个tag
$ git tag [<tag>]

# 为指定提交新建一个tag
$ git tag [<tag>] [<version>]

# 删除本地tag
$ git tag -d [<tag>]

# 删除远程tag
$ git push origin :refs/tags/[<tag>]

# 查看tag信息
$ git show [<tag>]

# 提交指定tag
$ git push [<remote-repo>] [<tag>]

# 提交所有tag
$ git push [<remote-repo>] --tags

# 新建一个分支,指向某个tag
$ git checkout -b [<branch-name>] [<tag>]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

11. 其他

# 生成一个可供发布的压缩包
$ git archive
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/845417
推荐阅读
相关标签
  

闽ICP备14008679号