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版本管理的主要内容,如果未能解决你的问题,请参考以下文章