1 基础概念
1.1 git原理
git 把当前文件夹在生成一个 .git文件夹用作版本控制库,这个文件夹以后可能会很大,因为所有代码都存放在里面。
git分区
git有三个分区:
工作区(Working Directory):开发者直接编辑的地方,只要文件发生了更改,在这就会显示出来,包含追踪与未追踪文件。通过git add将工作区文件添加到暂存区。
暂存区(Stage | Index):数据暂时存放的区域,通过git commit将暂存区文件添加到本地版本库。
本地版本库(Local Commit History):存放所有已经提交的数据,通过git push推送到远程仓库。
2 git常用操作命令
从创建一个版本库到推送到远程仓库,合并冲突,分支,变基等操作,本次只对最常用的git命令进行介绍。
2.1 创建版本库
创建版本库可以是在本地使用git init
命令进行创建版本库,或者可以在远程仓库创建一个存储库,在远程创建一个readme.md文件,然后将此项目clone到本地,后续对项目的的操作就基于此存储库进行。
2.2 添加操作
git add <filename> // 添加到暂存区(stage)
git add . // 全部提交到暂存区
2.3 提交操作
git commit -m "description" // 提交到本地库(必须先add)
git commit -am "description" // 可提交未add文件,但是不包括新创建文件
git commit --amend -m "description" // 这个命令会将暂存区中的文件与最近一次的提交记录合并,并修改提交信息为本次提交的提交信息。
git commit --amend // 与上边的命令相似,不同的是它在将本次提交与最近一次提交记录合并时不会主动修改提交信息,需要你在输入这个命令后进入的vim编辑器手动更改,或者使用:q命令退出修改,使用上次提交的提交信息。
2.4 删除操作(删除)
git rm <file> // 从暂存区删除(stage) 删除文件到暂存区,可以使用git checkout <file> 恢复
git rm -f <file> // 删除之前修改过并且已经放到暂存区域 删除的可以是文件夹或者文件,删除位置与恢复同上
git rm --cached <file> // 如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除
2.5 撤销add
git checkout <file> // 恢复未提交的更改,会讲修改的文件恢复到上一次commit的状态,《注意》:使用git checkout 取消add的文件无法恢复,使用前要确认当前add的修改项确实无
git reset HEAD <file> // 取消之前 git add 添加,只是取消add,工作区的内容不会受到影响。
2.6 撤销commit
当你提交了代码到本地,但此时,你想撤回这个提交,重新编辑修改一下。这时你可以通过 git reset 来实现。
这个撤销分为是否保留修改。
保留修改:git reset --soft
,你之前所作的更改都在,这也称为最安全的撤销。
舍弃修改:git reset --hard
,你之前所作的更改都会消失,所以要谨慎使用。
2.7 版本回退
git reset --hard HEAD~ //回退到上一个版本
git reset --hard <commit ID> //回退到指定版本
2.8 文件状态查询
当你修改了一个文件,你就可以使用git status
去查询这个文件的状态
一般当使用此命令查询到当前工作区都修改了那些文件,如图:我们可以看到删除了readme.md与.DS_Store文件,新增了add文件,修改了hello.txt文件,他们的颜色代表他们当时的状态,绿色就是已经存储到了暂存区,红色就是仅保存在工作区,未提交到暂存区保存。
2.9 拉取代码
git pull origin master // (如果你想拉到本地的dev分支上,首先git checkout -b dev,然后使用git pull origin dev,这样就将本地dev分支与远程origin/dev相绑定了)
git pull --rebase origin <branch name> //当多人开发一个项目时,可能同时有多人修改同一个文件,当a修改了这个文件并推送到远程时,b也修改了这个文件,在他推送的时候会失败,这个时候如果他使用git pull 命令就会产生一条额外的merge记录,--rebase就可以避免。
git fetch // 查看远程仓库有没有更新,有更新就下载下来,如果没有更新就没有任何反应
对于git pull --rebase
命令的详细介绍,可以参考git pull --rebase的正确使用
2.10 推送代码
git push <远程仓库名称> <远程分支名称>
2.11 分支
当多人开发一个项目的时候,每个人都开发不同的业务,如果全部使用同一个分支开发就会比较乱,这个时候就需要使用到多分支开发的技术。
首先,我们可以使用git branch
命令来查看当前处于哪一个分支上和当前版本库总共有那些分支
使用git branch --remote
命令查看远程分支
当我们需要新建一个分支时,可以使用git branch <new branch name>
来创建一个新的分支,此分支是基于当前分支进行创建的,所以他与当前分支的代码相同,当我们需要删除一个分支时,就可以使用git branch -D <branch name>
来删除一个指定的分支。
使用git push -d origin <branch-name>
删除一个远程分支
创建分支以后,可以使用git checkout <branch name>
来切换到指定的分支,这样就可以多分支并行开发。
我们还可以使用git checkout -b <branch name>
来创建一个新的分支,同时切换到这个分支上。
2.12 合并分支
假如我们在开发的时候使用的是dev分支,当项目要上线时需要将dev的代码合并到master分支上,这个时候就用到了命令:git merge
,我们首先需要使用git checkout master来切换到master分支上,这个时候使用git merge dev
就可以把dev的代码合并到master上,或者dev将代码推送到远程,也可以使用git merge origin/main
将远程的指定分支的代码合并到当前分支。
推荐使用 git merge --no-ff dev
--no-ff 在这的作用是禁止快进式合并。
Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,叫做“快进”(fast-forward),比如下图:
A---B---C dev
/
D---E---F master
要把 dev 合并到 master 中,执行以下命令
$ git checkout master
$ git merge dev
结果就会变成
A---B---C dev
/ master
D---E---F
因为 dev 就在 master 的下游,所以直接移动了 master 的指针,master 和 dev 都指向了 C。而如果执行了 git merge --no-ff dev 的话,是下面的结果:
A---B---C dev
/ \
D---E---F-----------G master
由于 --no-ff 禁止了快进,所以会生成一个新的提交,master 指向 G。
从合并后的代码来看,结果其实是一样的,区别就在于 --no-ff 会让 Git 生成一个新的提交对象。为什么要这样?通常我们把 master 作为主分支,上面存放的都是比较稳定的代码,提交频率也很低,而 dev 是用来开发特性的,上面会存在许多零碎的提交,快进式合并会把 dev 的提交历史混入到 master 中,搅乱 master 的提交历史。所以如果你根本不在意提交历史,也不爱管 master 干不干净,那么 --no-ff 其实没什么用。不过,如果某一次 master 出现了问题,你需要回退到上个版本的时候,比如上例,你就会发现退一个版本到了 B,而不是想要的 F,因为 dev 的历史合并进了 master 里。
2.13 暂时保存
当我们正在开发代码时,有人将一份非常重要的代码推送到的远程,如果你不拉取的话项目就无法启动,这个时候如果我们将未开发完成的代码commit
以后再拉取的话,就会产生无用的commit信息,这个时候我们就用到了git stash
命令,git stash
可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的进行拉取代码,拉取代码后可以使用git stash pop
命令,将保存起来的代码重新恢复到工作区。
2.14 将本地项目推送到远程仓库
当我们在本地新建一个项目时,需要将他保存到远程仓库,这时候我们首先要做的就是先将本地项目与远程项目关联起来,我们首先查看本地是否关联远程仓库地址,使用命令git remote -v
命令,可以查看到是否关联到远程仓库
如果已经关联了,需要更换关联的仓库,首先要删除本地关联,使用git remote rm origin
命令,然后可以使用git remote add origin <url>
命令将需要关联的仓库关联到这个项目,然后拉取远程代码到本地,直接使用git pull origin master
命令会报错:
fatal: refusing to merge unrelated histories
这是因为两个根本不相干的 git 库, 一个是本地库, 一个是远端库, 然后本地要去推送到远端, 远端觉得这个本地库跟自己不相干, 所以告知无法合并
可以使用:
git pull origin master --allow-unrelated-histories。 // 允许无关的历史记录合并
来进行强制合并,这样就完成了两个仓库的合并,后续的操作就可以正常进行。
2.15 变基
git rebase和git merge区别
正如上图所示,变基的作用就是修整历史,将分支历史并入主线。
变基其实也是一种合并分支的方法。我们可以切换到dev分支下后,再用git reabse master
命令进行分支合并,当出现冲突时,使用:
git add test.txt
git rebase --continue
来合并冲突,接下来就可以切换回master分支,并快速合并两个分支。
2.16 git本地配置
使用git config --list
查看本地的所有配置
可以使用git config --global user.name "name"
设置全局用户名,使用git config --global user.name
查询。
使用git config --global user.email "email"
设置全局邮箱,使用git config --global user.email
查询。
3 IDEA集成git的使用
3.1 intelliJ IDEA使用git
首先,要在使用的IDEA中配置git(我使用的是intelliJ IDEA)
然后,可以看到idea的最上方
接下来就可以使用idea自带的工具来进行git操作了
这几个按钮从左到右的意思分别是拉取,提交,推送,历史记录,回滚。
在idea的右下方,可以选择切换分支,创建分支,合并分支,比较差异,变基等功能,甚至与idea在左下角的功能区专门提供了一个git的功能按钮,点击以后就可以看到以下内容:
他的功能包含了上边两个部分的功能总和还要多,你可以看到每一个分支的每一个提交的详情信息,对指定分支拉取推送,删除,变基,将指定的分支回滚到指定的提交记录,等功能。
在idea上方的git功能组件中,甚至包含了一个在 GitHub创建一个与项目名称相同的远程仓库,并将项目推送到元旦的功能。
这就避免了2.14所说的问题。
3.2 VSCode使用git
vs code的左功能栏有一个源代码管理的功能按钮,当你点击下去后会显示上图的效果(项目未使用git初始化时),这个时候你可以点击初始化存储库将项目放到本地存储库中,也可以点击发不到GitHub将代码直接发布到GitHub上,与idea的共享项目功能类似。
如果是一个已经初始化过的项目,点击以后
他会显示当前未提交到暂存去的文件列表,你可以点击一个文件查看他的修改记录。
当需要对文件进行add,commit,pull,push时,我们可以看到
可以点击对应的功能按钮进行git功能操作。
vscode的左下角显示的两个按钮
分别对应分支查看与远程仓库同步的功能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。