开发者user1 负责用getopt 进行命令解析的功能,由于这个功能用到getopt 函数,因而将这个分支命名为user1/getopt.
(1)确保是在开发者user1的工做区中
cd /home/jackluo/workspace/user1/workspace/hello-world
(2)开发者user1 基于当前HEAD建立分支user1/getopt.
git branch user1/getopt
(3)使用 git branch建立分支,并不会自动切换.查看当前分支能够看到仍然工做在master分支(用星号"*"标识)中.
[root@localhost hello-world]# git branch
* master
user1/getopt
(4)执行git checkout 命令切换到新分支上
[root@localhost hello-world]# git checkout user1/getopt
已经位于 'user1/getopt'
(5)再次查看分支列表,当前工做分支的标记符(星号)已经落在user1/getopt分支上.
[root@localhost hello-world]# git branch
master
* user1/getopt
分支其实是建立在目录.git/refs/heads 下的引用 ,版本库初始时建立的master分支就是在该目录下.
查看一下.git/refs/heads 目录下的引用 .能够在该目录 下看到master文件,和一个user1目录.而在user1目录下是文件getopt。git
[root@localhost hello-world]# ls -F .git/refs/heads/
master user1/函数
[root@localhost hello-world]# ls -F .git/refs/heads/user1/
getoptspa
引用文件 .git/refs/heads/user1/getopt记录的是一个提交ID.命令行
[root@localhost hello-world]# cat .git/refs/heads/user1/getopt
d901dd8170f67fec607828905d5fbd91e32724003d
由于分支user1/getopt是基于头指针HEAD建立的,所以当前该分支和master分支的指向是一致的.指针
[root@localhost hello-world]# cat .git/refs/heads/master
d901dd8170f67fec607828905d5fbd91e3272400code
===============================blog
建立分支user2/i18n开发
建立分支:执行git branch <branchname>命令建立新分支get
切换分支:执行git checkout <branchname>命令切换到新分支
git checkout -b <new_branch> [<start_point>]
检出命令git checkout经过参数-b <new_branch> 实现了建立分支和切换分支两个动做的合二为一,下面是
开发者user2就使用git checkout 命令来建立分支,
(1)进入到开发者user2的工做目录 ,并和上游同步一次
[root@localhost workspace]# cd user2/workspace/hello-world/
[root@localhost hello-world]# git pull
(2).执行git checkout -b 命令,建立并切换到新分支user2/i18n上.
[root@localhost hello-world]# git checkout -b user2/i18n 切换到一个新分支 'user2/i18n'
(3)查看本地分支列表,会看到已经建立 并切换到user2/i18n分支上了.
[root@localhost hello-world]# git branch
master
* user2/i18n
开发者user1完成功能开发
开发者user1开始在user1/getopt 分支中工做,重构hello-world 中的命令行参 数解析的代码,重构时采用getopt_long 函数.
也能够试着更改,不过在hello-world中已保存了一份改好的代码,能够直接检出.
(1)确保是在user1的工做区中
cd ../../../user1/workspace/hello-world/
(2)执行下面的命令,用里程B jx/v2.0标记的内容(已实现用getopt 进行命令行解析的功能)替换暂存区和工做区.
下面的git checkout 命令的最后是一个点"."所以检出只更改了暂存区和工做区,
而没有修改头指针.
git checkout jx/v2.0 -- .
(3)查看状态,会看到分支仍保持为user1/getopt,但文件src/main.c 被修改了.
[root@localhost hello-world]# git status # 位于分支 user1/getopt # 要提交的变动: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 修改: src/Makefile # 修改: src/main.c #
(4)比较暂存区和HEAD的文件差别,能够看到为实现用getopt进行命令行解析功能而对代码 的改动
[root@localhost hello-world]# git diff --cached
(5)开发者user1提交代码,完成任务 .
[root@localhost hello-world]# git commit -m "Refactor: use getopt_long for arguments parsing."
(6).提交完成以后,能够看到这时 user1/getopt分支和master分支的指向不一样了。
[root@localhost hello-world]# git rev-parse user1/getopt master 733dcf67eba976a61d0dc6396c9d23cb23568591 d901dd8170f67fec607828905d5fbd91e3272400
(7)编译运行hello-world.
注意输出中的版本号显示.
[root@localhost src]# make clean rm -f hello main.o version.h [root@localhost src]# make version.h.in => version.h cc -c -o main.o main.c cc -o hello main.o [root@localhost src]# ./hello Hello world. (version: v1.0-1-g733dcf6)
将user1/getopt分支合并到主线
(1),为将分支合并到主线,首先user1将工做区切换到主线,master分支.
[root@localhost src]# git checkout master 切换到分支 'master'
(2)而后执行git merge命令以合并user1/getopt 分支.
[root@localhost src]# git merge user1/getopt 更新 d901dd8..733dcf6
(3)本次合并不是常顺利,实际上合并后master分支和user1/getopt指向同一个提交 ,这是由于合并前的master的提交就是user/getopt分支的父提交,因此这次合并至关于将分支master重置到user1/getopt分支
[root@localhost src]# git rev-parse user1/getopt master 733dcf67eba976a61d0dc6396c9d23cb23568591 733dcf67eba976a61d0dc6396c9d23cb23568591
(4)查看状态信息能够看到本地和远程分支的跟踪关系 .
[root@localhost src]# git status # 位于分支 master # 您的分支领先 'origin/master' 共 1 个提交。 # (使用 "git push" 来发布您的本地提交) # 无文件要提交,干净的工做区
(5)上面的状态输出中显示本地master分支比远程共享版本库的master分支领先.能够运行git cherry命令查看喜爱些提交领先(未被推送到上游跟踪分支中).
[root@localhost src]# git cherry
+ 733dcf67eba976a61d0dc6396c9d23cb23568591
(6)执行推送操做,完成本地分支向远程分支的同步
[root@localhost src]# git push warning: push.default 未设置,它的默认值将会在 Git 2.0 由 'matching' 修改成 'simple'。若要再也不显示本信息并在其默认值改变后维持当前使用习惯, 进行以下设置: git config --global push.default matching 若要再也不显示本信息并从如今开始采用新的使用习惯,设置: git config --global push.default simple 参见 'git help config' 并查找 'push.default' 以获取更多信息。 ('simple' 模式由 Git 1.7.11 版本引入。若是您有时要使用老版本的 Git, 为保持兼容,请用 'current' 代替 'simple' 模式) Counting objects: 21, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (5/5), 588 bytes | 0 bytes/s, done. Total 5 (delta 3), reused 1 (delta 1) To /home/jackluo/workspace/repos/hello-world.git d901dd8..733dcf6 master -> master
(7)删除 user1/getopt分支.
隐然特性分支user1/getopt 已经合并到主线上了,那么分支完成了历史命,能够放心地将其删除.
[root@localhost src]# git branch -d user1/getopt 已删除分支 user1/getopt(曾为 733dcf6)。