Featured image of post Git进阶之合并远程分支、rebase、储藏

Git进阶之合并远程分支、rebase、储藏

2871 words

合并远程分支

合并远程分支的一般步骤是:

1.第一步,分别获取远程分支内容到本地; 2.第二步,在本地将两个分支合并; 3.第三步,将合并后的本地分支推送到远程分支,完成合并。

具体的,以将远程develop分支合并到远程master分支为例,操作过程如下: 1.获取远程develop分支到本地分支(如develop分支)。如果本地已经有分支对应远程develop分支,则可以直接在该分支上执行pull操作或者fetch/merge操作,以获取远程最新内容。否则,可以新建分支跟踪远程develop分支,并获取最新内容到本地;

2.切换到master分支,并获取远程master分支的最新内容到本地;

3.将本地develop分支合并到本地master分支;

4.将本地master分支推送到远程master分支。

以合并远程develop分支到远程master分支为例,其具体操作步骤如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#切换到develop分支
git checkout develop
#获取远程develop分支的内容到本地
git pull origin develop:develop
#切换到master分支
git checkout master
#拉取远程master分支内容到本地
git pull origin master
#合并本地develop分支到master分支
git merge develop
#将合并后的分支推送到远程master分支
git push origin master:master

rebase操作

merge和rebase的不同

merge的工作流程如下图:

如上图所示,我们从远程仓库origin的C2版本,创建一个新的分支develop进行开发,并进行了C5、C6两次提交。之后团队中其他成员又向origin推送了两次提交C3、C4。为了合并远程分支上的新内容到本地,我们进行merge操作,将内容合并到develop之后,生成了一次新的提交C7。此时,develop分支还是一个独立的分支。

而rebase的工作流程如下图:

rebase又可称为‘变基’,结合上图的话,这个词就很容易理解了。即:

1.C5、C6本来是在C2这次提交的基础上进行修改的;

2.现在我们将这个‘基础’改为C4,即将C5、C6的提交作用到C4上去;

3.在这个过程中,可能会有冲突产生,解决冲突之后就完成了rebase。

由图可以看到,rebase完成后,源分支上的提交都不见了。

rebase基础操作

rebase的基本操作是将某个分支的修改到指定分支,其命令格式为:

1
1.git rebase 基分支 源分支

其中‘基分支’是我们的新的‘基’,而‘源分支’就是需要进行变基操作的分支。这样就能实现将源分支变基到基分支。具体使用示例如下:

1
1.git rebase master develop

以上语句就能实现将develop变基到master分支。 如果是将当前分支变基到指定分支,则可以直接使用:

1
git rebase 基分支

这一命令默认将当前分支变基到‘基分支’。如果当前处于develop分支,则其使用示例如下:

1
git rebase master

这样也能实现将当前的develop分支rebase到master分支。

由于变基是将修改作用到一个不同的版本上,因此很可能在rebase的过程中出现冲突。和merge一次性合并所有冲突不同的是,rebase的冲突是一个一个解决的。以上图中的rebase操作为例,需要分别解决和C3、C4的冲突。在解决rebase冲突的过程中,当解决完一个冲突的时候,使用如下命令后,才会出现下一个冲突:

1
2
1.git add -u 
2.git rebase --continue 

冲突全部解决完后,rebase操作就完成了。 如果在解决冲突的过程中,想放弃rebase操作,则可以使用如下命令撤销rebase操作:

1
git rebase --abort

这样就能退出rebase,并回退到rebase前的状态。

储藏之保存

储藏的概念

“储藏”可以获取你工作目录的中间状态(包括修改过的被追踪的文件和已经暂存的变更),并将其保存到一个未完结变更的堆栈中,而且随时可以重新应用。当你不想提交,也不想丢弃当前工作区中的内容,而想切换到其他分支的时候,可以使用储藏命令先暂存工作区中的内容。然后,再回到当前分支的时候,将储藏起来的内容,恢复到工作区之后,即可恢复之前的工作。

储藏的基本操作

储藏分为保存和应用两个部分。保存就是将当前工作区的内容保存到一个栈中,而应用就是重新应用被保存的工作。

保存

保存用到的命令是git stash,只需在当前分支执行此命令,即可将当前工作区的内容保存起来。如你在本地版本库创建了helloGit文件,此时查看工作区状态可以得到如下所示提示:

1
2
3
4
5
On branch master
Unt\fracked files:
  (use "git add <file>..." to include in what will be committed)
        helloGit
nothing added to commit but unt\fracked files present (use "git add" to t\frack)

当你执行git stash命令,将工作区保存起来之后,再次查看可以得到如下提示:

1
2
On branch master
nothing to commit, working tree clean

此时已经将工作区内容保存了起来,所以才会提示工作区是干净(clean)的。

重新应用

当你需要再次应用被保存的内容的时候,只需执行git stash apply即可。 因为可能执行了多次保存,所以你需要查看已经保存起来的内容有哪些。查看已经保存的工作的命令如下:

1
$ git stash list

会得到类似于如下输出:

1
2
3
stash@{0}: WIP on master: bguebge add helloGit1
stash@{1}: WIP on master: 7gder34 add helloGit2
stash@{2}: WIP on master: 3frfg4g add helloGit3

如上所示,可以得知一共有三个保存。

如果要应用指定的储藏,则可以使用命令:

1
git stash apply 储藏标识

这里的储藏标识就是git stash list中显示的类似于stash@{0}的字符串。如:

1
git stash apply stash@{2}

这样就重新应用了第二次储藏。如果不加储藏标识,就默认应用最近的储藏:

1
git stash apply

上述命令就重新应用了最近的一次储藏。

储藏之恢复

储藏的概念

“储藏”可以获取你工作目录的中间状态(包括修改过的被追踪的文件和已经暂存的变更),并将其保存到一个未完结变更的堆栈中,而且随时可以重新应用。当你不想提交,也不想丢弃当前工作区中的内容,而想切换到其他分支的时候,可以使用储藏命令,先暂存工作区中的内容。然后,再回到当前分支的时候,将储藏起来的内容,恢复到工作区之后,即可恢复之前的工作。

储藏的基本操作

储藏分为保存和应用两个部分。保存就是将当前工作区的内容保存到一个栈中,而应用就是重新应用被保存的工作。

保存 保存用到的命令是git stash,只需在当前分支执行此命令,即可将当前工作区的内容保存起来。如你在本地版本库创建了helloGit文件,此时查看工作区状态,可以得到如下所示提示:

1
2
3
4
5
On branch master
Unt\fracked files:
  (use "git add <file>..." to include in what will be committed)
        helloGit
nothing added to commit but unt\fracked files present (use "git add" to t\frack)

当你执行git stash命令,将工作区保存起来之后,再次查看可以得到如下提示:

1
2
On branch master
nothing to commit, working tree clean

此时已经将工作区内容保存了起来,所以才会提示工作区是干净(clean)的。

重新应用

当你需要再次应用被保存的内容的时候,只需执行git stash apply即可。 因为可能执行了多次保存,因此你需要查看已经保存起来的内容有哪些,查看已经保存的工作的命令如下:

1
$ git stash list

会到的类似于如下的输出:

1
2
3
stash@{0}: WIP on master: bguebge add helloGit1
stash@{1}: WIP on master: 7gder34 add helloGit2
stash@{2}: WIP on master: 3frfg4g add helloGit3

如上所示,可以得知一共有三个保存。

如果要应用指定的储藏吗,则可以使用命令:

1
git stash apply 储藏标识

这里的储藏标识就是git stash list中显示的类似于stash@{0}的字符串。如:

1
git stash apply stash@{2}

这样就重新应用了第二次储藏。如果不加储藏标识,就默认应用最近的储藏:

1
git stash apply

上述命令就重新应用了最近的一次储藏。

使用 Hugo 构建
主题 StackJimmy 设计