ChatGPT解决这个技术问题 Extra ChatGPT

解决合并冲突后如何完成合并?

我已阅读 Git 社区手册的 Basic Branching and Merging 部分。

所以我跟随它并创建一个分支:experimental

然后我:

切换到实验分支 (git checkout experimental) 进行一堆更改 提交它 (git commit -a) 切换到 master 分支 (git checkout master) 进行一些更改并在那里提交 切换回实验性 (git checkout experimental) 合并 master 更改实验性(git merge master)有一些冲突,但在我解决它们之后,我做了'git add myfile'现在我被卡住了,我无法回到主人

当我做

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

我做到了:

$ git rebase --abort

没有正在进行的变基?

我做到了:

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

我该怎么做才能回到我的主分支?

修复冲突后,执行添加,然后尝试使用 git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts" 执行提交,结果是 fatal: cannot do a partial commit during a merge.。当然,“部分提交” 似乎没有在 git 手册页的任何地方记录或讨论。在修复后执行 git merge 会导致 Please, commit your changes before you can merge. 多么糟糕的工具...
带有显式路径的 git commit 在说明中的联机帮助页中记录为“3.通过将文件列为提交命令的参数,在这种情况下,提交将忽略索引中暂存的更改,而是记录列出文件的当前内容(Git 必须已经知道);”以及在 '- -only' 选项。我很确定合并消息是由假设您已阅读提交命令的工作原理的人编写的,并且可以识别该描述中“部分”一词的含义,如果还没有的话,那么至少一遍又一遍地仔细。@jww
那么,为什么该案例研究值得仔细阅读以理解,而联机帮助页却没有呢? @jww
好吧,使用 git 显然需要比您准备获得的更好的阅读理解能力。我可能更不确定这是 git 的错误,而不是你确定的错误。
使用 Git 2.12(2017 年第一季度),您很快就会简单地执行 git merge --continue。请参阅my answer below

K
Kitanga Nday

当合并期间发生冲突时,您必须手动完成合并提交。听起来您已经完成了前两个步骤,即编辑有冲突的文件,然后对它们运行 git add 以将它们标记为已解决。最后,您需要实际提交与 git commit 的合并。届时,您将能够再次切换分支。

快速提示:您可以使用 git commit -am "your commit message" 同时对跟踪的文件执行添加和提交操作。 (来源:@vaheeds)


如果您使用“git gui &”进行提交 - 您可能没有意识到您的分支状态不再是“合并”。跟进“git status”有助于确保您的分支状态正确。
尝试 git commit -am "your commit message" 同时执行添加和提交。
git commit 确实有效。最好使用它来为您填充默认的合并提交消息。我避免使用“git commit -am”,因为它会覆盖消息
试试 git push
我在下面的场景中遇到了这种情况->我将 X 分支与 Y 分支合并。然后我意识到我在 Y 分支中做错了,所以我修复了它,然后我“修改”了我在 Y 分支中的更改。因为修改 git 没有创建新的提交。因此,当我将 X 分支与更新的 Y 分支合并时,它产生了冲突。顺便说一句,感谢您的回答。
V
VonC

解决合并冲突后如何完成合并?

使用 Git 2.12(2017 年第一季度),您将拥有更自然的命令:

git merge --continue

如果您不想在继续/恢复合并时编辑消息:

git merge --continue --no-edit

如果 --no-edit 不起作用,正如 akselithe comments 中报告的那样,您可以执行以下操作:

# Linux
GIT_EDITOR=true git merge --continue

# Windows
cmd /V /C "set "GIT_EDITOR=true" && git merge --continue"

您可以为这些命令定义别名。

请参阅 Jeff King (peff)commit c7d227d(2016 年 12 月 15 日)。
请参阅 Chris Packham (cpackham)commit 042e290commit c261a87commit 367ff69(2016 年 12 月 14 日)。
(由 {7 合并) } 于 commit 05f6e1b,2016 年 12 月 27 日)

请参阅2.12 release notes

合并:添加 '--continue' 选项作为 'git commit' 的同义词

教 'git merge' --continue 选项,该选项允许通过完成合并来“继续”合并。解决冲突后完成合并的传统方法是使用“git commit”。现在,像 'git rebase' 和 'git cherry-pick' 这样的命令有一个 '--continue' 选项,将这样的选项添加到 'git merge' 会呈现一个一致的 UI。


我正准备发表评论,说明最近如何在 2017 年第一季度的 2.12 中添加此功能,但随后我重新阅读了您答案的第一行。难怪我在 2.10 版上找不到该选项!
我尝试了 git merge --continue 并且 Git Bash 无法将其识别为命令。但有效的是 git commit -m "Commit message"
@Mimi 好的,但是您使用的是 Git 2.12 或更高版本吗?
@VonC 你是对的,我使用的是旧版本的 Git!
这很方便,但在我不需要编辑提交消息的情况下,merge 没有 --no-edit 参数。 git commit --no-edit 工作得很好
B
Bombe

万一你在合并/变基过程中卡住了,你总是可以

git reset --hard

将您的工作恢复到上次提交的状态。这将从工作树中丢失您的更改,因此如果您在合并之前进行了本地修改,它们将在此之后消失 - 这就是为什么当您进行本地修改时不开始合并是可取的。 :)


强制性警告:git reset --hard 丢弃未提交的更改
为什么不只是 git merge --abort,它没有丢失任何东西的风险?
V
Vadim Kotov

只需git commit它。

(可选)git abort 它:
I ran into a merge conflict. How can I abort the merge?

为了让合并更轻松,安装 kdiff3 并将其配置为合并工具。说明:http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/

该页面包含此视频:https://www.youtube.com/watch?v=Cc4xPp7Iuzo


T
Timidfriendly

手动解决冲突后的下一步是:-

混帐添加。 git status (这将显示哪些命令是继续自动合并过程所必需的)[命令 git 建议,例如 git merge --continue、git cherry-pick --continue、git rebase --continue]


没有 git merge --continue
@HolaSoyEduFelizNavidad 这是不正确的。冲突后 Zie git 输出如下:- error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
有 rebase --continue,没有合并 --continue
git merge --continue,这是我正在尝试做的,结果是 error: unknown option 'continue'。我敢肯定您的答案是错误的,因为 git-merge man page 没有列出它。你使用的是什么版本的 Git?我正在使用 git version 1.8.5.2 (Apple Git-48)。我也尝试过使用 MacPorts git version 2.9.3
使用 git 2.10 进行简单合并,该命令是普通的旧 git commit
S
Sourav Prem

每当您使用命令 git merge brancha branchb 合并两个分支时,有两种可能性:

一个分支(比如说 brancha)可以通过另一个分支(比如说 branchb)通过遵循其提交历史来到达。在这种情况下,git 只需快进 head 以指向最近的分支(在这种情况下是 branchb)。 2.但是如果两个分支在某个较早的时间点发生分歧,那么 git 会创建一个新快照并添加一个指向它的新提交。因此,如果您正在合并的分支之间没有冲突,git 会顺利创建一个新的提交。

合并两个不冲突的分支后,运行 git log 以查看提交。

现在回到有趣的案例,当合并分支之间存在合并冲突时。我从页面 https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging 引用此内容

Git 没有自动创建新的合并提交。在您解决冲突时,它已暂停该过程。如果您想在合并冲突后的任何时候查看哪些文件未合并,您可以运行 git status

因此,如果存在合并冲突,您需要解决冲突,然后使用 git add filename 添加您对暂存区域所做的更改,然后使用由于冲突而被 git 暂停的命令 git commit 提交更改.我希望这能解释您的查询。也请访问上面的链接以了解详细信息。如有任何疑问,请在下面发表评论,我很乐意为您提供帮助。


R
Rohit Maurya

解决冲突的步骤:

首先“结帐”到您要从另一个分支合并的分支(BRANCH_NAME_TO_BE_MERGED)

"git checkout "MAIN_BRANCH"

然后使用命令将其与“MAIN_BRANCH”合并:

“git 合并原点/BRANCH_NAME_TO_BE_MERGED”

Auto-merging src/file1.py
CONFLICT (content): Merge conflict in src/file1.py
Auto-merging src/services/docker/filexyz.py
Auto-merging src/cache.py
Auto-merging src/props.py
CONFLICT (content): Merge conflict in src/props.py
Auto-merging src/app.py
CONFLICT (content): Merge conflict in src/app.py
Auto-merging file3
CONFLICT (content): Merge conflict in file3
Automatic merge failed; fix conflicts and then commit the result.

现在您可以看到它显示“冲突(内容)”,对于那些具有“冲突”的文件,查看您的代码并解决它们

运行 "git status" => 它会显示你需要添加哪些文件(你已经解决了):

 Unmerged paths:
      (use "git add <file>..." to mark resolution)

        both modified:   file3
        both modified:   src/app.py
        both modified:   src/props.py
        both modified:   src/utils/file1.py

解决所有冲突后,使用以下 git 命令逐个添加每个文件

git add file3
git add src/app.py
git add src/props.py
git add src/utils/file1.py

“git commit”(当你要提交时添加一些消息,如果没有,它将打开 vi 或 vim 编辑器,你需要按“esc:q!”然后按“enter”)再次运行“git status”

 On branch MAIN_BRANCH
  Your branch is ahead of 'origin/MAIN_BRANCH' by 10 commits.
  (use "git push" to publish your local commits)

7."git 推送"


如果你没有遇到任何冲突,那么在第 2 步之后,使用第 7 步直接推送到 git
H
Harry Robbins

我要明确的第一件事是分支名称只是特定提交的别名。提交是 git 的作用,当你拉,推合并等等。每个提交都有一个唯一的 ID。

当您执行 $ git merge 时,实际发生的是 git 尝试将当前分支快速转发到引用分支所在的提交(换句话说,两个分支名称都指向同一个提交。)这种情况对于 git 来说是最简单的处理,因为没有新的提交。想想大师跳到你的分支正在冷却的 lilipad 上。可以设置 --no-ff 标志,在这种情况下,无论是否存在任何代码冲突,git 都会创建一个新的提交。

在您尝试合并的两个分支之间存在代码冲突的情况下(通常是两个分支,其提交历史在过去共享一个共同提交),快进将不起作用。 git 可能仍然能够自动合并文件,只要同一行没有被冲突文件中的两个分支更改。在这种情况下,git 将为您合并冲突的文件并自动提交它们。你可以通过 $ git diff --cached 来预览 git 的表现。或者您可以将 --no-commit 标志传递给合并命令,这会将修改后的文件留在您需要添加和提交的索引中。但是您可以 $ git diff 这些文件来查看合并将更改的内容。

第三种情况是当有冲突时 git 无法自动解决。在这种情况下,您需要手动合并它们。在我看来,这最容易通过合并完成,例如 araxis merge 或 p4merge(免费)。无论哪种方式,您都必须逐个处理每个文件。如果合并似乎卡住了,请使用 $ git merge --continue 来推动它。如果它不能继续,Git 应该告诉你,如果是,为什么不能。如果你觉得你在某个时候搞砸了合并,你可以执行 $ git merge --abort,任何合并都将撤消,你可以重新开始。完成后,您合并的每个文件都将是一个需要添加和提交的修改文件。您可以使用 $ git status 验证文件的位置。如果您尚未提交合并的文件。您需要这样做才能完成合并。您必须先完成合并或中止合并,然后才能切换分支。


N
Nesha Zoric

当您尝试合并的两个分支都更改了同一文件的同一部分时,就会发生合并冲突。您可以使用 git status 生成冲突列表。

当遇到冲突行时,Git 将编辑受影响文件的内容,并使用视觉指示器标记冲突内容的两侧。

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

当您修复冲突文件并准备好合并时,您所要做的就是运行 git addgit commit 以生成合并提交。提交后,git push 对分支的更改。

参考文章:Git merge


h
hobgoblin

添加完所有文件后,下一步是“git commit”。

“git status” 将建议做什么:尚未添加的文件列在底部,一旦它们都完成,它会在顶部建议一个提交,它解释了当前分支的合并状态。


M
Morteza Malekabadi

可能已经晚了。这是因为你的 git HEAD 没有更新。这个推荐可以解决git reset HEAD


D
Dan

另一个选择也是,我尝试了 stash 并且在没有任何提交的情况下为我工作得很好

解决所有冲突后,

-> 混帐藏匿处

-> git stash apply stash@{0}

工作正常,您也可以在此之后切换到另一个分支。