Git的分支管理

文章目录

    • 分支管理
      • 创建合并分支
      • 解决冲突
        • 创建两冲突文件
      • 尝试合并两冲突文件
        • 查看状态
        • 查看文件
        • 更改文件
        • 再次提交
        • 使用参数查看分支合并情况
        • 删除frature1分支
      • 分支管理策略
        • 分支策略
      • bug分支
        • stash
        • 创建分支并切换分支
        • 删除bug
        • 切换回原来的分支
        • 完成合并
        • 查看之前存储的工作现场
        • 恢复工作区
        • 删除bug分支
      • feature分支
      • 多人协作
        • 推送分支
        • 抓取分支
        • 总结
      • rebase

分支管理

创建合并分支

  • 创建分支
zhou@zhou-PC:~/Desktop$ cd abcd/test/
zhou@zhou-PC:~/Desktop/abcd/test$ ls
README.md
zhou@zhou-PC:~/Desktop/abcd/test$ git che
checkout      cherry        cherry-pick   
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout -b dev
切换到一个新分支 'dev'

-b表示创建并切换分支

  • 查看当前分支
zhou@zhou-PC:~/Desktop/abcd/test$ git branch 
* dev
  master
  • 编写文件并提交
zhou@zhou-PC:~/Desktop/abcd/test$ echo "这是在分支上提交的内容" >> README.md 
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md 
# test
测试
新增一行
这是在分支上提交的内容
zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md 
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "提交分支" README.md 
[dev 59dedac] 提交分支
 1 file changed, 1 insertion(+)
  • 切换分支
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout master 
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
  • 查看文件
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md 
# test
测试
新增一行

发现刚才添加的文件不见了

  • 合并分支
zhou@zhou-PC:~/Desktop/abcd/test$ git merge dev 
更新 61a52f0..59dedac
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md 
# test
测试
新增一行
这是在分支上提交的内容

再次查看发现已经有了刚才新添加的文字

  • 删除分支
zhou@zhou-PC:~/Desktop/abcd/test$ git branch -d dev 
已删除分支 dev(曾为 59dedac)。

解决冲突

创建两冲突文件

  • 创建分支并且切换分支
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout -b frature1
切换到一个新分支 'frature1'
  • 修改文件并提交
zhou@zhou-PC:~/Desktop/abcd/test$ echo "解决冲突" >> README.md zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md 
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "解决冲突" README.md 
[frature1 5b783b1] 解决冲突
 1 file changed, 1 insertion(+)
  • 切换分支
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout master 
切换到分支 'master'
您的分支领先 'origin/master' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)
  • 再次新增一行提交
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md 
# test
测试
新增一行

这是在分支上提交的内容
zhou@zhou-PC:~/Desktop/abcd/test$ echo "master解决冲突" >> README.md 
zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md 
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "master解决冲突" README.md 
[master bf493b6] master解决冲突
 1 file changed, 1 insertion(+)

尝试合并两冲突文件

zhou@zhou-PC:~/Desktop/abcd/test$ git merge frature1 
自动合并 README.md
冲突(内容):合并冲突于 README.md
自动合并失败,修正冲突然后提交修正的结果。

查看状态

zhou@zhou-PC:~/Desktop/abcd/test$ git status
位于分支 master
您的分支领先 'origin/master' 共 2 个提交。
  (使用 "git push" 来发布您的本地提交)
您有尚未合并的路径。
  (解决冲突并运行 "git commit")
  (使用 "git merge --abort" 终止合并)

未合并的路径:
  (使用 "git add <文件>..." 标记解决方案)

	双方修改:   README.md

修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

查看文件

zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md 
# test
测试
新增一行

这是在分支上提交的内容
<<<<<<< HEAD
master解决冲突
=======
解决冲突
>>>>>>> frature1

<<<<<<<>>>>>========
此处这种标记表示为不同分支的内容

更改文件

zhou@zhou-PC:~/Desktop/abcd/test$ vim README.md 
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md 
# test
测试
新增一行

这是在分支上提交的内容
解决冲突

再次提交

zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md 
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "提交解决冲突" [master 212a9ec] 提交解决冲突

使用参数查看分支合并情况

zhou@zhou-PC:~/Desktop/abcd/test$ git log --graph --pretty=oneline --abbrev-commit 
*   212a9ec 提交解决冲突
|\  
| * 5b783b1 解决冲突
* | bf493b6 master解决冲突
|/  
* 59dedac 提交分支
* 61a52f0 新增一行
* 031235d vdsf
* 0bb0006 Initial commit

删除frature1分支

zhou@zhou-PC:~/Desktop/abcd/test$ git branch -d frature1 
已删除分支 frature1(曾为 5b783b1)。

分支管理策略

  • 创建分支并切换分支
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout -b dev
切换到一个新分支 'dev'
  • 修改文本并提交
zhou@zhou-PC:~/Desktop/abcd/test$ echo "dev分支管理策略" >> README.md 
zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md 
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "dev分支管理策 略"
[dev 5581b0e] dev分支管理策略
 1 file changed, 1 insertion(+)
  • 切换分支
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout master 
切换到分支 'master'
您的分支领先 'origin/master' 共 4 个提交。
  (使用 "git push" 来发布您的本地提交)
zhou@zhou-PC:~/Desktop/abcd/test$ git merge --no-ff -m "master 分支管理策略" dev
Merge made by the 'recursive' strategy.
 README.md | 1 +
 1 file changed, 1 insertion(+)

--no-ff表示禁用fast forward

  • 查看分支历史
zhou@zhou-PC:~/Desktop/abcd/test$ git log --graph --pretty=oneline --abbrev-commit 
*   b51dc30 master分支管理策略
|\  
| * 5581b0e dev分支管理策略
|/  
*   212a9ec 提交解决冲突
|\  
| * 5b783b1 解决冲突
* | bf493b6 master解决冲突
|/  
* 59dedac 提交分支
* 61a52f0 新增一行
* 031235d vdsf
* 0bb0006 Initial commit

分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

bug分支

stash

某些情况下,工作只进行到一半,还没法提交,但是又急需修改一个bug
这种情况下可以使用stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作

zhou@zhou-PC:~/Desktop/abcd/test$ echo "def name(uname,upasswd):" >> hello.py 
zhou@zhou-PC:~/Desktop/abcd/test$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     hello.py

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

zhou@zhou-PC:~/Desktop/abcd/test$ git stash
保存工作目录和索引状态 WIP on master: 3b14734 新建文件
HEAD 现在位于 3b14734 新建文件

再次用status查看就是干净的工作区

zhou@zhou-PC:~/Desktop/abcd/test$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
无文件要提交,干净的工作区

创建分支并切换分支

zhou@zhou-PC:~/Desktop/abcd/test$ git checkout -b bug-101
切换到一个新分支 'bug-101'

删除bug

zhou@zhou-PC:~/Desktop/abcd/test$ echo "" > hello.py 
zhou@zhou-PC:~/Desktop/abcd/test$ git add hello.py 
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "删除了bug" hello.py 
[bug-101 f714525] 删除了bug
 1 file changed, 1 insertion(+), 1 deletion(-)

切换回原来的分支

zhou@zhou-PC:~/Desktop/abcd/test$ git checkout master 
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
zhou@zhou-PC:~/Desktop/abcd/test$ git status 
位于分支 master
您的分支与上游分支 'origin/master' 一致。
无文件要提交,干净的工作区

完成合并

zhou@zhou-PC:~/Desktop/abcd/test$ git merge --no-ff -m "merged bug fix 101" bug-101 
Merge made by the 'recursive' strategy.
 hello.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

查看之前存储的工作现场

zhou@zhou-PC:~/Desktop/abcd/test$ git stash list 
stash@{0}: WIP on master: 3b14734 新建文件

恢复工作区

git stash pop

zhou@zhou-PC:~/Desktop/abcd/test$ git stash pop
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     hello.py

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0} (2ace0d6c93da6e1b6b79bcc8b9eaaa08efc2d256)
zhou@zhou-PC:~/Desktop/abcd/test$ git stash list 

这里再次查看就看不到任何stash内容了

删除bug分支

zhou@zhou-PC:~/Desktop/abcd/test$ git branch -d bug-101 
已删除分支 bug-101(曾为 f714525)。

feature分支

  • 新建分支
$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'
  • 新建文件
$ git add vulcan.py

$ git status
On branch feature-vulcan
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

	new file:   vulcan.py

$ git commit -m "add feature vulcan"
[feature-vulcan 287773e] add feature vulcan
 1 file changed, 2 insertions(+)
 create mode 100644 vulcan.py
  • 切换到原来的分支
git checkout master

删除会失败

$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.

使用-D强行删除

$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).

多人协作

  • 查看远程仓库的信息
zhou@zhou-PC:~/Desktop/abcd/test$ git remote 
origin
zhou@zhou-PC:~/Desktop/abcd/test$ git remote -v
origin	[email protected]:chineselijie/test.git (fetch)
origin	[email protected]:chineselijie/test.git (push)

-v 更详细的显示

推送分支

zhou@zhou-PC:~/Desktop/abcd/test$ git push origin master

若推送其他分支

zhou@zhou-PC:~/Desktop/abcd/test$ git push origin dev

抓取分支

zhou@zhou-PC:~/Desktop/abcd/test$ git clone [email protected]:chineselijie/test.git

总结

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

首先,可以试图用git push origin 推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。

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

查看远程库信息,使用git remote -v;

本地新建的分支如果不推送到远程,对其他人就是不可见的;

从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

rebase

rebase操作可以把本地未push的分叉提交历史整理成直线
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

u@zhou-PC:~/Desktop/abcd/test$ git log --graph --pretty=oneline --abbrev-commit
* ded0d45 清空了文字
*   5edf5c9 merged bug fix 101
|\  
| * f714525 删除了bug
|/  
* 3b14734 新建文件
*   b51dc30 master分支管理策略
|\  
| * 5581b0e dev分支管理策略
|/  
*   212a9ec 提交解决冲突
|\  
| * 5b783b1 解决冲突
* | bf493b6 master解决冲突
|/  
* 59dedac 提交分支
* 61a52f0 新增一行
* 031235d vdsf
* 0bb0006 Initial commit

你可能感兴趣的:(git,分支管理,git,Git)