工具 gitk 也可以查看和管理分支
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的分支的服务器.
git init
之后,出现下面结果1 2 3 4 5 6 7 8 9 提示:使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中 提示:配置使用初始分支名,并消除这条警告,请执行: 提示: 提示: git config --global init.defaultBranch <名称> 提示: 提示:除了 'master' 之外,通常选定的名字有 'main' 、'trunk' 和 'development' 。 提示:可以通过以下命令重命名刚创建的分支: 提示: 提示: git branch -m <name>
可以对分支改名。此时使用git branch
无法查看分支,因为还没有任何操作。
拉取远程指定分支 1 2 git remote add origin project_url git pull origin branch_name
在本地创建分支develop并切换到该分支1 git checkout -b develop(本地分支名称) origin/develop (远程分支名称)
远程分支上的内容都拉取到本地1 2 git pull origin develop (远程分支名称)
回到本地文件夹查看,已完成拉取远程某个分支到本地。拉去更新也是这个命令,如果是git pull
,可能会把所有分支的内容都拉下来,用时较长,没有必要。
提交到某分支 1 git push origin <本地分支名>:<远程分支名>
查看分支和合并 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 3 Auto-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 2 3 4 5 6 7 8 9 git add test.yaml git commit -m ":wrench:" git push origin user git checkout master git merge user git push origin master git checkout user
## 删除本地分支
git branch -d user
1 2 3 4 5 6 user@user:~/dev_ws/$ git branch -d user error: The branch 'user' is not fully merged. If you are sure you want to delete it, run 'git branch -D user' . user@user:~/dev_ws/$ git branch -D user Deleted branch user (was cf64937b)
## 删除远程分支, 千万小心使用 !
1 git push origin --delete remoteBranchName
## submodule
一个工程包含一个module,两部分的分支可能是不同的。先把工程拉取下来后,看看隐藏文件`.gitmodules`中的url和分支是否正确,此时的module部分应该还没有更新,使用下面的命令更新
1 2 git submodule init git submodule update
## 本地文件修改后,执行git pull出现冲突
执行`git pull`出现下面提示
1 2 Please commit your changes or stash them before you merge. Aborting
这是因为本地修改了一些文件,但远程仓库已经有别人提交更新了,所以有冲突。一般不会直接commit本地的修改。
1. 放弃本地修改的改法 (这种方法会丢弃本地修改的代码,而且不可找回!)
1 2 git reset --hard git pull
## 将最新的主分支更新到个人分支
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 git add . git commit -m "修改内容" git checkout master git pull git checkout self-branch git merge master git push git checkout master git merge self-branch git push
## 难题 1
1 2 3 4 5 6 7 On branch master Your branch and 'origin/master' have diverged, and have 5 and 21 different commits each, respectively. (use "git pull" to merge the remote branch into yours) nothing to commit, working tree clean
这发生在多人可能操作 master 分支的时候,我自己的分支提交完了,切换到master分支,要执行合并时,出现这个问题,并不是文件冲突的问题。按如下方法解决:
如果不需要保留本地的修改,只要执行下面两步:
1 2 git fetch origin git reset --hard origin/master
当我们在本地提交到远程仓库的时候,如果遇到上述问题,我们可以首先使用如下命令:
1 2 3 4 git rebase origin/master git pull --rebase git push origin master
## 一次合并冲突的解决
我在自己的分支`me`开发,主分支比我领先很多。有一次,我从git上下载了主分支的压缩包,然后手动覆盖了一部分文件以更新,这其实是不正确的操作。
第二天我先切换到主分支,更新到最新,然后切换到`me`分支,提交到远程后,合并主分支,结果出现的冲突比我自己修改的多很多,因为把我昨天手动覆盖的那些也包括了。这种情况下,只能手动解决冲突,但是大部分文件一定是用主分支,如果一个个打开会很麻烦。
用VSCode打开工程,分支管理里会显示文件冲突,对使用主分支版本的文件,右键选择就可以,而且能同时选多个文件。解决完之后,选择暂存文件,之后可以push了。
fatal: 无法访问 'http://192.168.9.61/intelligentcleaningrobotbu/j36/algorithm/planning_control.git/':The requested URL returned error: 502
需要关闭代理软件