学习笔记-版本管理工具Git

一. 起因与目标

1.起因:帮同事处理git push报错问题(missing Change-Id),网上教程都不能解决问题,且问题说明解释都含糊不清。

2.目标:弄明白git命令串参数含义,尝试理清git工作原理,最后分析并解决同事的问题

3. 篇外话:Windows记事本编辑保存UTF-8编码的文件,会在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题

 


 

二. 名词概念

Git是分布式版本控制系统

一般情况下,使用Git进行版本控制,需要用到 “本地版本库” 和 “远程版本库”

1.本地版本库

  • 本地仓库由工作区暂存区(Index)HEAD指针组成。工作区你的工作目录,它持有实际文件;暂存区像个缓存区域,临时保存你的改动;HEAD指向你最后一次提交的版本。
  • 工作目录下有一个.git的隐藏文件夹,它不属于工作区,而是Git版本库
  • Git的版本库:存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

  •  把修改的文件添加到版本库分为两步,① git add 添加到暂存区;② git commit 暂存区内容提交到当前分支

 2.远程版本库

与本地版本库关联,对版本进行备份并起到多用户协作的作用,有两种方法对远程版本库与本地版本库进行连接

  • 先建立本地库,后建立远程库,使用 git add origin命令建立连接
  • 先建立远程库,将远程库克隆到本地

3.分支 

  • 初始化版本库时会默认建立master分支,在master上的每次提交(commit)串成一条"时间线"(版本可回退),master指向"时间线"上最新的一次提交

 

  • HEAD指针间接指向最新一次提交:HEAD是指向mastermaster才是指向提交的,所以HEAD指向的就是当前分支

 

  •  我们新建分支时,比如新建分支Dev,Dev(指针)会指向当前master分支的最近一次提交,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化

  •  切换到dev分支后,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变

  • dev分支上的工作完成,就可以把dev合并到master上,方法是直接把master指向dev的当前提交。同样,Git合并分支很快,就改改指针,工作区内容不变

  • 分支合并,冲突解决:git merge <branch>,提示冲突后,打开目标文件,修改冲突并保存,重新add、commit后再merge

  • 分支的使用:master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活.干活都在dev分支上,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本.小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并

 


 

 

三. 流程与命令  

 

创建和配置本地仓库

1.git init / git clone <远端仓库URLs>

git init:创建一个空的Git存储库 - 本质上是一个 .git 目录,其中包含 objectsrefs/headsrefs/tags和模板文件的子目录。还将创建一个引用master分支 HEAD 的初始 HEAD 文件。

注释:

  本地Git库需要和远端中心仓库建立连接:git remote add origin <远端仓库地址>

  git remote -v 查看origin指向的远端仓库

 

git clone:克隆Git库到新的文件夹中,包括Git库的所有分支,origin默认指向远端仓库

  git clone <远程仓库URLs>:克隆远程仓库

  git clone <远程仓库URLs> <本地目录>:克隆远程仓库到指定目录

注释:

  git branch --remotes 查看远端仓库分支

  git pull 克隆远端库后,git pull 默认拉取远端仓库 master 分支

 

2.git config

查看/编辑git配置文件

  git config --list:查看配置文件信息

  

  git config -e <编辑内容>:编辑当前仓库

  git config -e --global <编辑内容>:编辑系统上所有仓库

  git config --global user.name "runoob"

  git config --global user.email "runoob@xxx.com"

 

基本操作

3. git add <filename>

将修改的文件添加到index(暂存区)

注释:

  将目标文件从暂存区移除:

  git rm --cached <filename> 

  git reset HEAD -- <filename> 

  git reset HEAD -- . #删除所有暂存区文件

 

4. git commit 

将改动提交到HEAD,也就是最新的本地版本库

注释:

  git commit -m ‘提交信息’:提交并携带提交信息

  git commit --amend:修改上一次的提交信息

 

5. git status

显示 index(暂存区)文件与HEAD提交有差异的路径,工作树和index文件有差异的路径,以及工作树中不被Git追踪的路径.前者是你通过运行 "git commit "会提交的东西;第二和第三者是你在运行 "git commit "之前通过运行 "git add "可以提交的东西

 

6. git diff

查看工作区、暂存区和HEAD的区别

  git diff:是查看工作区与暂存区的差别

  git diff --cached:是查看暂存区与HEAD的差别

  git diff HEAD:是查看工作区和HEAD的差别的

 

7.git log

查看提交(本地库)历史 

  git log -N:查看前N条提交历史

  git log --oneline:历史提交信息缩略

  git log --all --grep=‘XXXX’:历史提交信息搜索

  git log --author=‘XXXX’:获取某人的历史提交

注释:

  git show <commit-hash-id>:查看某次commit的修改内容

 

8.git rebase

合并多个commit

  git rebase -i origin/master:-i打开互动窗口

rebase窗口命令注释

  • pick:正常选中
  • reword:选中,并且修改提交信息;
  • edit:选中,rebase时会暂停,允许你修改这个commit
  • squash:选中,会将当前commit与上一个commit合并
  • fixup:与squash相同,但不会保存当前commit的提交信息
  • exec:执行其他shell命令

 

9.git reset

回滚代码到某个commit

  git reset --hard HEAD^:回退到上个版本

  git reset --hard HEAD~N:回退到N次提交之前

  git reset --hard <commit-hash-id>:回退/前进到某次commit

注释:

  回滚后提交到远程仓库可能会失败,必须强制提交

  git push origin HEAD --force (可能需要解决对应分支的保护状态)   

  具体操作可参考:https://www.cnblogs.com/human/p/5128482.html

 

10.git push

提交本地git库代码到远端仓库

  git push <远程主机名> <本地分支名>  <远程分支名>

  git push origin HEAD:refs/for/master%r=xxx.yyyzzz@zte.com.cn

  即将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,refs/for是我们提交代码到服务器之后是需要经过code review 之后才能进行merge  

注释:

  解释git push origin master 和git push origin HEAD

  在master分支上,HEAD指向master,而master指向的是最近的一次提交

 

11.git pull 

从远程仓库获取代码,更新本地仓库

  git pull/git pull origin:更新本地仓库

 

  git pull <远程主机名> <远程分支名>:<本地分支名>

  git pull origin master:拉取远程仓库的master分支,更新当前分支

  git pull origin master:mybranch:拉取远程仓库的master分支,更新本地mybranch分支

 

12. git clean

从本地删除未跟踪的文件

  git clean -d -n:列出即将删除的未跟踪的文件

  git clean -d -n src:限制给定目录检查未跟踪文件 

  git clean -d -f:强制删除所有未跟踪的文件

  git clean -d -i 交互方式删除未跟踪的文件

 

13. git rm

删除本地仓库文件

  git rm -r *.pyc 递归删除本地仓库中所有pyc后缀文件

    git rm --cached 只从索引区删除文件,实际文件保留

分支操作

1.git checkout -b <feature_x> / git switch -c <feacture_x>

  创建一个叫做"feature_x"的分支,并切换过去

2.git checkout master

  切换回主分支

3.git branch

  查看本地分支

4.git log --graph

  命令可以看到分支合并图

5.git merge <feacture_x>

  先切回主分支,执行上述命令,主分支会合并feature_x分支,即master 指向 feature_x指向的最新提交

6.git branch -d feature_x

  新建分支删除

7.git push origin <branch>

  推送分支,除非你将分支推送到远端仓库,不然该分支就是不为他人所见的

 

8. git reset 、git rm、git revert的区别

  


 

四. 问题解决

1.本地代码与远程库代码冲突问题:本地库文件发生修改后,远程库该文件被同事更新了,本地无法拉取代码的问题

方案1. 希望保留本地修改:

  git stash

  git pull

  git stash pop

 方案2. 希望远程库覆盖本地修改:

  git reset --hard

  git pull

 

2. push代码时发现缺少change-id

  git commit --amend

  弹出commit内容编辑窗口后,直接:q退出,该条commit就会增加一条change-id

 


 

五 .commit 规范

  提交日志一直没有形成一个很好的规范(提交比较随意)。commit message 应该清晰明了,说明本次提交的目的

  业界广泛使用的规范:Angular Git Commit Guidelines,并且有配套工具commitizen

  规范详细:http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html

 

 


 

参考资料:

  https://git-scm.com/docs

  https://www.runoob.com/w3cnote/git-guide.html

  https://www.zhihu.com/question/27712995/answer/39946123

  https://blog.csdn.net/bdss58/article/details/40537859

  https://www.liaoxuefeng.com/wiki/896043488029600/897271968352576

  https://github.com/angular/angular.js/blob/master/DEVELOPERS.md

  http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html

  https://github.com/commitizen/cz-cli

      https://www.cnblogs.com/human/p/5128482.html

  http://www.ruanyifeng.com/blog/2015/08/git-use-process.html

posted @ 2021-11-09 14:10  getright  阅读(171)  评论(0编辑  收藏  举报