git 常用资源
一、正常开发流程
仔细观察上面那张图,我们可以发现 workspace 和 本地repo 是分离的,事实上,我们我们在本地操作的内容是 workspace 里的内容,而其内容来源是本地或者远程。
1、克隆到本地 repo
因此,我们需要做的第一件事,就是将远程的项目克隆一个到本地。
1 | git clone xxx |
2、创建 develop 分支
当然我们 clone 操作以后,默认在 master 分支下,首先我们创建一个develop分支,作为开发的分支。
1 | master > git checkout -b develop |
执行该指令以后,我们可以发现我们从原先的 master 分支切换到了 develop 分支。这一步我们也可以省略,但是为了充分展示 git 的基本操作以及良好的开发习惯,我先创建了这个分支。
3、提交到本地 repo
假设我们现在要写的是一个 js ,我们在当前分支下进行一些列工作,比如 touch xxx.js
。
等到本地单元测试完成,我们就可以开心愉快地先在本地提交了。
1 | develop > git add . |
看下面这张图,你就知道我们在做什么了。
4、回到 master 分支进行 pull 操作
为了下面 push
操作,我们首先进行一次 pull
作为准备。
1 | develop > git checkout master |
5、将 master 分支合并到 develop 分支
1 | master > git checkout develop |
6、将本地 develop 分支提交到远程仓库的 xxx 分支
最后,我们将开发好的 develop 分支上传到远程仓库。
1 | develop > git push --set-upstream origin develop |
到这里一个完整的基本 git 操作流程就完成了,但是在实际的合作中,我们会遇到各种各样的问题,下面的 开发问题 模块持续更新中。
二、开发问题
每一个开发时遇到的问题,都是乱七八糟,甚至是匪夷所思的,那是因为我们接触地还不够多,我在这里设置的每一个问题都有不同的实际场景与不同的解决办法。
1、对某一些文件我不想在 status 中见到
表现
换而言之,我对某一些文件的更改不想 push
到远程仓库,比如我们常常看到的显示方式文件 .DS_Store 文件。
解决
现在我们需要在 git 项目下新建一个文件,名为 .gitignore ,顾名思义,就是在这个文件中声明的文件,在 git 操作时都将被忽略。
1 | 创建一个 .gitignore 文件 |
现在再次查看 git status
,声明的文件已经不见了。
2、push 时发现有人更新
表现
比如我有一个内容搞不定,但是在某人帮助下他成功搞定了这个内容,然后 push
到我所在开发的分支上,此时我认为我更改的内容和他更改的内容是不冲突的,但是我此时无法 push
的,只能将远程内容先再次保存回本地。提示如下:
1 | git push origin develop:xxx |
解决
那么根据提示照做吧:
1 | 进行 pull |
现在错误已经不再是 push
不上去的问题了。
3、pull 请求被拒绝
表现
1 | git pull origin xxx:develop |
这是因为因为 commit
版本不一致,导致无法更新,这个错误多发生在多人更改同一个项目,也有可能发生在使用了 git commit --amend
or git rebase
操作。
解决
先给出一个临时性的方案,如果你非常确定更改的内容与自己内容的差别,可以使用一种非常简单粗暴的方法:
1 | git push --force origin develop:xxx |
当然这个方法用到了 —force
,因此并不推荐。
4、commit 以后或 push 以后发现有错误
表现
我们通过 git status
命令查看到一些更改,在使用 git add.
以后,不小心将不必要的内容也加入到了本地 repo ,现在我再想 git push
的话,会将我发现错误的 commit
内容一并发送,那么现在怎么办呢?
相似地,commit
时候问题没有解决,我们将内容 push
到了远程仓库,那么此时我们应该怎么办呢?
解决
有一个看似麻烦的方法,使用 git log
指令查看最近 commit
的 hash 值,使用:
1 | 查看 log 信息 |
现在,我们回到了上一次 commit
的情况,当然可以重新 add commit
了,这就提醒我们,常常更新本地repo,也就是 commit
到本地,做到一个保存的效果。
5、回滚以后继续开发
表现
一个分支出现了问题,我们对其进行回滚,等于对之前的 push
进行了一个相反的操作,错误分支消失了,此时想在之前错误的分支上继续开发应该怎么做呢?
解决
此时,我们应该再次执行回滚 revert
操作。
我们假设基版本为10,我们的错误分支为a,merge a
分支之后,基版本变为11,也就是错误的版本。现在我们进行 revert
版本继续提升,等于提交一个 a 相反的 a’,版本变为12,我们当前进行 merge
,先消除之前的错误。此时,我们再次 revert
,版本成为 13,a 分支又出现了,现在就可以在这个 mr 状态下继续操作了。
6、meger 冲突解决
表现
在团队开发中我们常常会遇到 merge
失败的情况:
1 | git merge origin/master |
解决
打开指定的文件,可以搜索到 <<<<<<< 、======= 、 >>>>>>> ,这样的符号,比如如下内容:
1 | <<<<<<< HEAD |
意思很简单,HEAD 后面的内容是当前分支上的内容,下面用 ======= 分割需要 merge
的 xxx 分支,然后显示 xxx 分支下的内容,手动调整即可。
7、合并 master
表现
首先讲讲 master、 origin master 与 origin/master 有什么区别? master 就是本地某个分支名; origin master 代表两个概念,前面 origin 代表远程名,后面的 master 代表远程分支名; origin/master 只代表一个概念,及远程分支名,是从远程拉去代码后在本地的一份拷贝。
在日常生活中,我们常常会听到 “合并一下主干” 这样的词汇,那要怎么办呢?
解决
首先确保当前分支在远程有对应的分支,然后进行 git pull
,接着使用 git merge origin/master
,出现错误就逐一更正。
1 | 创建远程分支 |
8、撤销文件修改
表现
假设我们修改了 a , b 两个文件,我们现在想撤销对 a 的修改,那么这里分三种情况:
1) 如果没有被 git add
到索引区
2) 撤销工作区中文件 a 的修改
3) 如果已被提交,则需要先回退当前提交到工作区,然后撤销文件a的修改
解决
1) 使用 git checkout a
撤销修改
2) 分两步:第一步, git reset HEAD a
将 a 从索引区移除(但是还是保留在工作区) ; 第二步,根据第一种情况,使用 git checkout a
撤销修改
3) 分两步:第一步,git reset HEAD^
回退当前提交到工作区 ; 第二步,根据第一种情况,使用 git checkout a
撤销修改
之前也讨论过 commit
和 push
以后发生错误,当时使用的方法是 —force
,这里给出的方法更加平和,适合少量错误修改
9、删除远程分支和本地分支
1) git push origin --delete xxx
删除远程分支
2)git branch -d xxx
删除本地分支
CONTINUE…