git学习

zlong.w Lv2

描述

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目

Git不仅仅是个版本控制系统,它也是内容管理系统,工作管理系统等

Git与SVN的区别:

  1. Git是分布式的,SVN不是
  2. Git把内容按照元数据方式存储,SVN是按文件存储
  3. Git分支和SVN的分支不同
  4. Git没有全局的版本号,而SVN有
  5. Git内容完整性要优于SVN

本地仓库有Git维护的三棵”树”组成,这是Git的核心框架.分别是:

  1. 工作区域: 就是平时存放项目代码的地方
  2. 暂存区域:
    用于临时存放你的改动,事实上它只是一个文件,保存即将提交的文件列表信息
  3. Git仓库:就是安全存放数据的位置,这里有提交的所有版本的数据.

Git的工作流程:

  1. 在工作目录中添加/修改文件
  2. 将需要进行版本管理的文件放入暂存区域
  3. 将暂存区域的文件提交到Git仓库

HEAD是什么?

HEAD可以看作是”我”,例如 git log日志中HEAD ->
master指的是:我在master分支上

常用命令

  1. 初始化git
    1
    $ git init
  2. 将文件添加到暂存区域
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ git add 文件名称      
    # 把新增、修改的加到暂存区
    $ git add .
    # 添加所有修改、已删除的文件到暂存区中
    $ git add -u [<文件路径>]
    $ git add --update [<文件路径>]
    # 添加所有修改、已删除、新增的文件到暂存区中,省略 <文件路径> 即为当前目录
    $ git add -A [<文件路径>]
    $ git add --all [<文件路径>]
    # 查看所有修改、已删除但没有提交的文件,进入一个子命令系统
    $ git add -i [<文件路径>]
    $ git add --interactive [<文件路径>]
  3. 将文件提交到本地仓库
    1
    2
    3
    $ git commit -m "版本描述"
    # 修改上次提交的描述信息
    $ git commit --amend
  4. 添加暂存区并提交
    1
    2
    # 一步完成提交
    $ git commit -am "说明"
  5. 查看当前版本状态(查看是否有未提交的文件)

On branch 分支名称: 表示当前所在分支
nothing to commit,working directory clean:表示工作目录是干净的,没有需要提交的文件

1
2
3
$ git status                 
On branch master Untracked files:
(use "git add <file>..." to include in what will be committed) LICENSE(红色) nothing added to commit but untracked files present (use "git add" to track)
  1. 拉取远程仓库的项目
    1
    2
    $ git clone 目标地址
    $ git clone https://github.com/user/demo.git
  2. 撤销

当发现commit的内容有错误的时候有两种处理方法:

1. 修改错误内容再commit一次,但是会留下commit记录
2. 使用git reset命令撤销这一次错误的commit

reset有三个模式:

–head
重置工作区域和暂存区域,也就是说之前没有commit的内容直接擦掉恢复到上一次commit的时候

–soft
重置工作区域,只是将索引指向重置,暂存区还有本次修改的东西,所以会造成新的差异

不加参数(mixed)
保留工作区域,清空暂存区域,也就是说工作目录跟暂存区域强行合并了一次,有差异也会放进工作目录

1
$ git reset
  1. 查看git的日志信息
    1
    2
    3
    4
    5
    6
    # 输出log           
    $ git log
    # 简化git日志输出格式
    $ git log oneline
    # 绘制分支图
    $ git log --oneline --decorate --graph --all
  2. 将远程主机的最新内容拉到本地
    1
    2
    3
    4
    # 将远程最新内容拉到本地,不进行合并
    $ git fetch origin master
    # 将远程主机的master分支最新内容拉取到本地当前分支直接合并
    $ git pull origin master:<本地分支名>
  3. 分支(branch)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #创建分支
    $ git branch 分支名称
    # 修改分支名称
    # 如果不指定原分支名称则为当前所在分支
    $ git branch -m [<原分支名称>] <新的分支名称>
    # 强制修改分支名称
    $ git branch -M [<原分支名称>] <新的分支名称>
    # 列出本地的所有分支,当前所在分支以 "*" 标出
    $ git branch
    # 列出本地的所有分支并显示最后一次提交,当前所在分支以 "*" 标出
    $ git branch -v
  4. 切换分支
    1
    2
    3
    4
    5
    6
    $ git checkout 分支名称      
    # 适用于切换分支的时候将当前分支内容打包带走,同步到切换的分支下
    #这个命令有两个注意点,1. 两个分支内容不同会造成冲突 2. 切换到新的分支后当前分支修改的内容就丢失了
    $git checkout --merge <分支名称>
    # 主要要用来比较两个分支之间的差异内容
    $ git checkout -p <分支名称>
  5. 创建并切换分支
    1
    2
    3
    4
    5
    6
    # 如果有同名分支则会报错
    $ git checkout -b 分支名称
    # -B 强制创建,有同名直接覆盖
    $ git checkout -B 分支名称
    # 如果当前分支累计了N次提交,这个命令会创建一个新的分支有N次提交的内容但是没有提交记录
    $ git checkout -orphan <分支名称>
  6. 删除文件
    1
    2
    3
    4
    # 同时删除工作区域和暂存区文件
    $ git rm
    # 只删除暂存区,只是想要某文件不被版本控制
    $ git rm --cached
  7. 重命名文件
    1
    $ git mv 旧文件名称 新文件名称
  8. 合并分支
    1
    2
    # 合并需要切换到master上
    $ git merge
  9. 删除分支
    1
    2
    3
    4
    # 如果未合并会有问题
    $ git branch -d 分支名称
    # 强制删除
    $ git branch -D 分支名称
  10. 操作远程库
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 列出已经存在的远程仓库     
    $ git remote
    # 列出远程仓库的详细信息,在别名后面列出URL地址
    $ git remote -v
    $ git remote --verbose
    # 添加远程仓库
    $ git remote add <远程仓库的别名> <远程仓库的URL地址>
    # 修改远程仓库的别名
    $ git remote rename <原远程仓库的别名> <新的别名>
    # 删除指定名称的远程仓库
    $ git remote remove <远程仓库的别名>
    # 修改远程仓库的 URL 地址
    $ git remote set-url <远程仓库的别名> <新的远程仓库URL地址>
  11. 将已经提交的记录合并到当前分支
    1
    $ git cherry-pick <commit id>
  12. 从远程仓库获取最新的版本到本地
    1
    2
    3
    4
    # 将远程仓库所有分支的最新版本全部取回到本地
    $ git fetch <远程仓库的别名>
    # 将远程仓库指定分支的最新版本取回到本地
    $ git fetch <远程主机名> <分支名>
  13. 比较版本之间的差异
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 比较当前文件和暂存区中文件的差异,显示没有暂存起来的更改 
    $ git diff
    # 比较暂存区中的文件和上次提交时的差异
    $ git diff --cached
    $ git diff --staged
    # 比较当前文件和上次提交时的差异
    $ git diff HEAD
    # 查看从指定的版本之后改动的内容
    $ git diff <commit ID>
    # 比较两个分支之间的差异
    $ git diff <分支名称> <分支名称>
    # 查看两个分支分开后各自的改动内容
    $ git diff <分支名称>...<分支名称>
    # 使用git diff的时候可能会出现中文乱码的问题,需要设置编码格式
    # git diff 快照版本号快照版本号 可以对比两个历史快照
    $ git config --global i18n.commitencoding utf-8
    $ git config --global i18n.logoutputencoding utf-8
  14. 还原提交记录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 重置暂存区,但文件不受影响 
    # 相当于将用 "git add" 命令更新到暂存区的内容撤出暂存区,可以指定文件
    # 没有指定 commit ID 则默认为当前 HEAD
    $ git reset [<文件路径>]
    $ git reset --mixed [<文件路径>]
    # 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
    $ git reset <commit ID>
    $ git reset --mixed <commit ID>
    # 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
    # 相当于调用 "git reset --mixed" 命令后又做了一次 "git add"
    $ git reset --soft <commit ID>
    # 将 HEAD 的指向改变,撤销到指定的提交记录,文件也修改了
    $ git reset --hard <commit ID>
  15. 生成新的提交来撤销某次提交
    1
    $ git revert <commit id>
  16. 让git忽略某后缀的文件,不再识别

在工作目录创建一个.gitignore文件,完了再执行git status,发现指定后缀已经不跟踪状态了。后续要是有不需要跟踪的文件可以再.gitignore里面直接添加该文件的名称

1
$ echo *.后缀 > .gitignore
  • 标题: git学习
  • 作者: zlong.w
  • 创建于 : 2020-08-02 17:47:30
  • 更新于 : 2023-09-26 15:42:48
  • 链接: https://zlonx.cn/2020/08/02/git学习/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
git学习