- origin 远程服务器
- origin/master 远程分支
- master 本地分支
origin并不特别,就像分支名 master 在git中没有任何特殊意义一样.当执行git init时,master会作为初始分支的默认名字,因此使得master分支名被广泛使用。而origin是执行git clone时的默认服务器名称,当然可以通过指令git clone -o cat
,使得默认服务器名称为cat,而默认远程分支为cat/master
从远程分支check out一个本地分支,该本地分支被称为追踪分支(tracking branch),被追踪的分支被称为上游分支(upstream branch),追踪分支可以理解为是和远程分支有直接关联的本地分支. 如果我们在追踪分支时执行git pull,git会自动知道需要获取和merge的分支的服务器.
拉取远程指定分支
1 | git remote add origin https://github.com/user/user.github.com.git |
在本地创建分支develop并切换到该分支1
git checkout -b develop(本地分支名称) origin/develop (远程分支名称)
远程分支上的内容都拉取到本地1
2# develop 为远程分支名称
git pull origin develop (远程分支名称)
回到本地文件夹查看,已完成拉取远程某个分支到本地。拉去更新也是这个命令,如果是git pull
,可能会把所有分支的内容都拉下来,用时较长,没有必要。
查看分支和合并
git branch -a
list both remote-tracking and local branches
git branch -vv
会列出所有的分支信息,包含追踪分支的关联关系
常见的情况是,我自己有一个分支me
,还要拉取另一个人的分支,两人共用部分文件,合并到分支master。在自己分支修改文件结束后,提交到自己的分支。然后切换到master分支,git checkout master
。由于不知道另一个人是否更新了代码,所以先执行git pull
更新一下,然后git merge me
,这就合并了我的分支,再git push origin master
。
有时会出现冲突 ,这是由于两人修改了同一个文件,冲突的提示1
2
3Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.git status
也可以告诉我们冲突的文件. 在冲突的文件里,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,只能自己手动修改,然后再提交。解决冲突的过程一直是在master
分支。 用带参数的git log
也可以看到分支的合并情况
将user分支合并到master分支
1 | # 当前是user分支 |
删除本地分支
git branch -d user
1 | user@user:~/dev_ws/$ git branch -d user |
删除远程分支, 千万小心使用 !
1 | git push origin --delete remoteBranchName |
难题 1
1 | # 执行 git status 的结果 |
这发生在多人可能操作 master 分支的时候,我自己的分支提交完了,切换到master分支,要执行合并时,出现这个问题,并不是文件冲突的问题。按如下方法解决:
如果不需要保留本地的修改,只要执行下面两步:1
2git fetch origin
git reset --hard origin/master
当我们在本地提交到远程仓库的时候,如果遇到上述问题,我们可以首先使用如下命令:1
2
3
4git rebase origin/master
git pull --rebase
# 提交到远程仓库
git push origin master
本地文件修改后,执行git pull出现冲突
执行git pull
出现下面提示1
2Please commit your changes or stash them before you merge.
Aborting
这是因为本地修改了一些文件,但远程仓库已经有别人提交更新了,所以有冲突。一般不会直接commit本地的修改。
- 放弃本地修改的改法 (这种方法会丢弃本地修改的代码,而且不可找回!)
1 | git reset --hard |
将最新的主分支更新到个人分支
1 | # 当前在个人分支 |
一次合并冲突的解决
我在自己的分支me
开发,主分支比我领先很多。有一次,我从git上下载了主分支的压缩包,然后手动覆盖了一部分文件以更新,这其实是不正确的操作。
第二天我先切换到主分支,更新到最新,然后切换到me
分支,提交到远程后,合并主分支,结果出现的冲突比我自己修改的多很多,因为把我昨天手动覆盖的那些也包括了。这种情况下,只能手动解决冲突,但是大部分文件一定是用主分支,如果一个个打开会很麻烦。
用VSCode打开工程,分支管理里会显示文件冲突,对使用主分支版本的文件,右键选择就可以,而且能同时选多个文件。解决完之后,选择暂存文件,之后可以push了。