GIT版本管理

Posted zhichun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GIT版本管理相关的知识,希望对你有一定的参考价值。

# 学习网站

##### 猴子都能懂的git入门

https://backlog.com/git-tutorial/cn/intro/intro1_1.html

修改内容的提交:

第1行:提交修改内容摘要

第2行:空行

第3行:修改的理由

###### 工作树和索引
数据库--(提交)索引--(提交)工作树

###### 安装git

下面链接的网页介绍免费的SourceTree客户端。

http://www.sourcetreeapp.com/

 

---
课程根据以下链接网站学习:
https://morvanzhou.github.io/tutorials/others/git/2-1-repository/


###### 创建版本库(init)

在桌面上创建一个gitTUTO文件夹

在terminal 中输入如下代码


```
cd Desktop/gitTUTO
```
添加用户名和邮件,这样人和修改能够对应上


```
git config --global user.name "beijing01"
git

git config --global user.email "hongyangliu@outlook.com"
```

然后我们就能在这个文件夹中建立 git 的管理文件了:


```
git init
```

 


---

添加文件管理(add)

通常我们执行 $ ls 就能看到文件夹中的所有文件, 不过 git 创建的管理库文件 .git 是被隐藏起来的. 所以我们要执行这一句才能看到被隐藏的文件:


```
ls -a
```

现在我们能用 status 来查看版本库的状态:


```
git status
```

现在 1.py 并没有被放入版本库中 (unstaged), 所以我们要使用 add 把它添加进版本库 (staged):


```
git add 1.py
```

再次查看状态 status


```
git status
```

如果想一次性添加文件夹中所有未被添加的文件, 可以使用这个:


```
git add .
```


---

提交改变(commit)

我们已经添加好了 1.py 文件, 最后一步就是提交这次的改变, 并在 -m 自定义这次改变的信息:

```
git commit -m "creat1.py"
```


---

流程图

---


<html border="1">
<table>
<tr>
<th>untracked</th>
<th>unmodified</th>
<th>modified</th>
<th>staged</th>
</tr>
<tr>
<td colspan = "4">->add the file-></td>
</tr>
<td></td>
<td colspan="2">->edit the file-></td>
<td></td>
<tr>
<td> <-remove the file<- </td>
<td colspan="3"></td>
</tr>
<tr>
<td></td>
<td colspan="3"><-commit<-</td>
</tr>
</table>
</html>

---

# 记录修改

查看修改作者和日期

```
git log
```


```
vi 2.py
a = 1
```
使用查看修改还没被提交信息

```
git status
```

所以我们先把这次修改添加 (add) 到可被提交 (commit) 的状态, 然后再提交 (commit) 这次的修改:


```
git add 2.py
git commit -m "change 1"
```

再次查看log,2.py和change 1这两条修改信息,commit后的ID和作者信息也显示出来

## 查看unstaged

如果想要查看这次还没 add (unstaged) 的修改部分 和上个已经 commit 的文件有何不同, 我们将使用 $ git diff:


```
git diff
```

## 查看staged

如果已经add了修改,文件变成了“可提交状态”staged,可以在diff中添加参数--cached来查看


```
git add .
git diff --cached
```

还有种方法让我们可以查看 add 过 (staged) 和 没 add (unstaged) 的修改, 比如我们再修改一下 1.py 但不 add:

添加c=b 编程unstaged状态
```
a=2
b=1
c=b
```

目前 a = 2 和 b = 1 已被 add, c = b 是新的修改, 还没被 add.


```
git diff HEAD

git diff

git diff --cached
```

为了下节内容, 我们保持这次修改, 全部 add 变成 staged 状态, 并 commit.


```
git add .
git commit -m "change 2"
```

---

# 回到从前


###### 修改已commit的版本

我们将要添加另外一个文件, 将这个修改也 commit 进 change 2. 所以我们复制 1.py 这个文件, 改名为 2.py. 并把 2.py 变成 staged, 然后使用 --amend 将这次改变合并到之前的 change 2 中.


```
git add 1.py
git commit --amend --no-edit
git log --oneline
```
###### reset回到add之前

有时我们添加 add 了修改, 但是又后悔, 并想补充一些内容再 add. 这时, 我们有一种方式可以回到 add 之前. 比如在 2.py 文件中添加这一行:


```
d=3
```

然后 add 去 staged 再返回到 add 之前:


```
git add 2.py
git reset 2.py
git status -s
```

 

###### reset回到commit之前

每个 commit 都有自己的 id 数字号, HEAD 是一个指针, 指引当前的状态是在哪个 commit. 最近的一次 commit 在最右边, 我们如果要回到过去, 就是让 HEAD 回到过去并 reset 此时的 HEAD 到过去的位置.

不管我们之前有没有做了一些 add 工作, 这一步让我们回到 上一次的 commit


```
git reset --hard HEAD
#输出
HEAD is now at 904e1ba change 2
```
查看

```
git log --oneline
```


回到change1

```
#方式1:
git reset --hard HEAD^
#方式2:
git reset --hard HEAD id
```

查看log

```
git log --oneline
```


怎么 change 2 消失了!!! 还有办法挽救消失的 change 2 吗? 我们可以查看 $ git reflog 里面最近做的所有 HEAD 的改动, 并选择想要挽救的 commit id:


```
git reflog
```


重复 reset 步骤就能回到 commit (amend): change 2 (id=904e1ba)这一步了:


```
git reset --hard 904e1ba
git log --oneline
```
# 回到从前(checkout针对单个文件)


```
49df39c change2
8bb8ca2 2.py
ad046d3 first commit
```


我们仅仅要对2.py进行回到过去操作,回到8bb8ca2 2.py这一个commit.使用
git checkout + id(8bb8ca2) + -- +1.py文件目录

这时 1.py 文件的内容就变成了:


```
a = 1
```

我们在 1.py 加上一行内容 # I went back to change 1 然后 add 并 commit 1.py:


```
git add 1.py
git comment -m "backe to change 1 and commit for 1.py"
git log --oneline
```


# 分支(branch)

###### 使用branch建立dev分支
我们之前的文件当中, 仅仅只有一条 master 分支, 我们可以通过 --graph 来观看分支:
```
git log --oneline --graph
```

```
git branch dev
```

###### 使用checkout创建dev分支

接着我们建立另一个分支 dev, 并查看所有分支:

建立分支

```
git branch dev
```

```
git branch
```
当我们想把 HEAD 切换去 dev 分支的时候, 我们可以用到上次说的 checkout:

 


```
git checkout dev

git branch
```
*号代表还没到dev这个分支

###### 在dev分支中修改

使用checkout -b+分支名就能直接创建和切换到新建的分支


```
git checkout -b dev
```

将dev的修改推送到master


```
git add 1.py
git commit -m "change 3"

git checkout master
```
此时查看未发现更改

切换至master才能将其他merge归并回来

```
git merge dev
git log --oneline --graph
```

要注意的是, 如果直接 git merge dev, git 会采用默认的 Fast forward 格式进行 merge, 这样 merge 的这次操作不会有 commit 信息. log 中也不会有分支的图案. 我们可以采取 --no-ff 这种方式保留 merge 的 commit 信息.


```
git merge --no-ff -m "keep merge info" dev
git log --oneline --graph
```

# merge分支冲突

出现情况:不仅有人在做dev的更新,还有人在做master中的bug.当我们在merge的时候,冲突就来了。因为 git 不知道应该怎么处理 merge 时, 在 master 和 dev 的不同修改.

当创建了一个分支后, 我们同时对两个分支都进行了修改.

比如在1.py中加上


github推送
git commit -am "change5"

 


---

以上是关于GIT版本管理的主要内容,如果未能解决你的问题,请参考以下文章

git-GUI版本管理 在win10下怎么设置成中文界面

使用git管理文件版本

版本管理 - Git 使用入门

GIt版本管理

使用Git管理代码版本

谈谈分布式版本管理工具Git