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)
远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。通常是公网服务器上的仓库.


在这里插入图片描述


在这里插入图片描述

附上 下图链接在这里插入图片描述

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

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

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

在这里插入图片描述
解决方法:

git fetch

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


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

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


在这里插入图片描述


情况二:甲员工修改完某些文件,不知道怎么提交到远程库 在这里插入图片描述

解决方法:

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出现了冲突,不知道怎么解决

在这里插入图片描述

原因分析:

在这里插入图片描述

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

当甲员工git pull时候,因为都是改了第二行的内容,所以会造成冲突,如下图:
甲员工打开gitTeach.java文件,会发现===为分割线,可以看到上部分<<<<<<HEAD
这是甲员工修改的内容, 以及远程库传入的>>>>>> you too 内容;
在这里插入图片描述

5dfcab… 是乙员工提交的commit版本
在这里插入图片描述

解决方法:

在这里插入图片描述
如果是编译器,可以选择保留自己,保留对方,也可以选择保留双方,我这边自己删掉符号,整理了顺序.只要pull下来了,就能匹配上版本号,无论怎么修改都能推向远程.

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

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

在这里插入图片描述


以下是乙员工的操作,乙员工被甲员工告知,我合并了代码,你拉下代码,然后乙员工打开了自己的项目git pull 下来 远程仓库合并的最新代码;
在这里插入图片描述


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

情况详细:

乙员工git pull 后,发现gitTeanch.java的文件变动蛮大,觉得想还原看看之前写的代码
在这里插入图片描述
解决方法:

git log

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

git log执行后如下图:
在这里插入图片描述

可以看到commit信息中的修改冲突祝福描述信息是git pull下来的作者是787917909@qq.com.

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

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

演示如下:

在这里插入图片描述

通过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 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操作);

演示操作:

在这里插入图片描述
结果如下:
在这里插入图片描述

个人建议不要使用以下两个回退命令: 有可能出现回退分支到其他提交者的库,从而丢弃本地的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 pull 操作的文件详情
在这里插入图片描述
如果乙员工继续在该文件第三行添加新年快乐
在这里插入图片描述

进行提交四连击,会在git pull 提示冲突
在这里插入图片描述gitTeach文件如下图:
在这里插入图片描述

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

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

甲员工知道后乙员工合并冲突后,很自觉pull下最新代码,并查看改变的详情,发现不错
在这里插入图片描述
git show # view the diff of last commit
在这里插入图片描述

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

情况分析:

乙在修改howTOGit.java中,但他并不想这么快提交到版本库,只想提交在gitTeach.java新增的内容 +With the compliments of the season祝贺佳节
在这里插入图片描述

解决方法:

只需要在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)就之前就推向了远程库.

在这里插入图片描述
乙员工在情况七,执行完7git stash pop后,会出现特殊情况,也就是甲和乙刚好修改同一份文件同一行,但是乙没提交,而是在本地压栈,当pop出来后,肯定会有冲突的,冲突如下:
甲在howToGit文件新增了内容刚好跟乙修改了但不想传上去的文件是同一行

情况详细:

在这里插入图片描述

文件内容如下:

在这里插入图片描述

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

演示操作:

在这里插入图片描述


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

情况详细:

在这里插入图片描述

原因:

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

解决方法:

ctrl+x

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

遇到这个页面后

在这里插入图片描述
输入N

演示操作:

在这里插入图片描述


情况八:如果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撤销,但是不删除工作空间代码,恢复到仅仅修改完后的样子
演示操作:

在这里插入图片描述

到此完毕,有需求再更新

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
多人合作中,使用Git提交代码是一个非常常见的做法。首先,每位开发人员需要克隆远程仓库到本地,并创建自己的分支用于开发新功能或修复bug。当开发人员完成自己的工作后,需要将代码提交到本地仓库,并将修改推送到远程仓库。以下是一个常见的Git多人合作代码提交流程: 1. 首先,每个开发人员需要从远程仓库克隆代码到本地: ``` git clone <远程仓库地址> ``` 2. 在本地仓库中创建自己的分支,并切换到该分支: ``` git checkout -b <分支名称> ``` 3. 在该分支上进行开发工作,并定期提交自己的代码: ``` git add . git commit -m '描述本次提交的内容' ``` 4. 当开发人员完成自己的工作后,需要将修改推送到远程仓库: ``` git push origin <分支名称> ``` 5. 当其他开发人员也完成了自己的工作并将代码推送到远程仓库后,可以使用以下命令将远程仓库中的最新代码合并到本地仓库: ``` git pull origin <分支名称> ``` 请注意,如果在合并过程中出现冲突,需要解决冲突后再次提交代码。 以上是一个基本的Git多人合作代码提交流程。每个开发人员都可以在自己的分支上进行开发,并将代码提交到远程仓库,以便其他开发人员可以获取并合并最新的代码。这样可以有效地协作开发,并保持代码的版本控制和一致性。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶孤崖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值