Git详解

参考https://zhuanlan.zhihu.com/p/41344866

分支

在开发的过程中有主干线和分支线,相互之间的代码开发不受影响。
一个实际的例子。

  • 假设某软件的1.0版本完成了,马上投入了1.1版本的开发中
  • 过了一段时间,1.1版本开发了一部分(基于1.0),但是有用户反馈1.0版本有bug,那么就需要修复1.0版本中的bug,同时重新发布1.0版本
  • 如果在现行1.1版本上修改,那么更新的版本就会带有1.1的特性
  • 使用分支,只需要在1.0发布时的版本建立一个分支,我们在主干线上开发1.1版本,1.0发现bug,在分支上进行修改并发布出去。并且把修改时候没有bug的代码合并到主干线上,这样就发布没有bug的1.0,又使得正在开发的1.1版本避免了1.0的bug。

git branch可以查看可以查看分支。在gitbash中显示的master就是我现在所在的分支,这块就是主干线。
如果要添加分支,则在git branch之后加上新的分支名就可以添加新的分支。
git brach -D [分支名] 则是删除了分支。注意删除分支的时候要先退回的master分支。

checkout命令加上分支名,就可以进入指定的分支。分支和主干线是互不影响的,使用merge命令可以进行合并操作。

例子:

1
2
git checkout master //进入主干线
git merge version1.0 //把1.0分支上修改并提交的代码合并到master分支上面

与远程版本协作

git的最大用途就是可以进行团队合作开发,每个人电脑上都有一份代码,团队的某个成员完成自己的一部分任务的时候,就将代码提交到服务器,其他人只需要将服务器上的代码同步到本地,就能保证大家的代码相同,再进行开发就可以了。

git clone:将远程仓库的代码下载到本地,自己进行一些修改和提交(commit)之后,可以使用push命令

git push origin master: origin指远程版本库的Git地址,master执行的是哪一个分支

git fetch origin master:远程版本库上的修改同步到本地用fetch命令。执行之后就把远程版本库的代码同步到本地了,但是不会合并,而是存放在origin/master分支上面,可以用diff查看修改了什么地方git diff origin/master。之后可以用merge命令进行合并。

git pull origin master 则是把fetch和merge两步融合为了一个命令。

远程仓库与本地仓库实验

  • 在github中创建新的repository获得Git地址 Git_remote

  • 在本地创建git仓库

    1
    2
    3
    mkdir local_dir //创建路径
    cd local_dir
    git init //初始化git本地仓库
  • 将两个仓库进行连接
    git remote add Git_remote

  • 本地创建文件,并提交

    1
    2
    3
    4
    5
    touch v1code.txt
    git add . //将文件夹中的所有文件加入
    git commit -m "commit v1code.txt" //向当前分支提交代码
    git branch //查看当前分支(本地)
    git branch -a //查看所有分支(远程)
  • 将本地仓库的代码提交到远程

    1
    2
    git push origin master //将代码推送到远程master
    git branch -a

    此时可以发现如下:
    第一次提交
    显示当前远程仓库只有一个分支master。当前处于本地master分支

  • 创建分支

    1
    2
    git branch version1.0
    git checkout version1.0 //进入version1.0分支

    注意此时version1.0分支包含与master分支相同的文件
    将version1.0分支推到远程分支

    1
    2
    git push origin version1.0
    git branch -a

    第二次提交
    此时注意我们是把version1.0的版本推送到了origin/version1.0中

  • 在version1.0中进行相应的更改,添加文件test1.txt
    查看不同分支
    第三次提交
    将version1.0推到origin/version1.0中
    查看远程分支
    此时可以发现github repository上出现了两个分支,可以切换到不同分支进行查看

  • 在本地重新创建一个仓库,clone远程仓库,模拟多人操作。

    1
    2
    3
    4
    5
    6
    7
    8
    //方法1 clone
    mkdir git_branch_learn_commiter2
    git clone Git_remote ./git_branch_learn_commiter2
    //此时发现只clone了origin/master分支,对应下图
    //想要将version1.0拉下来
    git branch origin/version1.0 //切换到origin/version1.0分支
    git branch version1.0 //在本地仓库中创建branch,完全复制了version1.0的东西
    //注意当你git checkout一个远程仓库的时候,会跳出提示,提醒你处于”detached HEAD“状态,这个时候你可以在这个分支中实验,但并不会被提交更改

    commiter2第一次clone

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //方法2 创建本地仓库并连接
    git remote add Git_remote //出现报错, 查看报错信息
    git remote add -f <name> Git_remote //尝试将<name>设为name之后发现如下图
    //所以这个是设置了远程仓库,那么就依照远程仓库进行本地仓库分支更新
    git checkout name/master
    git branch master
    git checkout name/version1.0
    git branch version1.0
    //这里同样出现了”detached HEAD“状态
    //这时候查看会发现没有出现origin分支

    commiter1远程连接

  • commiter1在version1.0上开发之后,与master合并(在version1.0上添加initial_from_c1.txt文件)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    git checkout version1.0 //切换到version1.0分支
    git merge master version1.0 //这时候发现master出现了initial_from_c1.txt文件,但是没有test1.txt文件。同时提示already updated,说明并没有进行合并操作
    git checkout master //切换到master
    git merge master version1.0 //发现进行了text1.txt的合并
    //所以这个时候我们添加的initial_from_c1.txt只是存在于dir中,并没有添加进分支。在此时我们push 远程master
    git push origin master //此时我们本地master,push到远程master

    git checkout version1.0
    git add .
    git commit -m "commiter 1 write something"
    git push origin version1.0 //version1.0更改并推向远程分支
  • commiter2进行自己的开发

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    //此时commiter2的origin与github仓库上的并不同步,可以查看发现在master分支中只有v1code.txt
    //我们对当前远程仓库进行一下更新
    git fetch origin
    //会看到提示说”Your branch is behind origin/master by 1 commit“.就是说本地仓库master和origin/master的当前版本不一致,这个没问题这个就是我们想要的
    git pull //将origin/master拉到本地仓库中,其实就是merge origin/master master

    //我们在version1.0分支下添加test_2.txt,并提交
    git checkout version1.0
    touch test_2.txt
    git add .
    git commit -m "commiter2 add test_2.txt"
    //我们创建version1.2, 并推导远端
    git branch version1.2 //内容与version1.0完全一样
    git push origin version1.2

    //merge origin/version1.0和version1.0
    //这时候你就发现git pull搞不清楚你想要merge哪个分支,提示你git pull <remote> <branch>
    git pull origin version1.0 //merge的时候会发现要填写一个为什么需要的文档
    //现在看version1.0
    // -initial_from_c1.txt -test1.txt -test_2.txt -v1code.txt
    //而version1.2
    // -test1.txt -test_2.txt -v1code.txt

    //将1.2和1.0合并
    git merge version1.0 version1.2
  • 原始创建者将所有的版本汇聚成一个master主分支

    1
    2
    3
    4
    5
    git fetch //将远程分支进行更新
    git checkout version1.0
    git pull origin version1.2
    git checkout master
    git merge version1.0 master