Py学习  »  Git

Git基本使用及HEAD、fetch问题

4xi • 2 年前 • 155 次点击  
阅读 25

Git基本使用及HEAD、fetch问题

---Git使用

Git配置

设置签名

  • 项目(仓库)级别仅在当前本地库有效

    git config user.name tom  #设置用户名tom
    git config user.email liu@qq.com #设置用户邮箱
    复制代码
  • 系统用户级别仅在当前登录的操作系统用户有效

git config --global user.name tom
git config --global user.email liu@qq.com
复制代码

优先级别:项目级别 > 系统级别

信息保存位置:~/.gitconfig 文件

忽略文件.gitignore 当我们有无需上传至线上仓库的文件,比如我们项目中的npm包(node_modules),它在我们项目中是很重要的,但是它占的内存也是很大的,所以一般我们用Git管理的时候是不需要添加npm包的.此时我们只需在项目中新建一个.gitignore文件,并写入 node_modules/,git在之后的操作会自动忽略node_modules的所有文件 .gitignore相应书写规则

Git四个关键区域

对于git操作流程,主要有一下四个关键区域:工作区(workspace),暂存区(Index),本地仓库(Repository),远程仓库(Remote)

  1. 工作区 本地电脑存放项目文件的地方
  2. 暂存区 就是将文件暂存的地方,通常使用add命令将工作区文件添加进暂存区内
  3. 本地仓库

通常通过commit等命令将暂存区提交给master分支上,也就是意味打了一个版本,也可以说代码提交到了本地仓库中 4. 远程仓库 线上的git服务器,如gitlab,github,gitee上的项目就是一个远程仓库 在这里插入图片描述

Git操作指令

一.工作区

1.新建仓库

将工作区中的项目配置git进行管理,将项目使用git初始化

git init
注意:生成的 .git 目录中存放的是本地库相关文件,不要删除
复制代码

从远程仓库拉取项目:

git clone <url>
复制代码
2.向暂存区提交文件

提交工作区所有文件至暂存区

git add .
复制代码

提交工作区指定文件至暂存区

git add <file 0> <file 1> .....<file n>
复制代码

提交工作区指定文件夹至暂存区

git add [dir]
复制代码
3.撤销删除

撤销、丢弃工作区的修改。也就是就是让这个文件回到最近一次git commit或git add时的状态。

git checkout --<file>
复制代码

同时删除工作区和暂存区文件

git rm <file1> <file2>
复制代码

取消暂存区已经暂存的文件:

git reset HEAD <file>...
复制代码
3.查看信息

查询当前工作区所有文件的状态

git status
复制代码

比较工作区中当前文件和暂存区之间的差异

git diff
复制代码

二.暂存区

1.向版本库提交文件

提交更改

git commit -m [message]
复制代码

把暂存区的指定文件提交到本地仓库中的当前所在分支

git commit [file1] [file2] ... -m [message]
复制代码
2.查看信息

比较暂存区与上一版本的差异

git diff --cached
复制代码

比较暂存区指定文件与上一版本的差异

git diff <file-name> --cached
复制代码

查看历史记录

git log #可以显示所有提交过的版本信息
git reflog  #常用(可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作))
git log --greph #图形显示,更直观
git log --pretty=oneline #漂亮一行显示
复制代码
3.分支管理

创建分支

git branch <branch-name>
复制代码

从当前分支切换到其他分支

git checkout <branch-name>
复制代码

删除分支

git branch -d <branch-name>



    
复制代码

指定分支合并到当前分支

git merge <分支名>
复制代码

显示本地仓库的所有分支

git branch
复制代码
4.解决冲突
  • 第一步:编辑,删除特殊标记<<< ===
  • 第二步:修改到满意位置,保存退出
  • 第三步:添加到缓存区 git add 文件名
  • 第四步:提交到本地库git commit -m '日志信息' 注意:后面一定不能带文件名

三.本地仓库

获取远程仓库信息

git fetch <远程主机名> <分支名>
复制代码

将本地仓库某分支推送到远程仓库上

git push [remote-name] [branch-name]
复制代码

查看远程仓库的详细信息

git remote show origin
复制代码

取回远程主机某个分支的更新,再与本地的指定分支合并

git pull
复制代码

Git中的分支

一.Git中的HEAD和master

在git中,我们可以把HEAD理解成一个指针,这个指针指向我们的开发分支。如下图所示,当我们当前处于master分支时,HEAD指向了master分支。 在这里插入图片描述

此时,当我们(checkout)检出到dev分支时,那么HEAD指针就会指向dev指针。

git checkout dev
git branch
* dev
  master
复制代码

在这里插入图片描述

当我们在dev上进行开发提交,dev就会指向当前分支的最新提交,而master分支依旧保持master之前的提交状态 在这里插入图片描述

当我们把dev合并到master上,git将master指向dev 的当前提交,完成合并 在这里插入图片描述

git checkout master
git merge dev
复制代码

二.git fetch + git merge(git rebase) = git pull(大多数情况)

理解了以上HEAD、master和开发分支的关系是通过指针联系起来,我们可以借此思想顺便理解git fetch + git merge (git rebase) = git pull的原因

在这里插入图片描述

当线上master的位置随着其他人的代码文件提交。线上的master将与本地orgin/master不再对应。本地master也与线上master所处的位置不在同一分支

在这里插入图片描述

目标

解决这个问题,我们需要将本地开发分支改成如下情况

我们可以使用git pull一次性完成取回远程主机某个分支的更新,再与本地的指定分支合并,也就是直接把远程仓库版本迭代到本地仓库和远程仓库关联库上,也可以使用以下方法完成我们的目标。但问题是git pull的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。当然,多数时候这是没问题的,但一旦代码有问题,会别急难找到出错的地方。同时本地工作目录在未经确认的情况下就会被远程分支更新,所以会比较推荐使用git fetch

在这里插入图片描述

git fetch + git merge(git rebase)

git fetch后本地的工作区(workspace)不会自动生成一份可编辑的副本,抓取结果存储于版本库(Repository),也就是图中版本A1,A2 在这里插入图片描述

在这里插入图片描述

当我们把git merge 改变为 git rebase也会有大致相同的效果,并且此时开发分支master并没有合并过后的痕迹 在这里插入图片描述

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/115577
 
155 次点击