Git的使用笔记
Git的使用笔记
前言
作为一名技术人员,在开发项目的时候,是离不开版本控制的(除非你真的没有在干活(。•ᴗ-))。其中的分布式版本控制系统中,使用最广泛、最方便的当属Git了。下面就对Git流程的使用做下总结。
Git的安装
直接从AppStore上安装Xcode,XCode集成了Git。
Git中设计到的几个概念
-
版本库(Repository)
- 什么是版本库?版本库又名仓库,里面存放了我们开发使用到的文件,Git可以管理操作这些文件。
-
远程仓库(Remote Repository)
- 远程仓库顾名思义就是存放在云端的仓库。可以作为本地仓库的备份,其他人就可以通过远程仓库进行协作开发了,远程仓库的文件可以拉取至本地仓库,本地仓库也可以同步文件到远程仓库。
-
工作区(Working Directory)
- 你在本地存放文件目录的地方就可以成为是一个工作区。
-
暂存区(Stage)
- 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里有很多东西,其中最重要的就是称为stage的暂存区。工作区的修改的文件需要先提交到暂存区,才能同步到远程仓库中。
-
分支(Branch)
- 可以理解为工作的流水线。版本库默认会存在一条master分支。当你创建了一条属于你自己的分支后,就可以管理自己的开发流程,并不会影响别人的开发,十分的安全。
-
标签(Tag)
- 每发布一个版本时,我们都会在版本库中打一个标签。标签名一般都很直观,我们可以很方便的在每个版本之间进行切换了。
Git中的命令
- 创建版本库
git init
$ git init
这样就创建好了一个空的仓库了.
- 关联一个远程库,使用命令
git remote add origin git@xxx/repo-name.git
关联后,使用命令
git push -u origin master
将第一次推送master分支的所有内容 此后每次本地提交后,就可以使用命令
git push origin master
来推送最新修改了。
- 从远处仓库克隆
- 上面的情形是我们先有了本地库,后有远程库的时候,如何关联远程库。其实还存在有远程仓库,克隆到本地(这种更常见)。
当远程仓库已经准备好了,下一步是用命令
git clone
克隆一个本地库:$ git clone git@github.com:xxx.git
这时候你就会发现本地有一个和远程仓库一模一样的目录了。
- 上面的情形是我们先有了本地库,后有远程库的时候,如何关联远程库。其实还存在有远程仓库,克隆到本地(这种更常见)。
当远程仓库已经准备好了,下一步是用命令
- 将修改的文件放到Git仓库
第一步,用命令
git add
告诉Git,把文件添加到仓库:$ git add xxx.txt
第二步,用命令
git commit
告诉Git,把文件提交到仓库:$ git commit -m "change a xxx file"
git commit
命令,-m后面输入的是本次提交的说明,可以输入任意内容,这就是你改动的说明。 同步仓库见上方的命令git push origin master
- 查看文件状态,使用命令
git status
- 管理、撤销修改
其实Git跟踪并管理的是修改,而非文件。
当发现我们的修改存在问题,想要撤销刚刚的修改,就需要使用以下命令了
- 修改的内容在工作区中,使用命令
$ git checkout -- xxx.txt
.
- 修改的内容已经在暂存区中,使用命令
$ git reset HEAD xxx.txt $ git checkout -- xxx.txt
- 修改的内容在工作区中,使用命令
版本回退
当你的版本库中已经有了很多次的修改提交了,这时候发现最近几次的修改其实不需要了,这时候发现已经改动了很多,记不清了,这时候我们就根据Git的commit
jiu 可以很快捷的进行版本回退了。
- 回退到上一个版本
$ git reset --hard HEAD^
- 回退到某一个commit id = xxx的版本
$ git reset --hard 1094a
commit id
这里称作版本号,是版本的唯一标识。
在这对--hard
参数做下说明,下面介绍三种参数:
-
soft参数:
git reset --soft HEAD~1
意为将版本库软退回1个版本,将本地版本库的头指针全部重置到置顶版本,且会重置暂存区,即这次提交之后的所有变更都移动到未暂存阶段 -
默认的mixed参数:
git reset HEAD~1
意为将版本库退回1个版本,将本地版本库的头指针全部重置到置顶版本,且会重置暂存区,即这次提交之后的所有变更都移动到未暂存阶段 -
hard参数:
git reset --hard HEAD~1
意为将版本库退回1个版本,但是不仅仅是将本地版本库的头指针全部重置到置顶版本,也会重置暂存区,并且会将工作区代码也回退到这个版本
分支、标签的操作
- 创建与合并分支
其实每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。在Git里,有一个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
首先,我们创建
dev
分支,然后切换到dev
分支:$ git checkout -b dev
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:$ git branch dev $ git checkout dev
然后,用
git branch
命令查看当前分支: ``` $ git branch - dev master ``` git branch命令会列出所有分支,当前分支前面会标一个*号。
之后,我们把dev
分支的上的工作内容合并到master
分支上:
$ git merge dev
git merge
命令用于合并指定分支到当前分支。
- switch
实际上,我们除了使用
git checkout <branch>
来切换分支,还可以用switch
来实现,且更加明了 创建并切换到新的dev
分支,可以使用:$ git switch -c dev
直接切换到已有的
master
分支,可以使用:$ git switch master
使用新的
git switch
命令,比git checkout
要更容易理解。 - 删除分支
$ git branch -d <name>
- 创建标签
首先切换到要打标签的分支上,然后使用命令
$ git tag <name>
如果说想在某个版本上打标签,如
commit id是f112b233
,则命令是$ git tag <name> f112b233
- 查看标签
$ git tag
查看标签详情,使用命令:
$ git show <tagName>
- 删除标签
$ git tag -d <name>
- 推送标签到远程
$ git push origin <name>
或者一次性推送所有尚未推送到远程的本地标签
$ git push origin --tags
- 删除远程标签
$ git push origin :refs/tags/<name>
最后我想补充一点,关于工作现场存储
可能大家对这个比较陌生(反正我之前不知道( °◅° ))。 使用场景:开发过程中,通常会遇到bug需要修复。在Git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。 当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交: 并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办? 幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
当解决完bug后,工作区是干净的,刚才的工作现场存到哪去了?用git stash list
命令看看:
$ git stash list
stash@{0}: WIP on dev: fsds22 add merge
这时候我们需要恢复工作区
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
你可以多次stash
,恢复的时候,先用git stash list
查看,然后恢复指定的stash
,用命令:
$ git stash apply stash@{0}
- 复制一个特定的提交到当前分支
在master分支上修复了bug后,其实dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。
下面有一种简单的操作,
同样的bug,要在dev上修复,我们只需要把
fsdsd2
这个提交所做的修改“复制”到dev分支。需要注意:我们只想复制fsdsd2
这个提交所做的修改,并不是把整个master分支merge过来。 为了方便操作,Git专门提供了一个cherry-pick
命令,让我们能复制一个特定的提交到当前分支:避免重复劳动$ git cherry-pick fsdsd2
参考文档
最后
如果对大家有帮助,请github上follow和star,本文发布在戴超的技术博客,转载请注明出处