git 中没有 CVS 样式合并更改?使用 VSCode 和 Gitlens。我只想保留或忽略冲突中的更改

No CVS style merge changes in git? Using VSCode and Gitlens. I just want to keep or ignore changes in a confict

提问人:senecaTheMeek 提问时间:12/16/2021 更新时间:12/19/2021 访问量:129

问:

这感觉就像一个我应该能够找到已经回答的问题,但我似乎找不到,我想我读过的许多帖子实际上都是为了问我将要尝试解释什么。我正在使用 VSCode,如果这很重要,我有 Gitlense。

我以前是 CVS 用户。我更喜欢 git......除了合并更改。我可能被 CVS gui 或其他东西宠坏了:

当我所做的本地更改与我的 CVS 存储库中的内容不同时,我能够像 git 一样查看差异:左侧是存储库副本,右侧是我的工作副本。完全有道理。差异中的行被标记不同(我能够找到的问题),但我真正怀念的是单击更改并将其移动到工作副本或忽略它的能力。合并这些更改后,我可以签入更改的文件。

在git中,我发现的是......首先,如果我有本地更改,我无法拉取。我必须把它们藏起来,拉,然后弹出,然后是差异。我可以按照我熟悉的方式查看差异。然后,如果我看到更改,则不允许在差异工具中修改我的工作副本。我必须从差异中复制,转到我的工作副本,粘贴更改,返回差异并继续逐行滚动。

我是否缺少工具或步骤?我只想单击一个按钮并将更改移动到工作副本上。我可以先藏起来然后弹出,但每次都这样做似乎有点傻。

刚才我不得不藏匿了 20 多个文件,拉了一大堆文件,我即将完成藏匿工作,然后辞职花一天时间合并更改。有没有更简单的方法?

git visual-studio-code 简历

评论

1赞 CodeCaster 12/16/2021
听起来您有工作流程问题。谁在与您正在处理的同一分支和文件上推送冲突的更改,为什么不在单独的分支上工作?为什么 CVS 允许你查看传入的提交,然后说“不,我不需要那个”(不点击相关的文件或行),然后表现得好像这是新的事实,基本上是重写历史并忽略同事的更改?此外,您可能对配置感兴趣: 和 。然后,您的拉取将是变基和自动隐藏。git config --global pull.rebase truegit config --global rebase.autoStash true

答:

2赞 IMSoP 12/17/2021 #1

首先,CVS 和 Git 都没有一个单一的标准 GUI,因此对“点击”的引用表明部分区别不在于 CVS 和 Git 之间,而在于您使用的 GUI 工具之间。有许多用于 Git 的 GUI 以及与 IDE 的集成,其质量和复杂性各不相同。因此,对于这一部分,真正的问题可能是“如何找到更好的 Git GUI?(答案是四处寻找你喜欢的外观并尝试一下。

其次,git 更加强调提交和分支,而不是文件和更改。git 中的分支很便宜,而且每天都会创建新的分支。

因此,您描述的本地和远程更改过程通常在 git 中管理,具有多个分支,并在它们之间进行合并:

  1. 创建一个分支“feature-123”,并随时提交更改
  2. 您的同事创建了不同的分支“feature-456”。
  3. 您的同事首先完成,并将“feature-456”合并到一个共享分支中(例如“main”、“master”或“develop”)。
  4. 要获取他们的更改,您首先提交到目前为止拥有的内容,然后使用“git pull”将共享分支(“main”/“master”/“develop”)合并到您的工作分支(“feature-123”)中。
  5. 此时,您将看到两个分支之间的冲突,解决它们并提交结果

在步骤 4 中,您可能偶尔会使用“stash”而不是“commit”,但这将是例外而不是规则。

您可能还更喜欢使用“rebase”而不是“merge”,但结果是相似的。

关键的部分是,两个人很少直接投入到同一个分支。每个开发人员都提交到自己的分支,并以某种方式共享它 - 通常在一些中央服务器上使用“拉取请求”或“合并请求”,如 Github、GitLab、BitBucket 等。

0赞 Mort 12/19/2021 #2

让我给出一个更以 CVS 为中心的答案。

所有其他答案(到目前为止)都是正确的。但是,来自CVS背景,有时被告知“你做得不对”是有帮助的,而有时则不那么有帮助。

@IMSoP 对 GUI 的评论是 100% 正确的。CVS 是一个命令行工具。Git 是一个命令行工具。它们都有可用于解决冲突的 GUI。一些 GUI 类似于 CVS 或 git 或 CVS 或 git。您将需要研究最适合您的工具。meldkdiff3

你确实可以继续以你一直以来的工作方式工作。您可以编辑文件,并定期从上游和上游提交自动无缝拉入工作区,或者您有冲突需要解决。git pull

以下配置将为您进行设置。

git config pull.rebase true
git config rebase.autoStash true

如果你正在处理被编译的代码,这可能会有问题,因为你突然重新编辑了工作区中所有修改过的文件,而你的构建系统(例如 gnu make)可能会将它们视为已更改并导致重新编译。在这种情况下,您可能希望创建一个包装脚本(也许将其称为 (*))以镜像,以查找所有修改的文件、记录其时间戳、存储、拉取、弹出存储,并使用所有未从传入更改中更新的文件的旧时间戳重新修饰您的文件。touchgit-upcvs up

如需更详细的解释,我建议您阅读此 StackOverflow 答案

(*):如果你输入你的路径,它可以像任何 git 命令一样被调用为 (no dash)。Git 魔术。git-upgit up