git详细实用操作指南--多人合作同一分支

git常用术语简单解析

1)工作区(workspace)
程序员进行开发改动的地方,是你当前看到的,也是最新的。平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。

2)暂存区(index/stage)
.git目录下的index文件, 暂存区会记录 git add 添加文件的相关信息(文件名、大小、timestamp…),不保存文件实体, 通过id指向每个文件实体。可以使用 git status 查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过 git add 先提交到暂存区,被git管理。

3)本地仓库也称本地版本库(local repository)
保存了对象被提交过的各个版本,比起工作区和暂存区的内容,它要更旧一些。git commit 后同步index的目录树到本地仓库,方便从下一步通过 git push 同步本地仓库与远程仓库的同步。通常是本地电脑上的一个仓库.

4)远程仓库也称远程版本库(remote)
远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。通常是公网服务器上的仓库.


git详细实用操作指南--多人合作同一分支_第1张图片


git详细实用操作指南--多人合作同一分支_第2张图片

附上 下图链接git详细实用操作指南--多人合作同一分支_第3张图片

假设:多人合作开发项目,且共同一个分支,即在develop分支

下面我以甲员工,乙员工合作开发时候发生的情况为例子:

情况一:甲员工git clone下来发现本地没有远程分支develop

git详细实用操作指南--多人合作同一分支_第4张图片
解决方法:

git fetch

相当于是从远程获取最新版本到本地,不会自动merge.这样做目的,把远程分支信息更新到本地库


git checkout -b 本地分支名 origin/远程分支名

(注意执行该命令,当前路径应该处于含有.git的主目录)
例如: git checkout -b develop origin/develop


git详细实用操作指南--多人合作同一分支_第5张图片


情况二:甲员工修改完某些文件,不知道怎么提交到远程库 git详细实用操作指南--多人合作同一分支_第6张图片

解决方法:

git status

查看当前状态


git add filename

添加一个文件到git index (暂存区) 例如:git add gitTeach.java

git add .

添加所有文件到git index (暂存区) 本人不建议使用这个,因为项目跑起来会产生很多xxx.class文件,这些是不需要提交的


git commit -m "描述这次提交最新的修改的内容"

提交并且加注释 到本地版本库


git pull origin 分支名

本地下拉代码与服务器端同步 这步很重要,如果另一个人在这段时间修改了相同的文件内容,则无法push到远程库,报冲突,如果只有本人在这个分支开发则可省略该命令


git push origin 分支名

将本地项目给提交到远程库服务器中

操作演示:


情况三:甲员工修改完某些文件,git add,git commit,轮到git pull出现了冲突,不知道怎么解决

git详细实用操作指南--多人合作同一分支_第7张图片

原因分析:

在这里插入图片描述

1.左图为甲员工本地的gitTeach.java文件,右图为乙员工的本地的gitTeach.java文件.
乙员工已将代码推上了正式库,所以git远程仓库的代码是乙员工本地的代码.

当甲员工git pull时候,因为都是改了第二行的内容,所以会造成冲突,如下图:
甲员工打开gitTeach.java文件,会发现===为分割线,可以看到上部分<<<<< 这是甲员工修改的内容, 以及远程库传入的>>>>>> you too 内容;
git详细实用操作指南--多人合作同一分支_第8张图片

5dfcab… 是乙员工提交的commit版本
git详细实用操作指南--多人合作同一分支_第9张图片

解决方法:

git详细实用操作指南--多人合作同一分支_第10张图片
如果是编译器,可以选择保留自己,保留对方,也可以选择保留双方,我这边自己删掉符号,整理了顺序.只要pull下来了,就能匹配上版本号,无论怎么修改都能推向远程.

修改完,用git status 查看一下状态, cat 查看一下文件也行

然后提交修改的四连走一波;

git详细实用操作指南--多人合作同一分支_第11张图片


以下是乙员工的操作,乙员工被甲员工告知,我合并了代码,你拉下代码,然后乙员工打开了自己的项目git pull 下来 远程仓库合并的最新代码;
git详细实用操作指南--多人合作同一分支_第12张图片


情况四:git pull或git merge 后,发现代码变动过大,后悔了,想在本地还原我之前本地版本库甚至还想远程库还原到该版本

情况详细:

乙员工git pull 后,发现gitTeanch.java的文件变动蛮大,觉得想还原看看之前写的代码
git详细实用操作指南--多人合作同一分支_第13张图片
解决方法:

git log

看本地commit的日志(包括git commit git pull等)

git log执行后如下图:
git详细实用操作指南--多人合作同一分支_第14张图片

可以看到commit信息中的修改冲突祝福描述信息是git pull下来的作者是[email protected].

乙员工想回到git pull之前,就是描述为回礼的commit,对应的是
在这里插入图片描述
git reset --hard commit号码

让本地代码回滚到该次git commit时候的代码,同城截取前面一段即可,保证唯一就行了.
例如:git reset --hard 5dfcab95dcde

演示如下:

git详细实用操作指南--多人合作同一分支_第15张图片

通过cat查看回滚前和回滚后的gitTeach.java文件内容,可以发现文件已回滚至git pull之前

如果仅仅想让单个文件回滚版本请看githttps://blog.csdn.net/fsgsggd/article/details/79875035


假如这时乙员工头脑发热,想将远程仓库放弃新的提交还原到这个版本

这样也是可以的,通过命令

git push origin HEAD --force

在git解开develop分支保护, 远程提交回退 , HEAD☞的是指针,即 develop .
例如git push origin develop --force develop分支示例


情况五: 乙员工git reset --hard commit_id回退版本后,后悔了,想恢复到回退之前,发现git log 没记录 怎么办.

情况详细:

由下图可知:回退后,git log只剩下回退后版本以前的信息;
git详细实用操作指南--多人合作同一分支_第16张图片

解决方法:

git reflog --date=iso

可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)

输入 git reflog --date=iso 后 如下图↓ 可以查看到,分支由原本的commit_id为5bcaecd 描述为pull:Fast-forward 按照时间由下到上到 5dfcab9 描述为reset: moving to 5dfcab95

在这里插入图片描述

然后执行查看reset前的commit id

git reset --hard commit号码

让本地代码回滚到该次git commit时候的代码,commit_id截取前面一段即可,保证唯一就行了.
例如:git reset --hard 5bcaecd

所以如果乙员工想恢复git reset的操作

只要输入:
git reset --hard 5bcaecd

就是回退到执行reset前一个版本号,也就是恢复回退(reset操作);

演示操作:

git详细实用操作指南--多人合作同一分支_第17张图片
结果如下:
git详细实用操作指南--多人合作同一分支_第18张图片

个人建议不要使用以下两个回退命令: 有可能出现回退分支到其他提交者的库,从而丢弃本地的commit信息
git reset --hard HEAD^

每加一个^ 就表示更前的一个版本,例如HEAD^^就表示“add second line”这个版本,如果想要回到100个版本前,就需要100个^

git reset --hard HEAD~1

HEAD^换成了HEAD~1 ,其中1代表回退几个版本,如果需要回退到10个之前的版本,只需要把HEAD~1 改为HEAD~10即可


情况六: 甲员工修改完冲突提交到远程库,并没有告诉乙员工,乙员工继续在其本地开发,提交远程出现冲突

情况详细:
其实这个跟情况三如出一致,都是因为修改了同一文件同一行内容,导致冲突.

下图是远程库gitTeach.java文件,也就是甲员工修改完冲突提交到远程库的版本的该文件
git详细实用操作指南--多人合作同一分支_第19张图片
下图是乙员工未执行git pull 操作的文件详情
git详细实用操作指南--多人合作同一分支_第20张图片
如果乙员工继续在该文件第三行添加新年快乐
git详细实用操作指南--多人合作同一分支_第21张图片

进行提交四连击,会在git pull 提示冲突
git详细实用操作指南--多人合作同一分支_第22张图片gitTeach文件如下图:
git详细实用操作指南--多人合作同一分支_第23张图片

git通过比对发现you too 能匹配,但是第三段甲乙都修改同一行,就会出现冲突

解决方法:
解决方法也跟情况三一样,这里就不演示了;记得修改完冲突,告诉合作的小伙伴pull下来,保持本地库与远程库代码的一致性.

甲员工知道后乙员工合并冲突后,很自觉pull下最新代码,并查看改变的详情,发现不错
git详细实用操作指南--多人合作同一分支_第24张图片
git show # view the diff of last commit
git详细实用操作指南--多人合作同一分支_第25张图片

情况七: 乙同时修改两份文件,只想提交一份文件到正式库,因为另一份文件还没修改好不想提交,怎么办?

情况分析:

乙在修改howTOGit.java中,但他并不想这么快提交到版本库,只想提交在gitTeach.java新增的内容 +With the compliments of the season祝贺佳节
git详细实用操作指南--多人合作同一分支_第26张图片

解决方法:

只需要在git 提交四连中引入git stash 命令即可,如果你很明确知道远程仓库该文件没有人推新的版本,那么可以省略git stash,不然git pull会报错.

1.git add gitTeach.java

2.git commit -m "我只想提交gitTeach.java"

3.git stash push -m "描述" xxx.java

git stash push -m “把howToGit暂存” howToGit.java 把howTOGIt压栈. 建议一定要加上push,不然默认执行git stash save,这个会把所有修改信息都压栈,我们只需要一个文件,用push就好.-m后面跟描述.
2和3的顺序可以互换,要是想先commit再stash,切记一定要在git stash后面加 push,如果不加会造成git stash把暂存区 git add的文件都压栈了,造成git add失效

4.git pull

5.git push

6.git stash list

查看stash了哪些存储 例如 stash@{0}: On develop: 把howToGit暂存

7.git stash pop stash@{id}

git stash pop stash@{0} 把stash@{0}: On develop: 把howToGit暂存压栈还原

随记:我想说一下遇到的一些事情,以前有同事说我不stash也可以提交我修改的,我只要不用git add 将不提交文件提交到暂存区不就可以了吗,如果这个分支只有一个人,那也行,因为你永远不知道,有没有人在远程推了新的一版该文件,要是推了,执行git pull就会报错.

操作演示:


情况七-外传延续: git stash pop把缓存堆栈的内容还原后,与刚git pull下来的内容冲突怎么办

为什么叫情况七外传,不叫情况八? 因为是发生在情况七的基础上,同样的执行方法只不过加点特殊情况,希望能加深理解:

甲在howToGit文件新增了内容刚好跟乙修改了但不想传上去的文件是同一行
+May you have the best New Year ever愿你度过最美好的新年!
并且甲眼疾手快在乙没推向到远程库(git push)就之前就推向了远程库.

git详细实用操作指南--多人合作同一分支_第27张图片
乙员工在情况七,执行完7git stash pop后,会出现特殊情况,也就是甲和乙刚好修改同一份文件同一行,但是乙没提交,而是在本地压栈,当pop出来后,肯定会有冲突的,冲突如下:
甲在howToGit文件新增了内容刚好跟乙修改了但不想传上去的文件是同一行

情况详细:

git详细实用操作指南--多人合作同一分支_第28张图片

文件内容如下:

git详细实用操作指南--多人合作同一分支_第29张图片

解决方法:
解决方法跟情况三基本一致,要么保留对方,要么保留自己,要么双方保留,自行修改.
这里展示操作就好了.推上远程库后,记得告诉甲员工pull下来.

演示操作:


情况八:当git pull时出现如下提示,请输入一个提交信息以解释此合并的必要性怎么办

情况详细:

git详细实用操作指南--多人合作同一分支_第30张图片

原因:

这是由于你修改的文件commit后,git pull时,远程库有人跟你修改同一份文件而且提交上去,但是你和他并没有修改同一行,所以git自动合并,git提示你,你要做个记录吗?

解决方法:

ctrl+x

先摁住ctrl,不松手,再摁x

遇到这个页面后

git详细实用操作指南--多人合作同一分支_第31张图片
输入N

演示操作:

git详细实用操作指南--多人合作同一分支_第32张图片


情况八:如果commit错了,想要取消commit而且还要保留已经修改过add的文件,那么应该怎么做呢?

情况详细:

通常,我们对修改的文件会先git add .,然后git commmit -m “注释”,但是如果commit错了,想要取消commit而且还要保留已经add的文件

解决方法:
git reset --soft HEAD^

git reset --soft commitid

这样就会回到刚刚add之后的状态了(HEAD^是上一个版本的意思,如果要回退到前n个,那么就是HEAD~n)

关于git reset的一些参数如下:

--soft
    不删除工作空间改动代码,撤销commit,不撤销git add .

--hard
    将 add 和 commit撤销,然后删除工作空间代码,恢复到上一个commit结束时候的样子

--mixed
    将 add 和 commit撤销,但是不删除工作空间代码,恢复到仅仅修改完后的样子

演示操作:

git详细实用操作指南--多人合作同一分支_第33张图片

到此完毕,有需求再更新

你可能感兴趣的:(git,git教程,git超详细,手把手,git实用指南,git图解)