本文主要记录了,多人协作时,产生冲突时的解决情况.


多人环境创建

首先我们需要模拟一个多人环境。前面的Git的学习都是在Ubuntu上面,现在我们也搭建一个win环境吧。安装win环境下的Git,很简单,github.com官网下载,就像QQ一样,安装完以后,开始——所有程序——GitHub,Inc文件夹下的Git Shell打开即可。前面的Git命令在这里都可以的。ls你就会发现.ssh文件了,而且你登陆web的Git后,在Settings的SSH key里,已经自动添加了win的公钥。我们所做的就是

  1. 为主机设置邮箱和用户名
  2. 建立SSH连接
  3. 克隆远端的库
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved. C:\Users\joe> ls
Directory: C:\Users\joe
Mode LastWriteTime Length Name
---- ------------- ------ ----
....
d---- // : PM .ssh //这里我只显示了2个有关的文件
-a--- // : PM .gitconfig
... C:\Users\joe>

git remote

    //查看连接,发现没有连接
fatal: Not a git repository (or any of the parent directories): .git
C:\Users\joe>

mkdir work

    //连接工作目录,并git init
Directory: C:\Users\joe
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- // : AM work
C:\Users\joe> cd .\work
C:\Users\joe\work> git init
Initialized empty Git repository in C:/Users/joe/work/.git/
C:\Users\joe\work [master]> git remote
//下面的应该换成你自己的git文件
C:\Users\joe\work [master]>

git remote add origin git@github.com:joesGit15/

learngit.git
C:\Users\joe\work [master]>

git remote -v

    //已经有了连接
origin git@github.com:joesGit15/learngit.git (fetch)
origin git@github.com:joesGit15/learngit.git (push)
//可以看到已经有了连接,然后设置邮箱和用户名
C:\Users\joe\work [master]>

git config --

global user.email little_star14@sina.cn
C:\Users\joe\work [master]>

git config --global user.name "joe-PC"

C:\Users\joe\work [master]> 

git clone git@github.com:joesGit15/learngit.git

//克隆自己的库
Cloning into 'learngit'...
Warning: Permanently added 'github.com,192.30.252.130' (RSA) to the list of know
n hosts.
remote: Counting objects: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Receiving objects: % (/), 4.87 KiB | bytes/s, done.
Resolving deltas: % (/), done.
Checking connectivity... done.
C:\Users\joe\work [master + ~ - !]> ls//查看,成功 Directory: C:\Users\joe\work Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- // : AM learngit
C:\Users\joe\work [master + ~ - !]> cd .\learngit
C:\Users\joe\work\learngit [master]>

ls

    Directory: C:\Users\joe\work\learngit
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- // : AM abc.c
-a--- // : AM readme.txt C:\Users\joe\work\learngit [master]>

多人协作开始

多人环境配置好了,接下来你的好朋友就开始和你一起工作了。早上8点,你们开始工作了,同时从远程库克隆了开发分支dev,然后对同一个文件进行了修改。由于你比较麻利,完成以后,就推送到了远程库。而你的同事比较慢,在你推送以后,才推送。

你的工作如下:

C:\Users\joe\work> ls    //工作空间什么也没有
//克隆库的时候,我们只能克隆主分支的内容
C:\Users\joe\work>

git clone git@github.com:joesGit15/

learngit
Cloning into 'learngit'...
Warning: Permanently added 'github.com,192.30.252.131' (RSA) to the list of know
n hosts.
remote: Counting objects: , done.
Receiving objects: % (/), 8.00 KiB | bytes/s, done.
remote: Compressing objects: % (/), done.Resolving deltas: % (/)
Resolving deltas: % (/)
remote: Total (delta ), reused (delta ), pack-reused 0Resolving deltas Resolving deltas: % (/), done.
Checking connectivity... done.
C:\Users\joe\work>

ls

    Directory: C:\Users\joe\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- // : PM learngit
C:\Users\joe\work> cd .\learngit
C:\Users\joe\work\learngit [master]>

git branch

//只有主分支
* master
C:\Users\joe\work\learngit [master]>

git checkout -b dev origin/dev

//获取远程库的dev分支
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'
C:\Users\joe\work\learngit [dev]>

ls

    Directory: C:\Users\joe\work\learngit
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- // : PM abc.c
-a--- // : PM readme.txt
C:\Users\joe\work\learngit [dev]> cat .\abc.c
I am dev
C:\Users\joe\work\learngit [dev]>

cat .\abc.c

//修改内容如下:
I am dev
I am joe from window
C:\Users\joe\work\learngit [dev + ~ -]> git add abc.c
C:\Users\joe\work\learngit [dev + ~ -]>

git commit -m "joe win"

[dev 0338e7b] joe win
file changed, insertion(+)
C:\Users\joe\work\learngit [dev]> git status
On branch dev
Your branch is ahead of 'origin/dev' by commit.
(use "git push" to publish your local commits) nothing to commit, working directory clean
C:\Users\joe\work\learngit [dev]>

git push origin dev

//提交并推送dev分支
Warning: Permanently added 'github.com,192.30.252.128' (RSA) to the list of know
n hosts.
Counting objects: , done.
Delta compression using up to threads.
Compressing objects: % (/), done.
Writing objects: % (/), bytes | bytes/s, done.
Total (delta ), reused (delta )
To git@github.com:joesGit15/learngit
62f2b43..0338e7b dev -> dev
C:\Users\joe\work\learngit [dev]>

你同事不急不慢的完成任务也准备提交。

ubuntu@myUbuntu:~/joe$ ls//开始什么都没有
ubuntu@myUbuntu:~/joe$

git clone git@github.com:joesGit15/learngit

//克隆远程的库
正克隆到 'learngit'...
remote: Counting objects: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
接收对象中: % (/), 8.00 KiB | bytes/s, 完成.
处理 delta 中: % (/), 完成.
检查连接... 完成。
ubuntu@myUbuntu:~/joe$

ls

learngit
ubuntu@myUbuntu:~/joe$

cd learngit/

ubuntu@myUbuntu:~/joe/learngit$ git branch
* master
ubuntu@myUbuntu:~/joe/learngit$

git checkout -b dev origin/dev

//获取远程库的dev分支
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
ubuntu@myUbuntu:~/joe/learngit$ git branch
* dev
master
ubuntu@myUbuntu:~/joe/learngit$ ls
abc.c readme.txt
ubuntu@myUbuntu:~/joe/learngit$ cat abc.c
I am dev
ubuntu@myUbuntu:~/joe/learngit$ vi abc.c
ubuntu@myUbuntu:~/joe/learngit$

cat abc.c

 //修改文件内容如下
I am joe ubuntu
I am dev
ubuntu@myUbuntu:~/joe/learngit$ git add abc.c
ubuntu@myUbuntu:~/joe/learngit$

git commit -m "joe ubuntu"

[dev f1fe313] joe ubuntu
file changed, insertion(+)
ubuntu@myUbuntu:~/joe/learngit$ git status
位于分支 dev
您的分支领先 'origin/dev' 共 个提交。
(使用 "git push" 来发布您的本地提交)
无文件要提交,干净的工作区
ubuntu@myUbuntu:~/joe/learngit$

git push origin dev

//提交以后,准备推送的时候,却出了问题
To git@github.com:joesGit15/learngit
! [rejected] dev -> dev (fetch first)
error: 无法推送一些引用到 'git@github.com:joesGit15/learngit'
提示:更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外
提示:一个版本库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。
//根据提示,我们需要git pull这个命令,来查看冲突内容,有的时候,它会自动合并,有的时候需要手动来解决冲突(按照提示来就可以了)
ubuntu@myUbuntu:~/joe/learngit$ git pull
remote: Counting objects: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
展开对象中: % (/), 完成.
来自 github.com:joesGit15/learngit
62f2b43..0338e7b dev -> origin/dev
自动合并 abc.c
Merge made by the 'recursive' strategy.
abc.c | +
file changed, insertion(+)
//查看文件内容,还真给合并了。(如果想修改也可以)
ubuntu@myUbuntu:~/joe/learngit$

cat

 abc.c
I am joe ubuntu
I am dev
I am joe from window
buntu@myUbuntu:~/joe/learngit$

git push origin dev

//然后推送,OK,推送成功了。
对象计数中: , 完成.
Delta compression using up to threads.
压缩对象中: % (/), 完成.
写入对象中: % (/), bytes | bytes/s, 完成.
Total (delta ), reused (delta )
To git@github.com:joesGit15/learngit
0338e7b..532f546 dev -> dev

总结

  1. 首先git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

还有就是,通过这个案例,我们要做事儿尽快,别落后了,落后了就会有麻烦,先下手为强,后下手遭殃。


Git学习笔记(7)——多人协作的更多相关文章

  1. git学习笔记11-git多人协作-实际多人怎么开发

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

  2. Git学习笔记---协作的一般流程

    一般的操作流程 1.pull 王小坤与另一个同事张大炮一起开发一个项目,张大炮昨天修改了数据库读写的api,优化了执行速度,并把read()函数改名成了Read(),下午下班之前把这些代码push到服 ...

  3. 【转帖】Git学习笔记 记录一下

    本文内容参考了廖雪峰老师的博文,并做了适当整理,方便大家查阅. 原帖地址 https://wangfanggang.com/Git/git/ 常用命令 仓库初始化 - git init 1 git i ...

  4. Git学习笔记 (二)

    Git学习笔记(二) 突然发现,学习新知识新技能,都得经常温故使用,这样才能日益精进.最近学习的Git是因为加入了课题组,在学习做一些后台,由于后台开发会牵扯到多人开发,所以学会Git这一代码管理工具 ...

  5. Git学习笔记(二) · 非典型性程序猿

    远程库的使用 前面说到的都是git在本地的操作,那么实际协作开发过程中我们肯定是要有一个远程版本库作为项目的核心版本库,也就是投入生产使用的版本.这里我们以 Github为例.Github是一个开放的 ...

  6. Git学习笔记(10)——搭建Git服务器

    本文主要记录了Git服务器的搭建,以及一些其他的配置,和最后的小总结. Git远程仓库服务器 其实远程仓库和本地仓库没啥不同,远程仓库只是每天24小时开机为大家服务,所以叫做服务器.我们完全可以把自己 ...

  7. GIT学习笔记(5):变基

    GIT学习笔记(5):变基rebase 变基 引入变基 在Git中整合来自不同分支的修改主要有两种方法:merge以及rebase. 整合分支最容易的方法是merge,他会把两个分支的最新快照以及两者 ...

  8. GIT学习笔记(2):时光机穿梭与远程仓库

    GIT学习笔记(2):时光机穿梭与远程仓库 撤销操作 1.GIT如何跟踪修改 在我们修改了代码内容后,执行了git add和git commit命令来将其交由Git进行版本控制.我们前面举的例子是这样 ...

  9. Git学习笔记与IntelliJ IDEA整合

    Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...

  10. Git学习笔记(四)

    一.忽略特殊文件 在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件. 不需要从头写.gitignore文件,GitHub已经为我们 ...

随机推荐

  1. load与initialize

    NSObject类有两种初始化方式load和initialize load + (void)load; 对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次. iOS会在应用程序启动的时候调用 ...

  2. SVN强制解锁操作

    如果是其他人锁定文件,而你期望对此文件操作,可进行偷锁操作: 1,将被锁定文件SVN Check out-到本机硬盘. 2,点击文件右键,选择get lock 3,勾上steal the locks ...

  3. C#实现按键精灵的'找图' '找色' '找字'的功能

    背景:游戏辅助功能通常使用按键精灵编写脚本,按键精灵的最大卖点就是能够找到画面中字,图,色,这对于模拟用户鼠标操作至关重要,这能找到道具,找到血量,实现自动打怪,自动补血,自动买卖道具,博主闲来无聊, ...

  4. rhel7报错整理

    报错现象1: 安装过程需要一段时间,等待完成.   重启后进程     输入 q   再次输入 yes   重启后进入           报错现象2:     挂载镜像后,系统一重启报错:   来自 ...

  5. c#用正则表达式判断字符串是否全是数字、小数点、正负号组成 Regex reg = new Regex(@"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$");

    Regex reg = new Regex(@"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][ ...

  6. MongoDB学习笔记-05 聚合

    MongoDB除了基本查询功能之外,还有强大的聚合工具,其中包括:count().distinct().group().mapreduce. 计数函数count count是最简单的聚合工具,用于返回 ...

  7. 排列组合算法(PHP)

    用php实现的排列组合算法.使用递归算法,效率低,胜在简单易懂.可对付元素不多的情况. //从$input数组中取$m个数的组合算法 function comb($input, $m) { if($m ...

  8. java基础(环境设置,基础语法,函数数组)

    框架图 环境搭建 课程中常见dos命令: dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录 cd : 进入指定目录 cd.. : 退回到上一级目录 cd/ : 退回到 ...

  9. HTML5-布局的使用

    DIV布局: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...

  10. 网页版视频网站可以用html5来实现吗?

    当然可以用html5来实现视频网站,而且html5的诞生完全符合了百度优化,百度蜘蛛对这类的网站友好度非常高,会尽量会给高的权重,但是现在很多做 这类网站的开发还是比较习惯用websocket,这个东 ...