Git拉取和解决冲突

60

我正在学习Git,遇到了这么一种情况:

  1. 我的同事进行了更改并将更改推送到主分支。
  2. 我在本地的主分支上也进行了更改。

根据我的理解,在这个阶段我可以选择以下两种方式之一:

  1. 拉取同事工作的主分支并解决合并冲突。
  2. 备份本地主分支,克隆一个新的主分支副本,然后将我的更改合并到主分支上。

我想知道是否有更好的方法来处理这种情况。


9
第一个场景无疑是首选,我可以说是唯一的选择。 - user3159253
你对它有什么具体的问题吗? - user3159253
1
我建议每次想要添加新功能时创建一个新的分支。然后,当你的分支准备合并到主分支时,首先从源拉取最新版本。这样更加清晰,你不必在执行拉取操作时处理合并冲突。 - Biniou
更好的方式是什么?你目前的问题是什么,你希望它有何不同?仅仅询问“更好的方法”是基于个人意见的,并且略微偏离主题。 - k0pernikus
@user3159253,没有具体的问题。这是我在工作中遇到的一些事情,只是想了解是否有其他方法可以合并两个人的更改。 - Asim Mahar
@k0pernikus,你说得对。我猜这可能是基于个人观点的。但是,出于学习的目的,我主要想知道是否有其他方法或者我列出的方法是否被业界所接受。 - Asim Mahar
5个回答

56

如果远程分支和本地分支都有不同的更改,我不会只使用 git pull 来拉取主分支,而是会采取以下方式:

git pull --rebase

我甚至在我的默认配置中设置了它,以便在git pull时始终进行必要的变基:

git config --global pull.rebase true

重新基于一个分支避免了合并提交,使你的更改保持在当前远程分支之上。

然而,当不同人在同一分支上工作时,你仍然必须解决任何发生的合并冲突,这是一种不好的做法,特别是因为它会导致冲突。

(另外要注意,在重新基于分支的范围内,“theirs”和“ours”的含义是相反的。)

在少量更改的情况下,你的更改只是被应用在最前面。

你正在改变历史记录,但只是你本地的历史记录,而不是远程的历史记录。

你不需要使用git push --force,只需像平常一样使用git push即可。

通常应该在功能分支上进行工作,并将其合并回主分支。

在功能分支上工作时,也可以通过以下方式使功能分支靠近master

git checkout feature-branch
git fetch && git rebase origin/master

然而,如果有多人在同一特性分支上工作,那么在此需要使用git push --force命令,因此应该小心使用此策略。

如果想要使用变基和强制推送,请考虑使用git push --force-with-lease而不是git push --force,因为它可以防止意外删除远程库中其他人的提交。


我打算用'git pull --rebase'进行测试,因为rebase是一个新的概念。谢谢。 - Asim Mahar
@AsimMahar Rebase 是 Git 中最强大的功能之一,我经常使用它,但也是一个让自己陷入困境的好方法。因此,请确保理解使用它的含义。 - k0pernikus
@k0pernikus,我遇到了与OP相同的情况,找到了你的答案,尝试了“git pull --rebase”,但它显示“错误:无法使用rebase拉取:您有未暂存的更改。请提交或隐藏它们。”我做错了什么?提前感谢。 - lucifer63
@lucifer63 请单独提出跟进问题,不要在评论中提问。您可以在那里链接此答案,并在此处留下评论链接到您的问题。话虽如此:帮助文本已经提供了您的解决方案:要么提交当前未添加和未提交(也称为未暂存)的更改,要么运行stash git stash && git pull --rebase && git stash apply - k0pernikus
@user1271772 或更通用:https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase - k0pernikus
显示剩余2条评论

8

一种不需要分支或者stash的简单处理方法:

  1. 在本地暂存/提交你的修改
  2. 拉取远程代码
  3. 此时,如果有合并冲突,git会通知你。如果git无法自动解决合并冲突,它将打开两个版本的文件,使用你设置为默认合并编辑器的工具进行合并。我推荐使用BeyondCompare。
  4. 提交你的合并,将你的合并和提交推送到远程主分支

如何在解决冲突后,在Github桌面版提交时添加自定义提交信息? - Charles

5

从我的经验来看,最好的方式是:

  1. 在开发新功能时,从主分支克隆一个新分支。始终保持分支与主分支同步更新。
  2. 在编写并提交你的新功能到创建的分支后,测试你的应用程序。
  3. 然后将主分支合并到工作分支中,如果主分支中有新的提交,可能会出现合并冲突。解决冲突后再次测试。
  4. 如果一切正常,则将你的分支合并到主分支中。

这样,当需要部署时,你就能够开发许多新功能并只合并那些可运行的功能。祝你好运!查看这个链接获取更多信息 -> https://www.codeschool.com/courses/try-git


2

我认为Git同步是很好的。Git同步会提交您的更改,拉取主分支中已有的任何更改,然后将所有更改一起推送到主分支。


0
如果你们两个人在同一个文件上工作,那么不可避免地会出现冲突。你需要学习如何解决冲突。
如果你想避免解决冲突,那么也许你们应该彼此委派任务,这些任务涉及在不同的文件上工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接