Git混淆(“更新”和“拉取”)

15

我有些疑惑如何正确使用IntelliJ的VCS选项。

我们正在处理一个Git存储库,我想了解如何尽可能少的步骤来完成以下操作:

  1. 暂存和提交(提示我输入“提交消息”)
  2. 拉取/推送和合并(自动解决发生在同一类中但不在同一行上的冲突)

事实上,如果两个不同的人在同一类中工作,有时候很明显如果这两个人没有在类的相同部分工作,则应接受合并。然而到目前为止,在这些情况下,我总是不得不指定我希望合并发生的方式。

我已经阅读了一些关于“更新”选项的内容,但我不确定我真正理解它的功能。它是否执行拉取和合并操作?


2
它的功能是:根据您选择的选项执行“stash”操作,然后执行“pull --rebase”或“pull && merge”操作。 - Stanislav Bashkyrtsev
对我来说,“stash”和“rebase”也有些陌生。当一个类的一个版本在第2行进行修改,而我的版本在第234行进行修改时,“merge”是否会自动解决问题,以便我不需要确认合并是否确实发生? - payne
1个回答

28

你提出了3个不同的问题,但我将集中回答最后一个问题(更新选项)。

首先,我想指出标题(Git confusion (“Update” and “Pull”))与您要查找的答案不匹配。 Update 不是 Git 命令 - 您所指的 update 是 IntelliJ 的 Git 集成提供的一项功能,它是更新策略 (合并或变基) 的快捷方式。

更新项目

选项

上面列出的每个选项都对应于一种更新策略:

合并

使用“合并”更新策略

git fetch
git merge
git pull

变基

使用变基更新策略

git fetch
git rebase

或者

git pull --rebase

如果你想知道合并和变基之间的区别,我建议你阅读这篇文章:合并 vs. 变基

分支默认值

使用分支默认更新策略

无论你为指定的分支设置了什么更新策略,上述内容都适用于你在.git/config配置文件中设置的分支。


至于使用Stash和Shelve,我自己从未使用过Shelve,但它似乎与git的stash相同,只是由IntelliJ而不是git管理。


注意: 要指定的话,如果你正在从远程存储库获取master分支,你需要在上面每个命令的末尾添加origin master(例如:git pull origin mastergit pull --rebase origin master)。


因此,回答你的问题,根据你选择的选项,Update将使用merge更新策略(git pullgit fetch+git merge)或rebase更新策略(git pull --rebasegit fetch+git rebase)。

参考资料


我可能忘了说明我来自“GitHub Desktop”背景。我通常习惯按几个按钮。我已经尝试过在IntelliJ中使用版本控制系统几次,但感觉与GitHub Desktop相比并没有节省多少时间。我真的只想知道如何使合并在出现易于修复的冲突时自动合并文件。现在,根据您所说的,使用“更新”>“合并”将执行“拉取”,但不会在远程存储库上推送?如何在一个操作中提交+推送+拉取+合并? - payne
@payne 在 git 中,你必须在 push 之前先进行 pull(并手动解决冲突),所以你需要执行 commitpull(如有必要解决冲突)然后再 push。这不能通过单一操作完成。 - BigHeadCreations
“手动解决冲突”这部分,有没有办法让我设置 Git,以便如果冲突在同一类的两个不同部分中,则只需合并这两个部分而无需我的干预? - payne
1
Git默认已经这样工作了。Git不知道类或结构,它只处理代码行。因此,只要对类的更改在文件的不同行上,它就会自动处理。只有当对相同行进行更改时,Git不知道该怎么做,您才需要手动解决冲突。(关于冲突,您可能会对合并策略选项感兴趣)。 - BigHeadCreations

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