一文搞定Git

Git

通俗来讲Git就是一个代码版本控制系统,多个开发人员可以协同开发,开发时可以将代码提交到本地,开发完成后,push到远端即可,不用到处备份copy代码,方便查看版本间的diff。

安装git

  1. Windows

    访问 Git官网arrow-up-right 下载安装

  2. Mac OS X

    终端执行

  3. Linux

    访问 Git官网arrow-up-right 下载安装

快速上手

  1. 首先我们需要在终端界面初始化git文件夹,这里我们创建了demo文件夹并初始化

    在初始化后,本地目录的文件就是在工作区中,在执行add后就添加到了暂存区,commit之后就正式存在本地仓库了

  2. 创建一个README.md文件,并添加Git中

  3. 添加到stage中

  4. 生成一个提交到本地仓库, -m后跟的内容为本次提交的描述信息,提交的文件为已经add到stage中的文件

  5. 随时查看本地git状态

    如图就表示工作区中的文件均已提交到本地git仓库中

  6. 添加远端仓库(可以到Githubarrow-up-right中创建远端仓库,获取地址),origin为远端仓库名,可以自行指定

    可以通过下面命令查看是否添加远端仓库成功

  7. push本地提交到远端仓库

以上我们就完成了最简单的git提交

进阶

查看分支

  1. 查看本地分支

  2. 查看所有分支

创建并切换分支

一般来说,一个项目组的主分支为master,当我们开发时,会创建一个dev分支,在本地开发测试完成后会合并到线上的分支,如staging,提交到线上staging测试完成后,再合并到主分支发布。我们可以使用下面的命令进行创建并切换分支

git checkout一般有以下几种用途: 1. 切换创建新分支

  1. 检出commit,该操作会检出该commit,并detach(和git reset不一样,reset是在当前分支回退,checkout不影响当前分支,只是检出)。如下,switch是新版本git引入切换分支的命令

  2. 去除对暂存区中文件的修改

拉取远端分支

  1. git fetch会将远端commit更新到本地,但并不会主动合并

  2. git pull就相当于git fetch origin master && git merge origin/master

将修改保存进缓冲堆栈

如果暂存区的内容发生了改变,想要将这个改变暂时保存,可以使用git stash

如下,我们修改了README.md,新增了test文件

按照下面命令就可以保存啦

可以使用git stash listgit stash show stash@{0}查看stash信息

将缓冲堆栈中内容提取出来

查看提交历史

当我们开发完代码git commit之后,我们就可以通过下面的命令查看提交历史

如图,每个commit都有对应的一个hash值(基本不可能碰撞)

查看文件修改差异

后续如果我们需要开发,可以通过git diff等查看修改后的文件和之前commit文件的差异

合并分支

当代码在本地开发并测试完成后,我们一般需要将代码合并到其他正式分支,解决冲突的具体操作我们在后面rebase中说明

合并多个提交rebase

rebase是git中非常强大的功能,既可以merge分支,也可以合并修改commit信息等。当我们本地开发时,可能会经常遇到刚提交完一个commit,发现代码中还有一些错误,于是又提交一个commit,会造成一个功能太多个commit,提交信息混乱,于是我们就需要合并这些无用的commit。

  1. git rebase 分支名

    git rebase demo指当前分支合并demo分支,git mergegit rebase的差异在于如果当前分支已经有了新的提交(demo分支中不存在的提交),git merge就会产生一个merge commit(即一个额外的提交),git rebase则不会。实践出真知,直接开始操作

    在之前master分支"add README.md"提交之后切出新创建的rebase_demo分支和merge_demo分支

    通过git log查看提交历史,发现已经提交

    切换到master分支rebase我们的rebase_demo分支

    将rebase_demo分支合并到master分支成功,并且没有产生新的提交,我们接着通过merge的方式来看有没有新的提交

    通过git log查看提交历史,发现已经提交

    可知,当发起合并的分支中没有新commit时,rebase和merge都是不会产生新的提交的,我们现在来看看当存在新提交时,会是什么情况

    首先,我们来看下当前的分支情况

    master当前位于第一个提交,而rebase_demo分支提交了一个rebase demo, merge_demo提交了一个merge demo,为了产生冲突,我们在master分支提交一个master demo即可

    此时每个分支都对文件README.md做出了修改,这时将rebase_demo或merge_demo合并到master,都将产生冲突

    通过git status查看状态

    修改冲突文件,将<<<<<<< HEAD >>>>>>> 2ce5a34... master demo之间的内容修改成最终的,wq保存退出,重新git add

    rebase_demo分支已经rebase到master分支,并没有产生新的提交

    回到最初状态继续尝试下merge

    通过git reflog可以查看所以git操作的id,随时可以回退到对应的id

    我们通过git reset回到对应操作id上

    一切如初,继续尝试merge

    发现解决完冲突之后,会提示需要commit来结束冲突,所以当存在冲突时merge会产生额外一个commit

    可知产生了52ecde5这个额外的commit,以上就是rebase和merge合并分支上的区别

  2. git rebase合并commit

    查看当前master分支状态

    可知,存在一些开发测试过程中的commit,我们需要对其进行合并,即将3个开发测试的commit合并成一个,可以执行如下命令,3为合并的commit数目

    就会进入如下界面

    按照提示修改pick为f,保存并退出即可

    发现commit已经合并了

    当rebase用于合并commit时

    如果需要修改commit信息,可以使用如下命令

    进入如下界面,修改并保存即可

    发现commit信息已经被修正

重置提交reset

简单粗暴,直接命令上手,下面命令将commitId改成要回退到的commit hash值在执行就可以回退到指定的commit

除了--hard还有--mixed和--soft, git reset默认是--mixed

  1. mixed

    使用git status查看状态,发现之前commit的文件已经回退到工作区

  2. soft

    发现使用soft重置之后,修改内容会添加到暂存区

  3. hard

    使用hard重置提交,提交的内容均会消失,如果不小心重置了,可以用git reflog查看并重置到指定的操作上哦!

提取commit

我们在一个分支中可能会需要另一个分支的一个commit,这个时候我们就可以用到下面这个命令进行提取

如下状态,我们如果在rebase_demo分支获取master分支5d0d00a这个commit的内容,我们就可以使用cherry-pick

给commit打上标签

给当前分支最新的提交打上标签

查看标签

将标签推送到远端仓库

推送本地的所有tag

将标签打到具体的commit上

可以看到v0.7已经打到8c28b6f上了

如果打错标签了,需要删除,可以按照下面的命令

当然,这只是在本地删除标签,如果该标签已经推送到远端,想要删除的话,还得加上下面这一步

最后更新于