git 常用资源

git-1

一、正常开发流程

​仔细观察上面那张图,我们可以发现 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
2
develop > git add .
develop > git commit -m 'finish xxx'

​看下面这张图,你就知道我们在做什么了。

git-2

4、回到 master 分支进行 pull 操作

​为了下面 push 操作,我们首先进行一次 pull 作为准备。

1
2
develop > git checkout master
master > git pull

5、将 master 分支合并到 develop 分支

1
2
master > git checkout develop
develop > git merge master

6、将本地 develop 分支提交到远程仓库的 xxx 分支

​最后,我们将开发好的 develop 分支上传到远程仓库。

1
develop > git push --set-upstream origin develop

​到这里一个完整的基本 git 操作流程就完成了,但是在实际的合作中,我们会遇到各种各样的问题,下面的 开发问题 模块持续更新中。

二、开发问题

​每一个开发时遇到的问题,都是乱七八糟,甚至是匪夷所思的,那是因为我们接触地还不够多,我在这里设置的每一个问题都有不同的实际场景与不同的解决办法。

1、对某一些文件我不想在 status 中见到

表现

​换而言之,我对某一些文件的更改不想 push 到远程仓库,比如我们常常看到的显示方式文件 .DS_Store 文件。

解决

​现在我们需要在 git 项目下新建一个文件,名为 .gitignore ,顾名思义,就是在这个文件中声明的文件,在 git 操作时都将被忽略。

1
2
3
4
5
# 创建一个 .gitignore 文件
touch .gitignore
# 写入内容
vim .gitignore
# 写入.Ds_Store

​现在再次查看 git status ,声明的文件已经不见了。

2、push 时发现有人更新

表现

​比如我有一个内容搞不定,但是在某人帮助下他成功搞定了这个内容,然后 push 到我所在开发的分支上,此时我认为我更改的内容和他更改的内容是不冲突的,但是我此时无法 push 的,只能将远程内容先再次保存回本地。提示如下:

1
2
3
4
5
6
7
8
9
git push origin develop:xxx
To (somewhere)
! [rejected] develop -> xxx (fetch first)
error: failed to push some refs to '(somewhere)'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决

​那么根据提示照做吧:

1
2
# 进行 pull
git pull origin xxx:develop

​现在错误已经不再是 push 不上去的问题了。

3、pull 请求被拒绝

表现

1
2
git pull origin xxx:develop
! [rejected] xxx -> develop (non-fast-forward)

​这是因为因为 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
2
3
4
5
6
# 查看 log 信息
git log
# 切换回上一次 commit 的状态
git reset --hard <hashcode>
# 强制提交
git push --force origin develop:xxx

​现在,我们回到了上一次 commit 的情况,当然可以重新 add commit 了,这就提醒我们,常常更新本地repo,也就是 commit 到本地,做到一个保存的效果。

5、回滚以后继续开发

表现

​一个分支出现了问题,我们对其进行回滚,等于对之前的 push 进行了一个相反的操作,错误分支消失了,此时想在之前错误的分支上继续开发应该怎么做呢?

解决

​此时,我们应该再次执行回滚 revert 操作。

pic-回退

​我们假设基版本为10,我们的错误分支为a,merge a 分支之后,基版本变为11,也就是错误的版本。现在我们进行 revert 版本继续提升,等于提交一个 a 相反的 a’,版本变为12,我们当前进行 merge ,先消除之前的错误。此时,我们再次 revert ,版本成为 13,a 分支又出现了,现在就可以在这个 mr 状态下继续操作了。

6、meger 冲突解决

表现

​在团队开发中我们常常会遇到 merge 失败的情况:

1
2
3
4
5
git merge origin/master

Auto-merging <文件路径>
CONFLICT (content): Merge conflict in <文件路径>
fix conflicts and then commit the result.

解决

​打开指定的文件,可以搜索到 <<<<<<<=======>>>>>>> ,这样的符号,比如如下内容:

1
2
3
4
5
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> xxx

​意思很简单,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
2
3
4
5
6
# 创建远程分支
git push --set-upstream origin xxx
# 获取远程各对应分支代码
git pull
# 合并主干分支 master 到当前分支
git merge origin/master

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 撤销修改

​之前也讨论过 commitpush 以后发生错误,当时使用的方法是 —force ,这里给出的方法更加平和,适合少量错误修改

9、删除远程分支和本地分支

1) git push origin --delete xxx 删除远程分支

2)git branch -d xxx 删除本地分支

CONTINUE…