Git_版本管理-版本控制

Git--本地和远程

  本地--工作区 暂存区 仓库区
  Working Directory  已修改(modified) working tree clean 或者 Untracked files:
  Stage              已暂存(staged)   unstage   查看命令:git ls-files
  Repository         已提交说明(committed)
 动作:  加入--提交-推送发布  更新 撤销
       回退 (回退的命令有两个:reset 和 checkout)
 分支Branch :本地分支  远程分支 创建分支  切分支  合并分支   删除分支
 仓库: repository  本地仓库 远程仓库

基本命令

    origin  是当你运行 git clone 时默认的远程仓库名字 

 	git reset HEAD README.md  # 取消暂存
	git checkout -- README.md # 撤消之前所做的修改--慎重用
	撤消合并 还原提交 git revert

分支整合: merge 或者 rebase

  合并或者变基
  git  fetch + git merge  == git pull
  git  fetch + git rebase == git pull --rebase 
  
  git merge  == 选择合并 来保持分支同步  提交历史是 记录实际发生过什么
  git rebase == 选择变基 来保持分支同步  提交历史是 项目过程中发生的事
	
 rebase的过程中,也许会出现冲突(conflict). 在这种情况,
    Git会停止rebase并会让你去解决 冲突;在解决完冲突后,
 用"git-add"命令去更新这些内容的索引(index),
 然后,你无需执行 git-commit,只要执行:$ git rebase --continue 这样git会继续应用(apply)余下的补丁

解决冲突的方式
   GitHub、Bitbucket 和码云(Gitee.com)选择 Pull Request 作为这项功能的名称
   GitLab 和 Gitorious                选择 merge Request 作为这项功能的名称


git rebase :分支合并
  rebase 做了什么操作呢?
    首先,git 会把 feature1 分支里面的每个 commit 取消掉;
    其次,把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;
    然后,把 feature1 分支更新到最新的 master 分支;
    最后,把上面保存的 patch 文件应用到 feature1 分支上;	 

分支策略:

功能分支
位置分支

bug和hotfix

应用层面: 热修复(HotFix)是指在不重新发布整个应用程序的情况下,通过更新修复应用程序中的 bug 或者引入新功能
  动态地加载补丁(Patch),以解决应用程序的问题或者改进功能
git 的分支管理层面: 热修复(hotfix)是一种用于处理紧急bug修复的分支管理策略

补丁

以 引入的变更即提交 这样的概念为中心的,
   这样一系列的提交,就是一系列的补丁
 Git补丁是指将一个或多个提交(commit)的差异(diff)保存为补丁文件(通常以`.patch`为后缀)
 进行变基和拣选
     变基。 它会提取该提交的补丁,之后尝试将其重新应用到当前分支上
 git commit    git diff   git format-patch	 git apply
 git cherry-pick	 

patch文件 补丁

  只包含了变更的部分,因此文件体积很小,便于传输、存储
 
 构建patch
    选择对应的commit做format-patch
      git format-patch <commit-hash>
 	 
 应用patch	 
     git am 和git apply命令是在git中用来应用patch文件的两种常见方式	
        git am    将patch文件中的修改内容应用到代码库并且创建一个新的提交	
 	   git apply 将patch文件中的代码变更,应用到当前的代码库中
 	   
 	   
 	   
 git cherry-pick
     git cherry-pick 命令用来获得在单个提交中引入的变更	  ,就是将指定的提交(commit)应用于其他分支  
 	 git revert 命令本质上就是一个逆向的 git cherry-pick 操作
	 git rebase 命令基本是是一个自动化的 cherry-pick 命令

发布补丁和存档文件

 Git 还可以通过命令 git send-email 直接已电子邮件的方式发送补丁
 Git 还可以通过打包文件(bundles)共享提交历史	 
 从某个指定版本创建一个存档文件(archive)git archive  

分支

git branch
git checkout dev
     目标分支目前存在的情况,即切换到它,那么您可以使用这个 checkout 命令,git checkout dev
     目标分支目前不存在的情况,并且您想创建一个新分支并立即切换到它,git checkout -b <name_of_the_branch>
Git 2.23起,你也可以使用新的git switch 命令来创建并切换分支.两种情况
    git switch dev
    git switch -c <name_of_the_branch>
	
git fetch 命令获取远程分支		
git branch --set-upstream-to origin/远程分支名  本地分支名		

Git分支策略-分支模型

  常见的分支策略有以下三种:GitFlow、GitHubFlow 以及 GitLabFlow
   GitHub、Bitbucket 和码云(Gitee.com)选择 Pull Request 作为这项功能的名称

GitLab 和 Gitorious                选择 merge Request 作为这项功能的名称

Git-flow

    Git分支模型(master/hotfix/develop/feature/release)
    两种核心分支: 
          主分支(Master):代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本
          开发主分支(Develop):这个分支是我们是我们的主开发分支	
    三种临时分支
	     功能(feature)分支	
         预发布(release)分支
         修补bug(hotfix)分支

GitHubFlow

 托管在GitHub上时
   通常只有一个Master分支是固定的,
   而且GitHubFlow中的Master分支通常是受保护的,只有特定权限的人才可以向Master分支合入代码。
     在GitHubFlow中,新功能开发或修复Bug需要从Master分支拉取一个新分支,在这个新分支上进行代码提交;
	 功能开发完成,开发者创建 Pull Request(简称PR),
	 通知源仓库开发者进行代码修改review,确认无误后,
	 将由源仓库开发人员将代码合入Master分支	

GitLabFlow

 托管在 GitLab 上时
 GitLabFlow 增加了对预生产环境和生产环境的管理	
  GitLabFlow中的Merge Request是将一个分支合入到另一个分支的请求,
  通过Merge Request可以对比合入分支和被合入分支的差异,也可以做代码的Review	
 Review代码并通过合并请求

场景

 需要切换分支但又不想丢失当前更改?存储可让您保存工作而不提交,让您稍后返回	
     git stash
     git stash pop
 合并多个commit提交 压缩提交可让您将多个提交合并为一个,以获得更整洁的历史记录。
     git rebase -i HEAD~<number-of-commits>	 

 本地分支和远程分支  Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)
  //已有本地分支 和远程创建关联 然后拉取 git pull
    git branch --set-upstream-to origin/远程分支名  本地分支名	 
	git remote 命令用于创建远程分支

Git背后的数据结构

     config 文件包含项目特有的配置选项
     info 目录包含一个全局性排除(global exclude)文件, 用以放置那些不希望被记录在 .gitignore 文件中的忽略模式(ignored patterns
     refs 目录存储指向数据(分支、远程仓库和标签等)的提交对象的指针
     objects 目录存储所有数据内
     HEAD 文件指向目前被检出的分支;index 文件保存暂存区信息		
Git 的核心部分是一个简单的键值对数据库(key-value data store)
三个 blob 对象(保存着文件快照)、
一个 树   对象(记录着目录结构和 blob 对象索引)
一个 提交 对象(包含着指向前述树对象的指针和所有提交信息)	

 创建新分支的呢?即创建了一个可以移动的新的指针 一个名为 HEAD 的特殊指针--》HEAD 指向当前所在的分支

远程仓库和本地仓库

1.远程仓库 
  git remote -v 
  git remote set-url origin https://test/test.git
  git remote add origin  https://test/test.git
2.本地仓库 git init   ## 隐藏的.git目录-是git的版本库  ndex 文件.git/index
   git status   
	跟踪--版本标记--提交本地仓库
 untracked              下一步 git add 或者不处理 
 modified --tracked     下一步 git add 
       工作区域: modified  new file  deleted  创建-修改-删除 (增删改)
 
 staged                表示已经被加入到暂存区了,但是还没有被提交到本地库
                      git rm --cached <file>
					  git checkout -- <file>  会做替换
 commited             本地仓库  --Git中处理已提交但未推送   
     nothing to commit,working directory clean
	 git  reset
 git push origin branch——name
         git  revert
查看历史操作--git log 
  查看工作区和暂存区之间的差异  git diff 
撤销-回退-暂存-返回
   版本回退: 版本回退--用commitID
   版本撤销	
   撤销修改: git checkout --
  场景: 回退到特定版本--丢弃后续提交
         创建新提交撤销指定版本-保留其后的变更	  

本地分支和远程分支

git branch 
git branch -r 
git branch -a	
## 本地分支和远程分支建立关联
git branch --set-upstream-to=origin/dev dev

版本

 标记   HEAD指针指向当前分支
posted @ 2024-12-11 15:44  辰令  阅读(81)  评论(0)    收藏  举报