当前位置: 首页 > 后端技术 > PHP

关于使用git协同开发时的常见操作

时间:2023-03-30 01:20:37 PHP

通常我们是这样工作的,来谈谈使用git进行版本控制时的工作流程gitadd-A#需要添加到版本库的文件-A代表所有文件(除了被.gitignore忽略的文件)gitcommit-m'备注thissubmission'gitpull#同步远程库和本地库版本,因为远程库可能已经被修改了(多人合作开发时)gitpush这个操作的前提是本地和远程都最有可能出问题在同一个master分支上遇到上面的前两步一般不会遇到问题。最有可能出问题的是gitpull这一步,因为在开发的时候难免会有多人同时修改同一个文件,所以会出现冲突。Git根据文件每一行的修改来判断。如果同时修改同一个文件的同一行,就会卡在这一步。如何解决这个问题呢?我平时使用命令行和phpstrom中的版本控制工具中,最推荐的是命令行操作。其他图形界面也调整为命令行界面。直接学习git命令是一种学习成本最低的方式。一旦你学会了,你就可以在任何地方使用它!命令行也有一个强大的功能最重要的是它的提示通常就是你解决问题的方法,按照提示操作即可(好好利用提示,看到错误不要惊慌)来做个实验吧,一我自己的版本库在本地和远程同时发生了修改,而且操作的是同一个文件。我直接执行gitpush操作是不是看到提示了?提示中的hint是说远程库的更新被拒绝了,因为远程有修改而本地没有(说白了就是没有同步),这种情况一般发生在另一个版本库推送同一个文件到remote(即本版本下两个人同时操作同一个文件),在提示中给出原因(例如'gitpull...')后立即给出解决方案,然后再次推送,我们按照它给出的提示进行操作。通常,如果两个人的操作没有冲突,比如同时修改同一个文件的同一行,我们就会进入commit编辑界面,但是我给别人报错了,这个报错最多我们遇到的常见错误,合并冲突看到提示中的最后一行了吗?自动合并失败;修复冲突然后提交结果。自动合并失败,请解决冲突再提交如果文件很多,如何查找?一种是靠接口工具主动把错误推送给你前者和后者是自己找第一种方法。作弊的地方就是有很多工具会提醒你一次。关了就不会再提示了,但是不该提交的提交还是提交不了。如果它是在线快速修复,您的编辑将无法帮助您那么远。我们选择第二个选项。绝对不是一个一个的翻文件!有一个非常有用的命令gitstatus可以将文件标记为红色。在这里,它还给你提供了需要执行的命令,不要假装你看不到!当然这个时候直接gitadd&&gitcommit会出事,你还没有解决冲突呢!我们去这个冲突文件中解决如果冲突能在本地跑通就提交,错误信息会指定文件路径。我的冲突文件不在项目的根目录中。当我打开这个文件时,我们看到如下内容:我在phpstrom如果phpstrom可以读取你项目中的.git/目录,它就可以进行版本控制了。在这里,phpstrom会帮你把冲突的文件标记为红色。多么醒目啊~当然,如果文件内容很多,这是我们发现的,但是当只有一两个冲突的时候,我们可以直接搜索关键词HEAD或者<<<<<<<,就知道了……尖角扩大的地方就是冲突,下一步是保护孩子还是保护孩子。是时候让成年人解决冲突了。找出谁更改了与您相同的代码?你说你找不到谁?没看到代码冲突块下的文字779833d952d8a6557b2e8eba3bd192ede5cb6ca0吗?不要激动。不适合开车,这个是提交的commit-id,每次提交都会生成一个标识。查看谁和我的代码有冲突,执行如下命令gitlog779833d952d8a6557b2e8eba3bd192ede5cb6ca0第一行就是你要的结果,如果直接gitlog-p列出所有提交记录-p是显示修改的地方,冲突blockpartHEAD是你写的代码,下面是别人写的,去掉其中一个清理掉那些标签,测试一下。问题又来了gitadd&&gitcommit&&gitpull&&gitpush这四个组合很好,世界很干净,这个合并时发生了什么?这是我在segmentfault中给出的答案:比如你从一个gitlog开始为1,2,3,4,5,6的远程库是本地拉取的,另外一个同事也拉取了同样的代码,你同事先你提交到远程。此时远程版本为1、2、3、4、5、6、7_new、8_new,而你当前只有本地版本1、2、3、4、5、6、7_local、8_local、9_local来自这里可以看到你的前半部分和远端一样,后半部分和远端不一样,此时不能正常推送。如果你拿gitpushoriginmaster--force,那么远程版本就会变成1,2,3,4,5,6,7_local,8_local,9_local,之前同事推的7_new和8_new的两次推是覆盖。这不是大家想要的,所以需要gitpull将本地版本合并到samples1,2,3,4,5,6,7_new,7_local,8_local,8_new,9_local,10_commit_mergeremote和local的排序是根据在当时的提交时间。最后的10_commit_merge是你本地和远程合并的标志,应该是你最后push到远程仓库的东西,因为你操作的是同一个库。要保持代码同步,所以一旦版本库发生变化,同一个分支下的所有人都必须跟着他同步,因为每次开发直接上推git,不够聪明,帮你处理冲突。如果只想合并分支中的几个文件怎么办?比如我有两个分支*alphadev,我只需要dev中的某些文件,比如README.md和LICENSE.md,那么我就gitcheckoutdev/path/to/README.md/path/to/LICENSE.md将从dev分支中提取这些文件并在alpha分支上覆盖它们。注意拉取的文件会被强制覆盖,然后可以gitdiff这些文件看看有没有问题。gitcommit&&gitpull&&gitpush随便拿一套带走回复链接博客原文