在Git中,我们通常会接触到三类分支: 远程分支、 本地分支和 远程跟踪分支。这三类分支相对容易理解。
远程分支与本地分支
- 远程分支是远程仓库中的普通分支,存储在远程服务器上。
- 本地分支是你在本地仓库中创建的分支,用于开发工作。
远程跟踪分支
远程跟踪分支是本地对远程仓库分支的引用。它们在你执行 git fetch
时从远程仓库中同步下来,并存储在本地(或者执行pull时也会更新远程跟踪分支)。远程跟踪分支的作用只有一个,那就是检查你的代码修改期间有没有其他人提交代码,在你提交时会把远程跟踪分支和远程分支进行对比,如果不同,则需要处理冲突,如果相同则直接为新的一次提交。远程跟踪分支的命名格式通常为 <origin>/<branch></branch></origin>
。这些分支的指针是自动更新的,不能手动更改,只会在你 fetch
时自动更新到最新的提交点。
当对一个远程git仓库调用git clone时,会将远程分支复制到本地作为远程跟踪分支和本地分支,如下图
当调用git fetch时会讲远程跟踪分支的最新更新到远程跟踪分支,如下图
此时在执行git merge本地分支则会和远程跟踪分支合并,达到更新本地代码的目的(git pull的本质就是执行fetch和merge的命令)
跟踪分支与上游分支
这两个概念稍微复杂一些:
- 跟踪分支:这是一个特殊的本地分支。你可以通过设置某一条本地分支来跟踪一个远程分支(通常是远程跟踪分支)。这样,当你在这个本地分支上执行
git pull
或git push
时,它会默认与被跟踪的远程分支进行交互。 - 上游分支:这是一个特殊的远程分支,通常是远程跟踪分支。每一个跟踪分支都有一个上游分支,当你设置某个本地分支的上游分支时,这个本地分支就会自动跟踪这个上游分支。
例如,当你在本地的 master
分支上,设置它的上游分支为 origin/master
,实际上就是让 origin/master
(远程跟踪分支)成为本地 master
分支的上游分支。此时,本地的 master
分支就会自动跟踪这个上游分支。
设置关系
当你设置一个本地分支的上游分支时,这个本地分支也会成为相应远程跟踪分支的跟踪分支。换句话说,这两个分支之间的关系是双向的:一个本地分支可以跟踪一个远程跟踪分支,而这个远程跟踪分支就是这个本地分支的上游分支。
你可以通过 git branch --set-upstream-to=<origin>/<branch></branch></origin>
或 git checkout -b <branch> <origin>/<branch></branch></origin></branch>
等命令来设置这种关系。
一旦关系设置好,你就可以轻松地执行 git pull
和 git push
操作,Git会自动找到合适的分支进行合并和推送。
以下是一些常用的 Git 命令及其用途:
1. 基本操作
git init
:在当前目录初始化一个新的 Git 仓库。git clone <repository></repository>
:克隆一个远程仓库到本地。git status
:查看工作目录和暂存区的状态,显示哪些文件被修改、哪些文件在暂存区中。git add <file></file>
:将文件添加到暂存区,准备提交。git commit -m "<message>"</message>
:将暂存区中的内容提交到本地仓库,并添加提交信息。git log
:查看项目的提交历史。git diff
:查看工作目录中的更改,与暂存区或上次提交进行对比。
2. 分支操作
git branch
:列出所有本地分支,显示当前所在的分支。git branch <branch-name></branch-name>
:创建一个新的本地分支。git checkout <branch-name></branch-name>
:切换到指定的分支。git checkout -b <branch-name></branch-name>
:创建并切换到一个新的分支。git merge <branch-name></branch-name>
:将指定分支合并到当前分支。git branch -d <branch-name></branch-name>
:删除本地分支。
3. 远程操作
git remote add <name> <url></url></name>
:添加一个远程仓库并命名。git remote -v
:查看所有远程仓库及其 URL。git fetch <remote></remote>
:从远程仓库获取最新的内容,不会自动合并。git pull
:从远程仓库拉取最新的内容,并自动与当前分支合并。git push <remote> <branch></branch></remote>
:将本地分支的更改推送到远程仓库。git push -u <remote> <branch></branch></remote>
:推送本地分支并将其设置为跟踪分支。
4. 变基与修订
git rebase <branch></branch>
:将当前分支的提交应用到另一个基线分支之上,类似于合并,但历史记录更简洁。git reset <commit></commit>
:重置当前分支到指定的提交,可以是软重置(保留更改)或硬重置(丢弃更改)。git revert <commit></commit>
:撤销指定的提交,生成一个新的提交来取消之前的更改。git cherry-pick <commit></commit>
:将指定的提交应用到当前分支,通常用于从其他分支选择特定的提交。
5. 标签操作
git tag <tag-name></tag-name>
:为当前提交打标签。git tag
:列出所有标签。git push <remote> <tag></tag></remote>
:将标签推送到远程仓库。
6. 日常管理
git stash
:将未提交的更改保存到栈中,以便稍后恢复。git stash pop
:从栈中恢复最近一次保存的更改。git clean -f
:清理工作目录,移除未跟踪的文件。
7. 子模块操作
git submodule add <repository></repository>
:将一个仓库作为子模块添加到项目中。git submodule update --init --recursive
:初始化、更新所有子模块。git submodule status
:查看当前子模块的状态。
rebase和merge的区别
reabase盒merge两个都是合并两个分支,其中merge是将目标分支的结尾和当前分支的结尾合并为一次提交,放在当前分支的末尾,如下图
而rebase则是将目标分支拖离远来的基点,拼接到目标的末尾,并且将基于原来基点的改变,变为基于当前基点的改变,如果当前基点相较于原来基点的改变和本次rebase发生冲突,那么则需要认为解决冲突。如下图
rebase的优点是合并后分支更加清晰,如果合并操作较多,merge不好追踪,而rebase则是和没有合并一样清晰。单缺点也比较致命,合并后原来的版本将无法回滚,并且如果合并的目标分支修改过多,解决冲突也很麻烦。
merge的优点则是保存所有的提交历史,并且只合并末尾两个版本。而缺点则是如果合并操作过多,merge合并的分支会看起来很乱。
var code = "40922e9e-1795-48a6-83d9-ddefa3d995c8"