• git 创建branch分支


    开发者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。

    [root@localhost hello-world]# ls -F .git/refs/heads/
    master  user1/

    [root@localhost hello-world]# ls -F .git/refs/heads/user1/
    getopt

    引用文件 .git/refs/heads/user1/getopt记录的是一个提交ID.

    [root@localhost hello-world]# cat .git/refs/heads/user1/getopt
    d901dd8170f67fec607828905d5fbd91e3272400

    因为分支user1/getopt是基于头指针HEAD创建的,因此当前该分支和master分支的指向是一致的.

    [root@localhost hello-world]# cat .git/refs/heads/master
    d901dd8170f67fec607828905d5fbd91e3272400

    ===============================

    创建分支user2/i18n

    创建分支:执行git branch <branchname>命令创建新分支

    切换分支:执行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)。
  • 相关阅读:
    Intent
    What should we do next in general after collecting relevant data
    NOTE FOR Secure Friend Discovery in Mobile Social Networks
    missing pcap.h
    after building Android Source code
    plot point(one column)
    When talking to someone else, don't infer that is has been talked with others at first. It may bring repulsion to the person who is talking with you.
    进程基本知识
    Python input和raw_input的区别
    强制 code review:reviewboard+svn 的方案
  • 原文地址:https://www.cnblogs.com/jackluo/p/3499731.html
Copyright © 2020-2023  润新知