@ -139,7 +139,7 @@ git init
![](./res/git_repository.png)
> ** 提示**:用`ls -la`查看所有文件会发现在执行完上面的命令后,文件夹下多了一个名为`.git`的隐藏文件夹,这个文件夹 就是Git版本仓库。
> ** 提示**:用`ls -la`查看所有文件会发现在执行完上面的命令后,文件夹下多了一个名为`.git`的隐藏文件夹,这个就是本地的 Git版本仓库。
通过`git add`可以将指定的文件或所有文件添加到暂存区。
@ -184,7 +184,7 @@ git commit -m '本次提交的说明'
```Shell
git log
git log --graph --pretty= oneline --abbrev-commit
git log --graph --oneline --abbrev-commit
```
#### Git服务器概述
@ -205,7 +205,7 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
![](./res/gitee-add-members.png)
3. 项目的分支。创建项目后,项目只有一个默认的**master**分支,应该将该分支设置为“保护分支”来避免项目管理者之外的成员修改该分支。当然,如果需要我们也可以在线创建新的代码分支。
3. 项目的分支。创建项目后,项目只有一个默认的**master**分支,应该将该分支设置为“保护分支”来避免项目管理者之外的成员修改该分支(不可直接提交) 。当然,如果需要我们也可以在线创建新的代码分支。
4. 设置公钥实现免密访问。在项目的“设置”或“管理”中我们还可以找到“部署公钥管理”的选项, 通过添加部署公钥, 可以通过SSH( 安全远程连接) 的方式访问服务器而不用每次输入用户名和口令。可以使用`ssh-keygen`命令来创建密钥对。
@ -237,8 +237,6 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
其中,`-u`是`--set-upstream`的缩写,用来指定推送的服务器仓库,后面的`origin`就是刚才给仓库起的简短的别名,冒号前面的`master`是本地分支名,冒号后面的`master`是远程分支名,如果本地分支`master`已经和远程分支`master`建立过关联,则冒号以及后面的部分可以省略。
> ** 说明**: 一般不能直接将工作成果push到`master`分支,因为它通常是一个受保护分支。
3. 从远程仓库取回代码。
```Shell
@ -247,7 +245,7 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
#### Git分支操作
1. 创建和切换分支。下面的命令创建了名为`dev` 的分支并切换到该分支。
1. ** 创建** 和** 切换** 分支。下面的命令创建了名为`dev` 的分支并切换到该分支。
```Shell
git branch < branch-name >
@ -262,7 +260,7 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
> ** 注意**: 在之前的Git版本中, 切换分支使用`git checkout < branch-name > `命令,也可以通过`git checkout -b < branch-name > `来创建并切换分支。`git switch`命令目前仍然处于试验性阶段,但很明显这个命令更加清晰的表达了它要做的事情。
2. 关联远程分支。例如:如果当前所在的分支还没有关联到远程分支,可以使用下面的命令为它们建立关联。
2. ** 关联远程** 分支。例如:如果当前所在的分支还没有关联到远程分支,可以使用下面的命令为它们建立关联。
```Shell
git branch --set-upstream-to origin/develop
@ -288,7 +286,7 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
git branch --unset-upstream < branch-name >
```
3. 分支合并。例如在`dev`分支上完成开发任务之后,如果希望将`dev`分支上的成果合并到`master`,可以先切回到`master`分支然后使用`git merge`来做分支合并,合并的结果如下图右上方所示。
3. 分支** 合并** 。例如在`dev`分支上完成开发任务之后,如果希望将`dev`分支上的成果合并到`master`,可以先切回到`master`分支然后使用`git merge`来做分支合并,合并的结果如下图右上方所示。
```Shell
git switch master
@ -299,7 +297,7 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
在合并分支时, 没有冲突的部分Git会做自动合并。如果发生了冲突( 如`dev`和`master`分支上都修改了同一个文件),会看到`CONFLICT (content): Merge conflict in < filename > . Automatic merge failed; fix conflicts and then commit the result`(自动合并失败,修复冲突之后再次提交)的提示,这个时候我们可以用`git diff`来查看产生冲突的内容。解决冲突通常需要当事人当面沟通之后才能决定保留谁的版本,冲突解决后需要重新提交代码。
4. 分支变基。分支合并操作可以将多个分支上的工作成果最终合并到一个分支上,但是再多次合并操作之后,分支可能会变得非常的混乱和复杂,为了解决这个问题,可以使用`git rebase`操作来实现分支变基。如下图所示,当我们希望将`master`和`dev`上的工作成果统一到一起的时候,也可以使用变基操作。
4. 分支** 变基** 。分支合并操作可以将多个分支上的工作成果最终合并到一个分支上,但是再多次合并操作之后,分支可能会变得非常的混乱和复杂,为了解决这个问题,可以使用`git rebase`操作来实现分支变基。如下图所示,当我们希望将`master`和`dev`上的工作成果统一到一起的时候,也可以使用变基操作。
![](./res/git-rebase.png)
@ -311,7 +309,7 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
当我们在`dev`分支执行`git rebase`命令时,将首先计算`dev`分支和`master`分支的差集,然后应用该差集到`dev`分支,最后我们切回到`master`分支并执行操作合并,这样就看到了如上图右下方所示的干净的分支。
5. 删除分支。删除分支可以使用`git branch`加上`-d`参数,如果分支上的工作成果还没有合并,那么在删除分支时会看到`error: The branch '< branch-name > ' is not fully merged.`这样的错误提示。如果希望强行删除分支,可以使用`-D`参数。删除分支的操作如下所示。
5. ** 删除** 分支。删除分支可以使用`git branch`加上`-d`参数,如果分支上的工作成果还没有合并,那么在删除分支时会看到`error: The branch '< branch-name > ' is not fully merged.`这样的错误提示。如果希望强行删除分支,可以使用`-D`参数。删除分支的操作如下所示。
```Shell
git branch -d < branch-name >
@ -327,14 +325,31 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
git push origin :develop
```
或者
```Shell
git push origin --delete develop
```
#### Git其他操作
1. `git fetch` :下载远程仓库的所有变动,可以将远程仓库下载到一个临时分支,然后再根据需要进行合并操作,`git fetch`命令和`git merge`命令可以看作是之前讲的`git pull`命令的分解动作。
```Shell
git fetch origin master:temp
git merge temp
```
2. `git diff` :常用于比较工作区和仓库、暂存区与仓库、两个分支之间有什么差别。
3. `git stash` : 将当前工作区和暂存区发生的变动放到一个临时的区域, 让工作区变干净。这个命令适用于手头工作还没有提交, 但是突然有一个更为紧急的任务( 如线上bug需要修正) 需要去处理的场景。
```Shell
git stash
git stash list
git stash pop
```
4. `git reset` :回退到指定的版本。该命令主要有三个参数,如下图所示。
![](./res/git-reset.png)
@ -435,12 +450,15 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
```Shell
git checkout master
git merge --no-ff release-0.1
git tag -a 0.1
git push
git checkout develop
git merge --no-ff release-0.1
git push
git branch -d release-0.1
git tag -a v0.1 master
git push --tags
```
4. 从`master`分支创建`hotfix`分支, 在修复bug后合并到`develop`和`master`分支(上图右下)。
@ -458,12 +476,15 @@ Git不像SVN那样一定需要中央服务器才能工作, 上面我们演示
```Shell
git checkout master
git merge --no-ff hotfix-0.1.1
git tag -a 0.1.1
git push
git checkout develop
git merge --no-ff hotfix-0.1.1
git push
git branch -d hotfix-0.1.1
git tag -a 0.1.1
git push --tags
```
Git-flow流程比较容易控制各个分支的状况, 但是在运用上github-flow要复杂得多, 因此实际使用的时候通常会安装名为`gitflow`的命令行工具或者使用图形化的Git工具( 如: SmartGit、SourceTree等) 来简化操作, 具体的可以参考[《git-flow 的工作流程》](< https: / / www . git-tower . com / learn / git / ebook / cn / command-line / advanced-topics / git-flow > )一文,因为这篇文章写得已经很好了,本文不再进行赘述。