美文网首页Git学习
Git学习笔记(三)

Git学习笔记(三)

作者: tsunderebabys | 来源:发表于2017-08-23 21:01 被阅读0次

分支管理

分支在实际中的作用是,再给当前项目开发新功能的时候,可以将新功能未完成的代码库提交到独立的分支,但整体完成后再合并到主分支。从而既保证了原项目能正常运作,又杜绝了新功能丢失进度的风险。

创建与合并分支

创建dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev

git branch命令查看当前分支:

$ git branch
* dev
  master

git branch命令会列出所有分支,并在当前分支前标*号。

现在可以在dev分支上进行修改,比如在readme.txt加上一行:

Creating a new branch is quick.

在提交并切换到master分支后,可以发现master分支的提交点没有变化。

接下来合并master分支和dev分支:

$ git merge dev       
Updating b3ce958..f39faf9
Fast-forward
 readme.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Fast-forward信息表示此次合并是”快进模式“,直接把master指向dev的提交。

合并完成后可以放心删除dev分支:

$ git branch -d dev 
Deleted branch dev (was f39faf9).

解决冲突

在合并分支是也可能会出现一些问题,比如:
创建一个新的分支featurel,并将readme.txt文件的最后一行改为:

Creating a new branch is quick AND simple.

featurel分支上提交:

$ git add readme.txt
$ git commit -m "And simple"
[featurel 724fe08] And simple
 1 file changed, 1 insertion(+), 1 deletion(-)

切换到master分支:

$ git checkout master 
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

此时Git还会提示本地master分支进度比远程master分支超前一个提交。
如果我们在master分支上把readme.txt文件的最后一行修改为:

Creating a new branch is quick & simple.

并提交,那么master分支与featurel分支都分别有了新的提交,如图:

这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,比如:

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

readme.txt文件存在冲突,需要手动解决之后才能提交。此时可用git status查找冲突的文件。

$ 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")

此时编辑readme.txt可以看到:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容。

再次修改如下后保存:

Creating a new branch is quick and simple.

并提交:

$ git add readme.txt 
$ git commit -m "conflict fixed"
[master f648aa0] conflict fixed

现在的分支情况就如下图所示:

冲突处理

用带参数的git log也可以看到分支的合并情况:

*   f648aa0  conflict fixed
|\  
| * 44f163b AND simple
* | 2a2a0d6 & simple
|/  
* 2db35f3 brach test
...

最后,删除feature1分支:

$ git branch -d feature1
Deleted branch feature1 (was 44f163b).

分支管理策略

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
操作如下:

$ git checkout -b dev
Switched to a new branch 'dev'

$ git add readme.txt 
$ git commit -m "add merge"
[dev 6224937] add merge
 1 file changed, 1 insertion(+)

$ git checkout master
Switched to branch 'master'

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.txt |    1 +
 1 file changed, 1 insertion(+)

此时用git log可查看分支历史:

$ git log --graph --pretty=oneline --abbrev-commit
*   7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
*   59bc1cb conflict fixed
...

Bug分支

Git提供了stash功能可以暂存不方便提交的工作,以便于切换到其他分支时不丢失当前进度。
示例:

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

可用git stash list查看暂存的工作。
恢复则有两种选择,一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了。

Future 分支

软件开发中,总有无穷无尽的新的功能要不断添加进来。

添加一个新功能时,肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

现在,终于接到了一个新任务:开发代号为Vulcan的新功能,该功能计划用于下一代星际飞船。

于是准备开发:

$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'

5分钟后,开发完毕:

$ git add vulcan.py
$ git status
# On branch feature-vulcan
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   vulcan.py
#
$ git commit -m "add feature vulcan"
[feature-vulcan 756d4af] add feature vulcan
 1 file changed, 2 insertions(+)
 create mode 100644 vulcan.py

切回dev,准备合并:

$ git checkout dev

一切顺利的话,feature分支和bug分支是类似的,合并,然后删除。

但是,就在此时,接到上级命令,因经费不足,新功能必须取消!

虽然白干了,但是这个分支还是必须就地销毁:

$ 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'.

销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D feature-vulcan

现在强行删除:

$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 756d4af).

删除成功!

多人协作

当从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
要查看远程库的信息,用git remote

$ git remote
origin

或者,用git remote -v显示更详细的信息:

$ git remote  -v 
orgin   https://github.com/yimingjin1995/learngit.git (fetch)
orgin   https://github.com/yimingjin1995/learngit.git (push)

上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支。例如:

$ git push origin dev

相关文章

网友评论

    本文标题:Git学习笔记(三)

    本文链接:https://www.haomeiwen.com/subject/xrchtxtx.html