一文搞定Git
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
通俗来讲Git就是一个代码版本控制系统,多个开发人员可以协同开发,开发时可以将代码提交到本地,开发完成后,push到远端即可,不用到处备份copy代码,方便查看版本间的diff。
Windows
Mac OS X
终端执行
Linux
首先我们需要在终端界面初始化git文件夹,这里我们创建了demo文件夹并初始化
在初始化后,本地目录的文件就是在工作区中,在执行add后就添加到了暂存区,commit之后就正式存在本地仓库了
创建一个README.md文件,并添加Git中
添加到stage中
生成一个提交到本地仓库, -m后跟的内容为本次提交的描述信息,提交的文件为已经add到stage中的文件
随时查看本地git状态
如图就表示工作区中的文件均已提交到本地git仓库中
可以通过下面命令查看是否添加远端仓库成功
push本地提交到远端仓库
以上我们就完成了最简单的git提交
查看本地分支
查看所有分支
一般来说,一个项目组的主分支为master,当我们开发时,会创建一个dev分支,在本地开发测试完成后会合并到线上的分支,如staging,提交到线上staging测试完成后,再合并到主分支发布。我们可以使用下面的命令进行创建并切换分支
git checkout
一般有以下几种用途: 1. 切换创建新分支
检出commit,该操作会检出该commit,并detach(和git reset
不一样,reset是在当前分支回退,checkout不影响当前分支,只是检出)。如下,switch是新版本git引入切换分支的命令
去除对暂存区中文件的修改
git fetch
会将远端commit更新到本地,但并不会主动合并
git pull
就相当于git fetch origin master && git merge origin/master
如果暂存区的内容发生了改变,想要将这个改变暂时保存,可以使用git stash
如下,我们修改了README.md,新增了test文件
按照下面命令就可以保存啦
可以使用git stash list
和git stash show stash@{0}
查看stash信息
将缓冲堆栈中内容提取出来
当我们开发完代码git commit之后,我们就可以通过下面的命令查看提交历史
如图,每个commit都有对应的一个hash值(基本不可能碰撞)
后续如果我们需要开发,可以通过git diff等查看修改后的文件和之前commit文件的差异
当代码在本地开发并测试完成后,我们一般需要将代码合并到其他正式分支,解决冲突的具体操作我们在后面rebase中说明
rebase是git中非常强大的功能,既可以merge分支,也可以合并修改commit信息等。当我们本地开发时,可能会经常遇到刚提交完一个commit,发现代码中还有一些错误,于是又提交一个commit,会造成一个功能太多个commit,提交信息混乱,于是我们就需要合并这些无用的commit。
git rebase 分支名
git rebase demo
指当前分支合并demo分支,git merge
和git 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合并分支上的区别
git rebase
合并commit
查看当前master分支状态
可知,存在一些开发测试过程中的commit,我们需要对其进行合并,即将3个开发测试的commit合并成一个,可以执行如下命令,3为合并的commit数目
就会进入如下界面
按照提示修改pick为f,保存并退出即可
发现commit已经合并了
当rebase用于合并commit时
如果需要修改commit信息,可以使用如下命令
进入如下界面,修改并保存即可
发现commit信息已经被修正
简单粗暴,直接命令上手,下面命令将commitId改成要回退到的commit hash值在执行就可以回退到指定的commit
除了--hard还有--mixed和--soft, git reset默认是--mixed
mixed
使用git status查看状态,发现之前commit的文件已经回退到工作区
soft
发现使用soft重置之后,修改内容会添加到暂存区
hard
使用hard重置提交,提交的内容均会消失,如果不小心重置了,可以用git reflog查看并重置到指定的操作上哦!
我们在一个分支中可能会需要另一个分支的一个commit,这个时候我们就可以用到下面这个命令进行提取
如下状态,我们如果在rebase_demo分支获取master分支5d0d00a这个commit的内容,我们就可以使用cherry-pick
给当前分支最新的提交打上标签
查看标签
将标签推送到远端仓库
推送本地的所有tag
将标签打到具体的commit上
可以看到v0.7已经打到8c28b6f上了
如果打错标签了,需要删除,可以按照下面的命令
当然,这只是在本地删除标签,如果该标签已经推送到远端,想要删除的话,还得加上下面这一步
访问 下载安装
访问 下载安装
添加远端仓库(可以到中创建远端仓库,获取地址),origin为远端仓库名,可以自行指定