Git分支相关的命令

我使用Git几年了,至今还会碰上各种各样的新问题,实在不胜其烦

工具 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的分支的服务器.

feat 分支

在Git 中,feat 分支指的是 ==feature 分支,也叫做功能分支==。它主要用于开发新的功能或特性,确保开发过程不会影响到主干代码的稳定性。

feat 分支是从主开发分支(如 developmain)派生出来的,用于隔离新功能的开发工作。这样做的好处是,多个开发者可以并行地在不同的 feat 分支上开发不同的功能,而互不干扰,提高了开发效率。

工作流程:

  1. 当需要开发一个新功能时,从主分支(比如 develop)创建一个新的 feat 分支。
  2. feat 分支上进行代码开发和修改。
  3. 开发完成后,测试无误,将 feat 分支合并回主分支。
  4. 合并后,feat 分支可以被删除,以保持仓库的整洁。

进一步的解释

拉取远程指定分支

1
2
git remote add origin project_url
git pull origin branch_name

在本地创建分支develop并切换到该分支

1
git checkout -b develop(本地分支名称)  origin/develop (远程分支名称)

远程分支上的内容都拉取到本地

1
2
# develop 为远程分支名称
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
# 当前是user分支
git add test.yaml
git commit -m ":wrench:"
git push origin user
# 切换到 master 分支
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)

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 branch
git pull # 将本地主分支代码更新
git checkout self-branch # 切换到自分支

git merge master # 将主分支代码合并更新到自己分支

git push # 提交到自分支远程端

git checkout master # 切换到主分支

git merge self-branch # 将自己代码合并更新到本地主分支master

git push # 将本地代码推到远程主分支master上