几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。
分支对于团队的作用是非常大的,如果一个项目现在是1.0.0版,那么开发团队可能要同事进行1.0.0版本和2.0.0版本的开发,这样代码分歧就很大,这时候我们利用分支处理不同的任务,减少代码相互间的影响。如果要新建一个功能,可以先新建一个分支,在新的分支上面编写代码,在编写完成测试完成后再合并到主分支中,这样做的好处是可以保证主分支的完整性和可用性,也就是说主分支的代码都是稳定的可以发布的代码。
1、远程分支命令
1.1 查看远程分支 git branch -r
- 语法:
git branch -r
E:\ideagit\projName>git branch -r
git-svn
origin/cicd
origin/develop
origin/master
origin/release
1.2 查看远程分支和本地分支 git branch -a
- 语法:
git branch -a
查看所有远程分支和本地分支 git branch -a
,其中 remotes/
开头的分支为远程分支,在命令行窗口中显示为不同颜色。
E:\ideagit\mbd-bigscreen>git branch -a
develop
* kongzi
master
remotes/git-svn
remotes/origin/develop
remotes/origin/kongzi
remotes/origin/master
remotes/origin/release
1.3 删除远程分支 origin/cicd
- 语法:
git push [remote] -d [remote-branch]
E:\ideagit\projName>git push origin -d cicd
To https://git.fzyun.io/media/bdc/mbd/codes/mbd-bigscreen.git
- [deleted] cicd
1.4 创建远程分支 git push origin kongzi
创建远程远程分支就是本地分支push到服务器上。比如master就是一个最典型的远程分支(默认)。
- 语法:
git push [remote] [remote-branch]
git push origin kongzi
2、本地分支命令
2.1 创建本地分支
新建一个分支,但依然停留在当前分支。
- 语法:
git branch [branch-name]
git branch 分支名
,例如:git branch kongzi
2.2 查看本地分支
git branch
命令可以查看本地分支,可用来检查新分支是否创建成功。*
表示当前选中的分支。
- 语法:
git branch
E:\ideagit\projName>git branch
develop
* kongzi
master
2.3 切换(选择)本地分支
git checkout 分支名
,切换到指定分支,并更新工作区。例如从master切换到kongzi:git checkout kongzi
- 语法:
git checkout [branch-name]
2.4 创建并切换分支
从已有的分支创建新的分支(如从master分支),并切换到该分支。如创建一个dev分支 git checkout -b dev
。
- 语法:
git checkout -b [new_branch] [remote-branch]
, 可以不指定remote-branch
(远程分支)。
E:\ideagit\projName>git checkout -b kongzi
Switched to a new branch 'kongzi'
E:\ideagit\projName>git branch
develop
* kongzi
master
从上例可以看到,创建后自动切换到新分支。使用 git branch
命令可以查看到已经切换到了新分支。
2.5 删除本地分支
git branch -D kongzi
,表示删除kongzi分支。注意删除时不能选中该分支。
- 语法:
git checkout -D [branch-name]
。 - 如果想保留分支只是想删除已经合并的部分,只要把大写D改成小写的d就可以了。
E:\ideagit\projName>git branch -D kongzi
Deleted branch kongzi (was 2b94083).
2.6 在本地创建分支并与服务器分支关联
在本地创建分支并与服务器分支关联,即从远程服务器拉取分支并在本地创建一个同名分支。
- 语法:
git checkout --track [remote]/[remote-branch]
。 - 远程分支和本地分支需要区分好,所以,在从服务器上拉取特定分支的时候,需要指定远程分支的名字。
- 注意该命令由于带有
--track
参数,所以要求git1.6.4以上,这样git会自动切换到分支。
git checkout --track origin/kongzi
2.7 更新master主线上的东西到当前分支
当前选中分支为 kongzi
, 将master主线上的东西到当前分支命令:git rebase master
。
- 语法:
git rebase [branch-name]
。
# 更新master主线上的东西到该分支上
git rebase master
# 切换到master分支
git checkout master
#更新mybranch分支上的东西到master上
git rebase mybranch
3、提交推送分支数据
3.1 git add
命令将更新数据写入暂存区
- 语法:
git add .
添加当前目录的所有文件到暂存区 - 语法:
git add <file1> <file2> ...
添加指定文件到暂存区 - 语法:
git add <dir>
添加指定目录到暂存区,包括其子目录
# 将当前目录下所有文件写入暂存区
git add ./
# 将当前目录下以 .c 结尾及 README 文件写入暂存区
git add *.c
git add README
3.2 git status
命令查看文件变更记录
git status
命令用于查看在你上次提交之后是否有对文件进行再次修改。git status -s
命令 通过 -s
参数来获得简短的输出结果:
$ git status -s
A README
A hello.c
3.3 git commit
命令提交更新数据到本地仓库
git commit
命令暂存区内容添加到本地仓库中。
git commit -m '提交注释'
- 注: 在 Linux 系统中,commit 信息使用单引号 ',Windows 系统,commit 信息使用双引号 "。
git commit -m "第一次版本提交"
[master (root-commit) d32cf1f] 第一次版本提交
2 files changed, 4 insertions(+)
create mode 100644 README
create mode 100644 hello.php
现在我们已经记录了快照。如果我们再执行 git status:
$ git status
# On branch master
nothing to commit (working directory clean)
以上输出说明我们在最近一次提交之后,没有做任何改动,是一个 “working directory clean”,翻译过来就是干净的工作目录。
如果你没有设置 -m 选项,Git 会尝试为你打开一个编辑器以填写提交信息。 如果 Git 在你对它的配置中找不到相关信息,默认会打开 vim。屏幕会像这样:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: hello.php
#
~
~
".git/COMMIT_EDITMSG" 9L, 257C
3.4 提交更新数据
git commit -a
命令提交更新数据。此命令相等于 git add
与 git commit
的合并。git commit -am "提交注释"
命令加上了注释参数。
-a
参数设置修改文件后不需要执行 git add 命令,直接来提交- 如果不用
-a
参数,则需要先执行git add ./
命令,再执行git commit
命令。
git commit -am '修改 hello.php 文件'
[master 71ee2cb] 修改 hello.php 文件
1 file changed, 1 insertion(+)
3.5 推送分支数据到远程服务器
# 一般当前如果不在该分支时,使用这种方式推送。
git push origin kongzi:kongzi
# 如果当前在 kongzi 分支下,也可以直接推送
git push
3.6 分支合并
一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用 git merge
命令将任何分支合并到当前分支中去:
$ git branch
* master
newtest
$ ls
README test.txt
$ git merge newtest
Updating 3e92c19..c1501a2
Fast-forward
runoob.php | 0
test.txt | 1 -
2 files changed, 1 deletion(-)
create mode 100644 runoob.php
delete mode 100644 test.txt
$ ls
README runoob.php
以上实例中我们将 newtest 分支合并到主分支去,test.txt 文件被删除。
合并完后就可以删除分支:
$ git branch -d newtest
Deleted branch newtest (was c1501a2).
删除后, 就只剩下 master 分支了:
$ git branch
* master
3.7 合并冲突
合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。如果有合并冲突出现,我们就需要手动去修改它。
合并分支产生冲突:
我们将前一个分支合并到 master 分支,一个合并冲突就出现了。
$ git merge change_site
Auto-merging runoob.php
CONFLICT (content): Merge conflict in runoob.php
Automatic merge failed; fix conflicts and then commit the result.
$ cat runoob.php # 打开文件,看到冲突内容
<?php
<<<<<<< HEAD
echo 1;
=======
echo 'runoob';
>>>>>>> change_site
?>
修改冲突内容
接下来我们需要手动去修改它。
$ vim runoob.php
$ cat runoob.php
<?php
echo 1;
echo 'runoob';
?>
$ git diff
diff --cc runoob.php
index ac60739,b63d7d7..0000000
--- a/runoob.php
+++ b/runoob.php
@@@ -1,3 -1,3 +1,4 @@@
<?php
+echo 1;
+ echo 'runoob';
?>
** git add
标识冲突解决**
在 Git 中,我们可以用 git add
要告诉 Git 文件冲突已经解决
$ git status -s
UU runoob.php
$ git add runoob.php
$ git status -s
M runoob.php
$ git commit
[master 88afe0e] Merge branch 'change_site'
现在我们成功解决了合并中的冲突,并提交了结果。
4、其他命令
# 删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-renamed]
# 对最近一次commit的进行修改
git commit -a -amend
# 选择一个 commit,合并进当前分支
$ git cherry-pick [commit]
# commit之后,如果想撤销最近一次提交(即退回到上一次版本)并本地保留代码
git reset HEAD^
# 合并分支:(merge from)
git checkout master
git merge mybranch (merge from mybranch)
# 删除分支
git branch -d mybranch
# 强制删除分支
git branch -D mybranch
# 查看各个分支最后一次提交
git branch -v
# 查看哪些分支合并入当前分支
git branch --merged
# 查看哪些分支未合并入当前分支
git branch --no-merged
# 更新远程库到本地
git fetch origin
# 推送分支
git push origin mybranch
# 取远程分支合并到本地
git merge origin/mybranch
# 取远程分支并分化一个新分支
git checkout -b mybranch origin/mybranch
# 删除远程分支
git push origin :mybranch
# 更新某分支上的内容到当前分支
git checkout mybranch
git rebase master (rebase from master)
举例: $ git checkout server
$ git rebase –onto master server client
$ git checkout master
$ git merge client (fostforward)
$ git rebase master server (checkout sever)
$ git merge server
$ git branch -d client
$ git branch -d server
评论区