什么情况会产生冲突
-
git merge XXX(合并分支时的冲突):
当你尝试将一个分支的更改合并到另一个分支时,如果两个分支都修改了相同的文件的相同部分,Git 将无法自动解决冲突,因此会发生冲突。你需要手动解决这些冲突,然后提交解决后的文件。 -
git pull(拉取远程更改时的冲突):
当你从远程存储库中拉取更改时,如果你的本地分支和远程分支都有不同的更改,Git 将无法自动合并它们,导致冲突。你需要手动解决这些冲突,然后提交解决后的文件。 -
重置、回退或修改提交时的冲突:
如果你使用git reset
、git revert
或修改提交历史的操作,可能会导致冲突。这是因为你正在改变已提交的历史,而其他人可能已经基于旧的提交历史进行了工作。 -
同时编辑相同文件时的冲突:
当多个开发人员在相同文件的相同部分进行更改并提交时,会发生冲突。Git 会检测到这些更改的冲突,并要求手动解决。 -
合并请求 (Pull Request) 冲突:
在协作项目中,当你提交一个合并请求并请求将你的更改合并到主分支或其他分支时,如果维护者或其他贡献者对相同的文件进行了更改,会导致冲突。这时需要解决冲突才能合并你的请求。
减少冲突
-
通信与协作:保持团队成员之间的良好沟通,确保每个人都了解项目的整体方向和进展。协同开发时,及时分享和讨论代码更改计划,以避免不必要的冲突。
-
分支策略:采用合理的分支策略,例如使用特性分支、发布分支等。明确分支的用途和生命周期,以减少分支合并时的冲突。
-
小而频繁的提交:鼓励团队成员频繁提交小规模的更改,而不是一次性提交大型更改。这可以减少同时修改相同文件的机会,降低冲突概率。
-
合并频率:定期合并主分支的更改到个人分支,以保持你的分支与主分支同步。这可以减少主分支与个人分支之间的差异,减少冲突。
-
版本控制工具设置:利用版本控制工具的设置,如
.gitignore
文件屏蔽不需要提交的文件,提交时会自动忽略调这些文件。 -
清晰的变更计划:在项目中有一个清晰的变更计划,以便团队成员了解即将进行的更改,可以提前预防冲突。
解决冲突
比如我就使用git pull 拉取远程的代码,此时有个文件相同的位置我本地改动了,远程也被改了,那么我在没有保存改动 直接pull是会报错的:
为了顺利拉取远程的代码,通常有如下两种解决方式:
- 先执行git add 、git commit再执行git pull。
- 或者 使用git stash save 先把本地改动暂存一下。执行git pull 后,再使用git stash apply stash@{XX},如何解决冲突。
使用第一种方法,pull之后就会有需要解决冲突的文件
我使用的vscode编译器。可以看出这个文件的16行开始有冲突,本地用的“文件1111”,远程被改成了“文件9”。这里有提示,使用你本地的还是远程的,或者accept both changes
两个改动都保留。具体用哪个,怎么改都看自己的情况了。
使用stash,命令暂存修改的文件
**注意:**我截图中的git stash apply stash@{0}命令是报错了的,原因就是我直接使用的vscode的终端powershell,可能内部转换错误。然后我使用的git bash终端就没问题了。其实可以把git 配置到vscode的终端(可以自己去配一下,我就是懒),这样就不用额外打开git bash命令操作了。
然后使用git pull。再使用git stash apply stash@{}。这里的序号可以使用git stash list 查看。看你想使用存储区中的哪个改动。
然后再解决冲突提交就是。
多人开发正确的提交步骤
- 注意push 前一定要先pull,不然可能会覆盖远程更改。虽然很多情况会提示push 失败,先解决冲突再提交。但是工具提醒哪有自己pull 靠谱,万一覆盖了呢,更麻烦不是。
- 提交合并代码尽量频繁一点,不然一下子解决几十上百个文件的冲突就难受啦
- 多人合作一个分支就习惯性写代码(分支有改动或者每天上班前)之前pull。写完(任务量大也尽量一天执行一次)push一次。不用等着最后开发完成再去想着解决冲突。
- 分支和主线之前先git merge 主线 ,解决完冲突再合并。
补充git stash命令
git stash
命令用于保存当前工作目录中的尚未提交的更改,以便稍后恢复这些更改或在其他分支上工作。这对于临时切换到其他任务或分支,而不希望将未提交的更改混合在一起非常有用。
-
保存更改到存储区(stash):
git stash save "Your stash message"
这个命令将当前的未提交更改保存到一个新的存储区(stash)中,并可选择添加一条描述消息。存储区的作用是暂时存储你的更改。
-
查看存储区列表:
git stash list
这个命令可以列出你保存到存储区的所有存储记录,以及它们的描述消息。
-
应用存储区中的更改:
git stash apply stash@{n}
使用
apply
命令可以应用存储区中的指定存储记录,n
代表存储记录的编号。如果不指定n
,默认应用最新的存储记录。应用存储记录后,你的工作目录会包含这些更改。 -
应用并移除存储区中的更改:
git stash pop stash@{n}
pop
命令与apply
类似,但它会应用存储记录并从存储区中移除这个记录。 -
删除存储区中的更改:
git stash drop stash@{n}
这个命令用于删除存储区中的指定存储记录,
n
代表存储记录的编号。 -
清空存储区:
git stash clear
这个命令会清空存储区,删除所有的存储记录。