Git 分支管理

当我们利用git init初始化一个文件夹的时候,这个时候是没有不论什么分支的。由于还没有不论什么文件纳入Git管理流程呢。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git init
Initialized empty Git repository in /cygdrive/f/test_workspace/.git/

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch

当我们加入第一个文件。并将其提交的时候,Git就会为我们默认创建一个分支,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   first.txt
#

利用git status命令,能够看到当前Git所处的分支是master分支。


当提交之后。输入git branch 命令,能够看到:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch
* master

能够看到。此时Git系统中仅仅有一个分支,假设有多个分支。*号则表明为当前的分支。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
* master 8119ddd Add Content to first.txt

而利用-v參数。则能够将当前分支的最新提交 8119ddd。还有其提交信息给显示出来。

利用cat 命令来看当前first.txt中的内容,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ cat first.txt
Test content in first.txt

之后,能够在这个时候再创建另外一个分支。比方叫做second分支,为其创建一个文件叫second.txt,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch second

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch
* master
  second

利用git branch <分支名>,能够创建一个分支,而此时,再利用git branch 可看到已经存在两个分支了,*号表明眼下还是处于master分支。

能够利用git checkout 命令来切换分支,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout second
Switched to branch 'second'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch
  master
* second

可看到" Switched to branch 'second' " 字样,并且 * 号也在second 前面了,表明当前是处于second分支。

为second分支加入一个文件,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  master 8119ddd Add Content to first.txt
* second b981d42 Add second txt in second branch

能够看到second分支的最新提交是b981d42,就是加入了second.txt的提交。

此时切换到master分支,来看看此目录以下的文件,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout master
Switched to branch 'master'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt

能够看到second.txt文件并不在此分支以下。
这就是分支的主要作用。在一个新的分支上面所做的提交,不会影响到其它分支的内容。


那么怎样将second分支所做的改动整合到master分支中呢?
这有两种做法,有一种叫merge,有一种叫rebase。


在我看来,merge跟rebase就是谁主动谁被动的区别。
对于merge来说,要由master主动去将发生在second中的改变给整合过来。
对于rebase来说,要将在third的改变去在master中再所有走一遍,然后会得到一个新的third提交。


一般来说,rebase是为了得到一个干净的提交记录。有助于项目管理者去整合其它工作者提交的文件。

我们先创建一个thrid分支,利用second分支来学习merge。利用third分支来学习rebase。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  master 8119ddd Add Content to first.txt
  second b981d42 Add second txt in second branch
* third  4150467 Add third txt in third branch

此时三个分支的提交如上,我们再分别看看各分支下的内容:

third分支:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  master 8119ddd Add Content to first.txt
  second b981d42 Add second txt in second branch
* third  4150467 Add third txt in third branch

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt  third.txt

second分支:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout second
Switched to branch 'second'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt  second.txt

master分支:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout master
Switched to branch 'master'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt

接下来,我们将second分支merge到master分支中,例如以下,在master分支下,利用merge命令:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git merge second
Updating 8119ddd..b981d42
Fast-forward
 second.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 second.txt

这样,就将second分支给整合进来了。再看一下当前分支下的内容:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt  second.txt

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
* master b981d42 Add second txt in second branch
  second b981d42 Add second txt in second branch
  third  4150467 Add third txt in third branch

可看到 master和second分支的最新引用都是 b9d81d42。

接下来。我们要切换到third分支,利用rebase,将在third分支发生的改变在master分支上重演。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout third
Switched to branch 'third'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: Add third txt in third branch

在这里。能够看到"rewinding head"等字样。这是由于master分支先整合了second分支,所以它的最新引用比当时切换出third分支的时候要往前,这个时候,会得到一个新的third提交,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  master b981d42 Add second txt in second branch
  second b981d42 Add second txt in second branch
* third  6dc82e8 Add third txt in third branch

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt  second.txt  third.txt

能够看到。third的最新提交的引用已经由上面的4150467变成6dc82e8了。


它事实上就是一个master提交。上面再重演了一遍third提交。

只是此时master还是在它原来的位置上。所以须要对master做一次fast forward,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout master
Switched to branch 'master'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git merge third
Updating b981d42..6dc82e8
Fast-forward
 third.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 third.txt

在这里。因为演示样例的文件比較简单。结构也不复杂。所以看起来,跟merge事实上区别不大,可是本质上,这是两种不同的整合方式。

好了,如今我们已经将second和third分支都给整合进来了。不再须要它们了,能够把它们删掉。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -d third
Deleted branch third (was 6dc82e8).

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
* master 6dc82e8 Add third txt in third branch
  second b981d42 Add second txt in second branch

在上面加入分支的时候。我们是利用以下两个命令来进行加入分支跟切换分支,

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch second

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout second
Switched to branch 'second'

而其实非常多情况,我们在创建分支的时候,就会想顺便切换过去了,所以通过指定 -b 參数,就能够实现我们的目的。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout -b forth
Switched to a new branch 'forth'

这跟上一章Git中提交中使用 -a 參数直接将加入进暂存区和提交到本地仓库整合成一步的道理是一样的。
Git中提供了多种这种方式供我们使用。

在Git中,除了提供merge,rebase这两种工具来帮助我们整合文件之外,还提供了一个reset工具。依据当中文意思就是“重置”。它能够帮助我们将混乱的文件或者错误提交的文件给重置到某一次我们指定的提交上。

比方,如今在master分支中second.txt中不小心加入了一些错误的内容,并将其提交了,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  forth  6dc82e8 Add third txt in third branch
* master 37562da Add Wrong Data in second.txt
  second b981d42 Add second txt in second branch

那我们想将这一次的提交去掉,不要它了。那么就能够利用reset命令。例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git reset 6dc82e8
Unstaged changes after reset:
M       second.txt
  
linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  forth  6dc82e8 Add third txt in third branch
* master 6dc82e8 Add third txt in third branch
  second b981d42 Add second txt in second branch

这个时候,我们能够看到master已经回到之前的版本号了,而我们这一次改变的内容还留在second.txt中,
处于已改动。未暂存的状态。这个时候我们就能够自己去对这些错误的内容进行修正,再次提交了。

reset还有几个參数可供选择,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git reset --v
error: unknown option `v'
usage: git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]
   or: git reset [-q] <commit> [--] <paths>...
   or: git reset --patch [<commit>] [--] [<paths>...]

    -q, --quiet           be quiet, only report errors
    --mixed               reset HEAD and index
    --soft                reset only HEAD
    --hard                reset HEAD, index and working tree
    --merge               reset HEAD, index and working tree
    --keep                reset HEAD but keep local changes
    -p, --patch           select hunks interactively

可利用各參数重置到不同的程度,当中index指的就是暂存区域。

如果用--soft。仅仅会重置HEAD,也就是说改变的内容会被加入到暂存区域(index),仅仅要再次提交就能够,例如以下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git reset --soft 6dc82e8

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   second.txt
#

而假设使用--hard。则会将工作文件夹的改变也给重置掉。切记。

好了。到这里,关于在本地怎样利用Git的分支管理。相信大家在心中也有一个初步的理解了。

结束。

原文地址:https://www.cnblogs.com/wgwyanfs/p/7097965.html