由于Git
的分布式特性,所以没有绝对的本地和远程概念,一切都是相对的。对于分支的操作,个人认为其实重点在于本地的分支操作,而对于远程仓库的分支操作归结起来只有 推送
和 拉取
创建本地分支有两种命令方式,第一是使用分支命令branch
,第二是使用查看命令checkout
推荐使用查看命令 :git checkout -b <new_branch_name>
,它是下面两条命令的简写
git branch <new_branch_name>
git checkout <new_branch_name>
深度应用,在某个场景下,当我们的项目在不断推进后,老板突然说:“第一版其实还不错,我们再看一下”,我:“…”。
这时我们当然可以使用回滚或者查看历史版本的方式,在这之前先备份一下当前代码,又或者创建个分支保护一下什么的,但是这样做仍然可能会很危险,亦或者很麻烦,这个时候我们就会想,如果能在第一版有个分支就好了。是的,我们还可以根据某个历史提交状态来创建一个分支。
仍然使用查看命令git checkout -b <branch_name> <SHA-1>
,使用历史提交版本的SHA-1校验和来创建指定历史版本的分支,SHA-1校验和的值可以通过git log
查看,它实际上也是多个命令的简写
git checkout <SHA-1>
git branch <branch_name>
git checkout <branch_name>
git checkout -b
甚至可以根据远程仓库来创建本地分支,git checkout -b <local_branch> <remote>/<remote_branch>
说明:git branch
会根据当前的代码状态创建分支,不管这个状态是最终状态还是某个历史状态,git checkout
查看 / 切换分支,也可以查看某个历史版本
除此之外,还能使用git checkout --orphan <branch_name>
创建一个空白分支
命令总结
git checkout -b <branch_name>
创建分支git checkout -b <branch_name> <SHA-1>
在历史版本SHA-1位置创建分支git checkout -b <branch_name> <remote>/<remote_branch>
基于远程分支创建分支git checkout --orphan <branch_name>
创建空白分支git提供了两种合并指令 merge
和 rebase
,用于将两个或两个以上的开发历史加入(合并)一起。如果合并没有冲突,则会自动进行一次提交。
git merge <branch_name>
,将 branch_name 分支合并到当前分支
git branch -d <branch_name>
来删除指定分支,及时的删除一些无用分支是个良好的习惯,不然我们将在众多分支中晕头转向。git remote prune <remote>
来清除本地缓存的无效远程分支指针实际上并不存在显性的对远程分支的操作,所有对远程分支的操作都是 push 的副作用。
对远程仓库的操作一般时 fetch,pull 和 push,这个操作的意义在于同步远程仓库和本地仓库,更确切的说法是将本地仓库的某条分支和远程仓库的某条分支进行同步。
比如本地仓库有 master 和 test 两条分支,远程仓库有 master 和 develop 两条分支,我们可以将远程仓库的 develop 分支同步到本地的 master 分支上,也可以将本地的 master 分支同步到远程仓库的 master 分支上,同步的实质时合并两条分支,如果是两条不相关的分支,则不能合并,即推送 / 拉取不成功(强行推送 / 拉取除外)。
push的完整写法是:
git push <remote> <local_branch>:<remote_branch>
意思是将本地 local_branch 分支推送到远程仓库的 remote_branch 分支,并进行 merge
合并,如果远程仓库没有 remote_branch 分支则会创建分支,所以在远程分支不存在的情况下,该操作相当于创建远程分支
省略远程分支名 git push <remote> <local_branch>
,git会推送local_branch分支到远程仓库的与本地分支同名的远程分支
eg:git push origin dev
相当于 git push origin dev:dev
的简写
省略本地分支名 git push <remote> :<remote_branch>
,Git会删除远程仓库上的remote_branch分支,即用一个空分支更新remote_branch分支,相当于删除远程分支
eg:git push origin :dev
相当于 git push origin --delete dev
省略所有分支名 git push <remote>
,如果当前分支和远程分支存在追踪关系,则本地分支和远程分支都可以忽略。如果当前分支只有一个远程主机,那么远程主机也可以省略。
git push --all <remote>
将本地的所有分支都推送到远程主机。
git push --force <remote> [<local_branch>:<remote_branch>]
当服务器上版本和本地版本不一致时,push会发生冲突,git会提示我们先使用pull来解决冲突,如果一定要推送,可以使用这个命令,除非一定要这样,否则应该避免使用force。
和push类似,pull的完整写法是(注意本地分支和远程分支的顺序):
git pull <remote> <remote_branch>:<loacl_branch>
意思是将远程仓库 remote_branch 分支拉取到本地仓库的 local_branch 分支,并进行merge
合并,如果本地仓库没有 local_branch 分支则会创建分支。
省略本地分支名 git pull <remote> <remote_branch>
,git会拉取remote_branch分支当前本地分支
省略所有分支名 git pull <remote>
,如果当前分支和远程分支存在追踪关系,则本地分支和远程分支都可以忽略。如果当前分支只有一个远程主机,那么远程主机也可以省略。
git pull <remote> --rebase
合并的时候采用rebase
模式
git pull
实际上是 git fetch
和 git merge
的联合操作
git pull origin master
相当于
git fetch origin master
git merge origin/master
git branch -vv
查看分支跟踪情况git branch --set-upstream-to=<remote>/<branch_name> <branch_name>
将branch_name分支追踪远程分支remote/branch_namegit branch -u <remote>/<branch_name>
设置当前分支追踪远程分支 remote/branch_name