git基本概念及使用场景

董承
• 阅读 2731

git基本概念

  • 工作区:就是你在电脑里能看到的目录,比如我们的项目文件夹就是一个工作区
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库(暂存区+分支)

git基本概念及使用场景

git常用命令

  • git status:查看当前状态
  • git log:查看提交记录
  • git log --graph:查看分支图合并
  • git reflog:查看近期所有操作提交记录
  • git branch:查看本地仓库分支 git branch -a 查看所有分支
  • git checkout [分支名]:切换分支
  • git checkout -b [分支名] [远程分支]:基于某个远程分支新建分支并切换到该分支
  • git branch -d [分支名]:删除某分支
  • git merge [分支名]:分支进行融合
  • git remote:查看远程库信息 -v 详细信息
  • git tag:查看本地仓库所有标签
  • git tag <name> <commitId>:默认HEAD打一个标签 可指定特定commitId -m '为标签添加注释'
  • git tag -d <tagName>:删除某个标签
  • git push -d origin <tagName>:删除远程标签
  • git push --tags:将本地标签一次性推送到远程
  • git push origin <tagName>:推送指定标签到远程

git diff 命令详解(用于比较两次修改的差异)

  • 工作区和暂存区的差异:git diff <filename>
  • 暂存区和Git仓库(已经提交)的差异:git diff --cached <commit> <filename>
  • 工作区和Git仓库的差异:git diff <commit> <filename>

git config 常用配置

  1. 配置邮箱和用户名

    git config --global user.name \[NAME\]
    
    git config --global user.email \[EMAIL\]
  2. 配置命令别名

    比如给 git status 设置别名 st:
    git config --global alias.st status
  3. 查看已有配置信息

    git config [--system|global] --list
    启用大小写敏感:git config --global core.ignorecase false

git merge VS git rebase

  • git merge:合并分支(保留历史提交),产生新的融合提交记录
  • git rebase:变基&合并分支(丢弃原始提交,形成线性提交历史) 一个冲突一个冲突的解决 解决一个冲突之后

    git add -u
    git rebase --continue

    中途退出:git rebase --abort

总结:

  1. 想要保存项目完整的历史,并且避免重写公共分支上的commit,使用git merge,缺点:多出很多不必要的提交
  2. 想要一个干净的、线性的提交历史,没有不必要的合并提交,使用 git rebase,缺点:修改提交记录
  3. 只要你的分支上需要 rebase 的所有 commits 历史还没有被 push 过,就可以安全地使用 git-rebase来操作。

git rebase 合并提交记录
前提:提交记录是线性的,并且没有push到公共分支

git rebase -i HEAD~3

git基本概念及使用场景

  • pick:保留该commit(缩写:p)
  • reword:保留该commit,但我需要修改该commit的注释(缩写:r)
  • edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
  • squash:将该commit和前一个commit合并(缩写:s)
  • fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
  • exec:执行shell命令(缩写:x)
  • drop:我要丢弃该commit(缩写:d)

修改指令(保留第一次提交 将下面两次提交合并到第一次提交中)
git基本概念及使用场景
:wq保存之后重新修改提交信息
git基本概念及使用场景
:wq之后合并提交完成

git reset VS git revert

  • git reset:版本撤回

    • 回退所有内容到上一个版本 git reset HEAD^
    • 回退a.js这个文件的版本到上一个版本 git reset HEAD^ a.js
    • 将本地的状态回退到和远程的一样 git reset –hard origin/master
    • 回退到某个版本 git reset 057d
  • git revert:撤消操作

    • git revert HEAD~3:丢弃最近的三个commit,把状态恢复到最近的第四个commit,并且提交一个新的commit来记录这次改变。

总结:

  1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
  2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
  3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

使用场景

撤销修改

  • 本地修改后未存储在暂存区时(git add),使用 git checkout -- file撤销某文件的修改,撤销所有修改可以使用git checkout .
  • 本地修改后已存储在暂存区时,使用git reset HEAD <file>,将暂存区的修改撤销掉,重新放回工作区,撤销工作区修改可以使用git checkout -- file
  • 本地修改后提交到版本库(git commit),可以使用git reset --hard HEAD^,回退到上一个版本

储藏当前工作现场

  • git stash:把当前工作现场“储藏”起来,等以后恢复现场后继续工作
  • git stash list:查看有哪些储藏现场
  • git stash apply:恢复现场,但是不删除stash
  • git stash drop:删除stash
  • git stash pop:恢复现场并删除stash
  • git stash clear:清除所有储藏记录
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge

两个分支提交相同代码时

  • git cherry-pick <commit> :提交相同修改

删除远程分支

  1. git branch -d origin/hotfix/2.2.3 (删除本地)
  2. git push origin :hotfix/2.2.3 (远程分支也删除)

三路合并以及三路递归合并

三路合并

git基本概念及使用场景

  • 三路合并算法会找到合并的这两个提交的共同祖先
  • 依据共同父祖先进行对比

三路递归合并

git基本概念及使用场景

  • git 会首先将 b 和 c 合并成一个虚拟的提交 x,这个 x 当作 e 和 d 的共同祖先。
  • 而要合并 b 和 c,也需要进行同样的操作,即找到一个共同的祖先 a。

git基本概念及使用场景

点赞
收藏
评论区
推荐文章
胖大海 胖大海
3年前
Git 安装配置
基本概念我们先来理解下Git工作区、暂存区和版本库概念:工作区:就是你在电脑里能看到的目录。暂存区:英文叫stage或index。一般存放在.git目录下的index文件(.git/
Easter79 Easter79
4年前
svn与git操作对比 (未来有空做一个 svn与git实战对比 )
svn是集中式的,git是分布式的,但是我们日常使用的都是按照集中式唯一服务器仓库的方式来去做的,最终我们的代码都要提交到一个唯一仓库中。他们最大的区别是本地工作拷贝的工作方式不同,一、svn本地工作拷贝,包括分支都是目录,直截了当,看到的就是服务器的,svnupdate更新服务器到本地;svncommit就是提交到服务器
GIT常用命令
1、初始化本地Git存储库languagegitinit2、创建远程存储库的本地副本languagegitclonessh://git@github.com/username/repositoryname.git3、检查状态languagegitstatus4、将文件添加到暂存区languagegitaddfil
Stella981 Stella981
4年前
Git 的暂存区(staging area)理解
    通常在很多传统集中式版本控制系统中,只有两个空间用来管理你的数据,一个是你的workingcopy(工作区),另一个便是datastore(版本库),然而在Git中,引入了stagingarea(index)这一概念,我们可以把它看做一个“码头”,你来决定其中的哪些改变可以被“运走”。    有了暂存区,我们的工作区边和Git库就不再直
Stella981 Stella981
4年前
Git本地上传到服务器
1.本机window系统的话先下载安装git 下载后在开始菜单里面找到"GitGitBash"进入命令2.找到要上传的目录,通过命令gitinit把这个目录变成git可以管理的仓库gitinit3、把文件添加到版本库中,使用命令gitadd.添加到暂存区里面去,不要忘记后面的小数点“.”,意为添加文件夹下的所
Stella981 Stella981
4年前
Git连载(2)创建本地资源库
Git创建本地资源库        创建本地资源库非常简单:选择需要版本管理的工作目录,然后在该工作目录下创建资源库即可。具体执行按以下步骤执行即可。        (1)选择需要版本管理的工作目录,比如此处打算对G:\\gitJava目录进行版本管理。通过资源管理器进入该目录,在空白处单击鼠标右键,TortoiseGit弹出如图1.64所示
Stella981 Stella981
4年前
Git(二)Git几个区的关系与Git和GitHub的关联
一、Git的工作区、暂存区和版本库之间的区别和联系  1)工作区    在PC中能看得到的创建的一个管理仓库的目录。比如目录下GitTest里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。    !(https://oscimg.oschina.ne
Stella981 Stella981
4年前
Git基础命令篇
一、Git介绍(1)Git是一个开源(LinusTorvalds为了帮助管理Linux内核开发而开发)的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,与常用的版本控制工具CVS,SVN等不同,它采用了分布式版本库的方式,不必服务器端软件支持。(2)Git的工作区、暂存区和版本库:工作区:就
可莉 可莉
4年前
19.03.04JavaWeb作业
Git及用法Git是目前世界上最先进的分布式版本控制系统。Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推
凿壁偷光 凿壁偷光
2年前
SmartGit 许可证文件 Git客户端 支持Silicon M1
SmartGitforMac一款Git版本控制系统的图形化客户端程序,它能在您的工作上满足您的需求,smartgit是一个企业级的Git、Mercurial、以及Subversion图形化客户端软件,功能非常强大,它可以简单快速的实现Git及Mercurial中的版本控制工作,从而大大提高您的工作效率。并支持SiliconM1芯片的Mac电脑!
小万哥 小万哥
2年前
Git 分支管理:优化版本控制与应急处理的关键策略
使用Git分支:轻松管理不同版本和应对紧急情况的最佳实践使用Git分支在Git中,分支是主仓库的新/独立版本。假设你有一个大型项目,需要对其进行设计更新。没有使用Git时:复制所有相关文件以避免影响实时版本开始进行设计工作,并发现代码依赖于其他文件中的代码