MYF

Git的分支管理

介绍一下分支管理,原理在创建与合并分支介绍的很详细了,这里只记录一下指令

创建和合并分支

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name> (将<name>分支合并到当前分支上)

删除分支:git branch -d <name>

解决冲突

如上图所示,在feature1和master都做了修改的时候,合并就会提示错误

1
2
3
4
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

使用git status确认不一致的文件

1
2
3
4
5
6
7
8
9
10
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

此时直接修改不一致的文件,将不要的内容删掉,然后add + commit即可,最后效果如下图

使用git log --graph --pretty=oneline --abbrev-commit可以查看分支合并图

分支策略管理

使用git merge <name>效果如下,这种模式下,删除分支后就会丢掉分支信息

fast-forward

使用git merge --no-ff -m "merge with no-ff" <name> 合并,会创建一个新的commit,效果如下

使用git log --graph --pretty=oneline --abbrev-commit可以查看分支合并图

Bug分支(stash)

当在dev分支下开发时,发现master主分支下有急需修复的bug,可以使用git stash存储当前状态,然后切换回master分支,新建issue分支,在issue分支上修复之后merge到主分支,然后切换回dev分支恢复stash的内容继续开发

当前工作区不为空

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git status
# On branch dev
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: hello.py
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#

贮存当前工作现场

1
2
3
$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge

修bug

1
2
3
4
5
6
7
8
9
10
11
12
13
# 切换回主分支,新建issue分支
git checkout master
git checkout -b issue-101

# 修复bug

# 提交
git add bug.file
git commit -m "fixed the bug 101"

# 合并
git checkout master
git merge --no-ff -m "merged issue 101" issue-101

恢复工作现场

1
2
3
4
5
6
7
8
9
git checkout dev
git stash list # 查看贮存队列

git stash pop # 恢复工作现场同时从队列中移除

git stash apply # 恢复工作现场同时但不从队列中移除
git stash drop # 从队列中删除

git stash apply stash@{0} # 恢复指定的stash

Feature分支

1
2
3
git checkout -b feature-vulcan # 新建
git add vulcan.py
git checkout dev

此时,有两种选择,一种是将新分支feature-vulcan并入dev分支,另一种是放弃feature-vulcan分支。

1
2
3
4
5
6
# 并入 + 删除
git merge --no-ff -m "add feature-vulcan" feature-vulcan
git branch -d feature-vulcan

# 不合并 + 强制删除
git branch -D feature-vulcan

多人协作

查看远程库的信息:git remote -v

推送master分支:git push origin master

抓取分支:git clone https://...git

创建远程origindev分支到本地:git checkout -b dev origin/dev

推送dev分支:git push origin dev

从远程仓库获取最新版本:git pull

设置本地分支与远程分支的链接:git branch --set-upstream dev origin/dev

若pull之后有冲突,检查冲突内容并修改,再add + commit + push

因此,多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
  5. 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

这就是多人协作的工作模式,一旦熟悉了,就非常简单。