默认,git项目只有一个分支master,当然可以在本地创建多个分支,并推送到远程git仓库上,或者将远程git仓库上的其他分支拉取到本地。
一、查看本地已有的分支
进入到项目根目录,打开命令行/终端,输入指令git branch,将会显示该项目的本地的全部分支,其中、当前分支的前面有*号。
二、本地检出一个新的分支并推送到远程仓库
1.创建本地分支
git checkout -b 新分支名
执行该指令后,会在本地创建一个新分支,该分支是从当前分支上检出的,所以所有文件内容都和当前分支一模一样,这是正常的。创建成功后,将自动切换至新分支上。
2.推送本地分支到远程仓库
git push --set-upstream origin/分支名
例如,把上一步创建的本地dev1推送到远程仓库:
三、将远程git仓库里的指定分支拉取到本地(本地不存在的分支)
git checkout -b 本地分支名 origin/远程分支名
这个将会自动创建一个新的本地分支,并与指定的远程分支关联起来。
例如远程仓库里有个分支approve,我本地没有该分支,我要把approve拉到我本地:
若成功,将会在本地创建新分支approve-20190511,并自动切到分支approve-20190511上。
四、git cherry-pick用法
git cherry-pick可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用git cherry-pick了。用法如下:
git cherry-pick [<options>] <commit-ish>...
常用options:
--quit 退出当前的chery-pick序列
--continue 继续当前的chery-pick序列
--abort 取消当前的chery-pick序列,恢复当前分支
-n, --no-commit 不自动提交
-e, --edit 编辑提交信息
(1)git cherry-pick commitid
在本地仓库中,有两个分支:branch1和branch2,我们先来查看各个分支的提交:
# 切换到branch2分支
$ git checkout branch2
Switched to branch 'branch2'
$
$
# 查看最近三次提交
$ git log --oneline -3
23d9422 [Description]:branch2 commit 3
2555c6e [Description]:branch2 commit 2
b82ba0f [Description]:branch2 commit 1
# 切换到branch1分支
$ git checkout branch1
Switched to branch 'branch1'
# 查看最近三次提交
$ git log --oneline -3
20fe2f9 commit second
c51adbe commit first
ae2bd14 commit 3th
现在,我想要将branch2分支上的第一次提交内容合入到branch1分支上,则可以使用git cherry-pick
命令:
$ git cherry-pick 2555c6e
error: could not apply 2555c6e... [Description]:branch2 commit 2
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
当cherry-pick
时,没有成功自动提交,这说明存在冲突,因此首先需要解决冲突, 解决冲突后依次运行git add .
和git cherry-pick --continue
命令。
$ git add .
$ git cherry-pick --continue .
[branch1 790f431] [Description]:branch2 commit 2
Date: Fri Jul 13 18:36:44 2018 +0800
1 file changed, 1 insertion(+)
create mode 100644 only-for-branch2.txt
现在查看提交信息:
$ git log --oneline -3
790f431 [Description]:branch2 commit 2
20fe2f9 commit second
c51adbe commit first
(2)git cherry-pick commitid
git cherry-pick xxx_id1..xxx_id3
注意:中间的两个点,表示把两个commit区间的所有commit多复制过去。但是不包含第一个commitid , 即 git cherry-pick (commitid1..commitid100], 如果想搞成[]区间,使用 git cherry-pick A^..B 相当于[A B]包含A。