Git笔记

Git实操

  • Git是分布式版本控制系统
  • GitHub是代码托管平台
    在这里插入图片描述 两者配合食用,GitHub不仅是代码版本库还将Git操作可视化。
    在这里插入图片描述

简介

Git是Linux之父为了管理Linux内核开发而创立的。

git基本概念

  • 工作区:仓库的目录。工作区是独立于各个分支的。
  • 暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。
  • 版本库:存放所有已经提交到本地仓库的代码版本。
  • 版本结构:树结构,树中每个节点代表一个代码版本。

Git的版本控制实现原理就是树结构
在这里插入图片描述

git常用命令

查看仓库状况是最常用的命令。
git status:查看该仓库状态
git diff XX:查看XX文件相对于暂存区修改了哪些内容,若暂存区无对应文件则比较版本库中Head指向版本的文件区别。
git log:查看当前(HEAD指向)分支的所有(empty到HEAD)版本
git log --pretty=oneline:显示更加条理性,查看当前(HEAD指向)分支的所有(empty到HEAD)版本
git reflog:查看HEAD指针的移动历史(包括被回滚的版本)
从下到上(最新)可以查看每次的提交详情和切换分支的操作
git branch:查看所有分支和Head当前所处分支

本地Git仓库

git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中
git config --global user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中
git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中
在这里插入图片描述
git status:查看该仓库状态
在这里插入图片描述
git add XX:将XX文件添加到暂存区

  • git add .:将所有待加入暂存区的文件加入暂存区

在这里插入图片描述

git rm --cached XX:将文件从仓库索引目录中删掉,不再处理扫描对应文件。
git commit -m “给自己看的备注信息”:将暂存区的内容提交到当前(HEAD指向)分支

git diff XX:查看XX文件相对于暂存区修改了哪些内容,若暂存区无对应文件则比较版本库中Head指向版本的文件区别。
在这里插入图片描述

git log:查看当前(HEAD指向)分支的所有(empty到HEAD)版本

在这里插入图片描述
git log --pretty=oneline:显示更加条理性,查看当前(HEAD指向)分支的所有(empty到HEAD)版本
在这里插入图片描述

git reflog:查看HEAD指针的移动历史(包括被回滚的版本)
从下到上(最新)可以查看每次的提交详情和切换分支的操作
在这里插入图片描述

git reset --hard HEAD^ 或 git reset --hard HEAD~:将代码库回滚到上一个版本(实质上是将HEAD指向对应版本节点)
回滚后更新工作区代码为对应HEAD指向版本内容。

  • git reset --hard HEAD^^:往上回滚两次,以此类推
  • git reset --hard HEAD~100:往上回滚100个版本
  • git reset --hard 版本号:回滚到某一特定版本
    配合git reflog或者log查询版本号(前七位)食用在这里插入图片描述

git checkout — XX或git restore XX:将XX文件尚未加入暂存区的修改全部撤销

  • git restore XX:回滚文件将暂存区或HEAD指向版本节点中的xx文件回滚到工作区
  • git restore 文件名 会撤销到缓存区或者当前版本库版本
  • 撤消工作区的修改返回到最近一次add(缓存区)的版本或者最近一次commit(当前版本库)的版本
  • git restore --staged XXX: 撤销 暂存区但不修改工作区
  • git restore XXX: 撤销 暂存区修改工作区
  • git restore详细

远程Git仓库(SSH)

git remote add origin user@hostname:账号/仓库XXX.git:将本地仓库关联到远程仓库(需要在本地仓库的父级目录下执行

  • user: 服务器用户名
  • hostname: 服务器公网IP地址或域名

git push -u origin master(第一次需要-u以后不需要):将当前分支推送到远程仓库
git push origin branch_name:将本地的某个分支推送到远程仓库
git clone user@hostname:账号/仓库XXX.git:将远程仓库XXX下载到当前目录下
在这里插入图片描述

注意

本地仓库才有暂存区且切换分支和pull远程项目时需要暂存区为空。
git push:将当前所在(Head指向)分支push到远程仓库
push前要先pull最新代码再push。
若最新代码要提交到远程仓库则需要先commit本地再push远程仓库形成新节点。
commit和pull都会在本地产生新节点。

Git pull

git pull命令用来从远程仓库下载更新内容,并立即将对应内容更新到本地仓库。在Git的协作工作流中,合并远程仓库变更到本地仓库是很常见的工作。而git pull命令实际上就是其他两个命令的结合体,先git fetch然后紧接着git merge。在git pull命令执行的第一个阶段,会先对当前本地HEAD指针指向的分支执行git fetch。当原称更新内容下载完成之后,git pull会接着进入合并流程。合并操作会创建一个新的commit,并且HEAD指针也会随之更新而指向这个新的commit。
合并可能产生冲突,先在本地工作区文件中体现冲突内容,人为修改完本地冲突后再commit添加到当前分支节点。

Git问题:1.push时候遇到错误,push失败
究其原因是为了保证head指向的代码同步为最新版本。

push失败的情况,是因为我们在push提交代码的时候,远程仓库已经发生变化了(远程head头指针与本地保存的远程head头指针指向不同),换句话说就是在这个期间(上一次拉取代码到本次提交代码),有其他人在我们之前提交了代码到我们想要推送的分支,导致远程仓库代码更新变化了。所以git拒绝了本次push。

多分支

注意:多分支和本地工作区没关系,不管切换到哪个分支,本地工作区内容不变。
但是暂存区中的内容则是需要考虑到是否在对应分支中提交修改所以切换分支的时候需要保证暂存区为空。
在这里插入图片描述

git branch:查看所有分支和Head当前所处分支
git branch branch_name:创建新分支
git checkout -b branch_name:创建并切换到(Head指向)branch_name这个分支
git checkout branch_name:切换到branch_name这个(Head指向)分支
git merge branch_name:将分支branch_name合并到当前(head指向)分支上。实际上是将该分支作为节点添加到当前(head指向)分支。
在这里插入图片描述
合并分支可能产生冲突,先在本地工作区文件中体现冲突内容,人为修改完本地冲突后再commit添加到当前分支节点。
在这里插入图片描述

git branch -d branch_name:删除本地仓库的branch_name分支
git push:将当前所在(Head指向)分支push到远程仓库(Head指向)分支
git push --set-upstream origin branch_name:设置当前所在(Head指向)分支的branch_name分支对应远程仓库的branch_name分支
git push -d origin branch_name:删除远程仓库的branch_name分支
git pull:将远程仓库的当前(Head指向)分支与本地仓库的当前(Head指向)分支合并

  • git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前(Head指向)分支合并

将远程仓库的新节点更新到本地仓库
git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程的branch_name1分支与本地的branch_name2分支对应
git checkout -t origin/branch_name将远程的branch_name分支拉取到本地
git stash:将工作区和暂存区中尚未提交的修改存入栈中
git stash list:查看栈中所有元素
git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
git stash drop:删除栈顶存储的修改
git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素

总结

注意:多分支和本地工作区没关系,不管切换到哪个分支,本地工作区内容不变。
但是暂存区中的内容则是需要考虑到是否在对应分支中提交修改所以切换分支的时候需要保证暂存区为空。
同理合并分支的时候也需要保证暂存区为空,当前head指向的节点为最新版本。
为什么会出现Git Pull Failed以及解决方法(git checkout f用法)
在这里插入图片描述

合并分支可能产生冲突,会在本地工作区文件中体现冲突内容,人为修改完本地冲突后再commit添加到当前分支节点。

分支融合冲突和异步上传冲突根本原因都是因为相同文件不同内容融合产生的冲突,冲突会体现在的本地工作区文件中。

冲突产生的根本原因是:多方改动后的同一个文件的同一块区域的内容不同。
单一账号改动的同一区域内容不会冲突。

Git代码冲突:

合法代码合并方式:
1、基于原始版本的代码改动。
2、合并时是覆盖改动前原始版本代码而非其他方版本。(先pull再push)

冲突产生的根本原因是:多方改动后的同一个文件的同一块区域的内容不同。
单一账号改动的同一区域内容不会冲突。

代码合并时才会发生冲突,合并时以改动代码处为准覆盖原始代码(文件+行=位置),若改动代码处有多个非原始的改动版本(多方)则冲突。

同时修改了同一行代码:当两个人同时修改了同一行代码时,Git无法判断哪个修改是正确的,因此会产生冲突。

修改了同一文件的不同部分:当两个人修改了同一文件的不同部分时,Git会尝试合并这些修改,但如果这些修改之间存在冲突(修改同一行),就会产生冲突。

合并分支时:当合并两个分支时,如果这两个分支都修改了同一文件的同一行,就会产生冲突。

当Git发现冲突时,会在冲突的文件中标记出冲突的部分,并在文件中添加特殊的标记,如"<<<<<<<
HEAD"和"=======“和”>>>>>>>",以表示冲突的部分。此时需要手动解决冲突,即选择哪个修改是正确的,然后将特殊标记删除,保存文件并提交修改。

修改本地冲突文件内容后commit提交就可以生成新节点了。

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值