>  기사  >  개발 도구  >  Git에서 병합 충돌을 해결하는 방법

Git에서 병합 충돌을 해결하는 방법

WBOY
WBOY원래의
2022-06-24 11:30:1333544검색

git과의 병합 충돌을 해결하는 방법: 1. 충돌하는 파일을 편집하고, 파일에서 특수 기호를 삭제하고, 필요에 따라 코드를 수정합니다. 2. 지정된 파일을 준비 영역에 추가하고 지정된 분기를 git commit 명령을 사용하는 경우 파일 이름을 추가할 경우 오류가 발생합니다.

Git에서 병합 충돌을 해결하는 방법

이 문서의 운영 환경: Windows 10 시스템, Git 버전 2.30.0, Dell G3 컴퓨터.

git이 병합 충돌을 해결하는 방법

git conflicts

여러 브랜치 코드가 하나의 브랜치로 병합되면 수정이 이루어진 위치에 관계없이 동일한 파일이 두 브랜치에서 수정됩니다.

; 2개의 브랜치에서 같은 파일의 이름이 수정되는 경우에도 발생합니다.

원인

브랜치를 병합할 때 두 브랜치는 동일한 파일에서 완전히 다른 두 가지 수정 사항 세트를 갖습니다. Git은 어느 것을 사용할지 결정할 수 없습니다. 새 코드의 내용은 수동으로 결정해야 합니다.

해결책

충돌하는 파일을 편집하고, 특수 기호를 삭제하고, 어떤 콘텐츠를 사용할지 결정하세요

스테이징 영역에 추가하세요

커밋을 실행하세요. (참고: git commit 명령을 파일 이름과 함께 사용할 수 없습니다. 이때 파일명에 오류가 보고되며, 제출 성공 후 병합이 사라집니다.)

예는 다음과 같습니다.

1 충돌 발생

1.1, 트렁크 분기 코드

2개가 있습니다.

main.cpp

#include <stdio.h>
#include <string.h>

int main()
{
	char data[100] = "my branch name is master";
	int length = strlen(data);
	
	for(int i = 0; i < length; i++)
	{
		printf("%c", data[i]);
	}
	
	printf("branch master\n");
	
	return 0;
}

README.md

this is master branch

이때 Tom과 Jack은 각각 트렁크 브랜치의 코드를 뽑아서 수정했습니다.

1.2, Tom은 코드를 수정하고 병합을 위해 제출했습니다.

Tom은 브랜치 A를 생성하고 파일을 다음과 같이 수정했습니다.

main.cpp

#include <stdio.h>
#include <string.h>

int main()
{
	char data[100] = "my branch name is A";
	int length = strlen(data);
	
	for(int i = 0; i < length; i++)
	{
		printf("%c", data[i]);
	}
	
	printf("branch AAA\n");
	
	return 0;
}

README.md

this is AAA branch

코드를 제출하고 트렁크에 병합했습니다.

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/tom/kaol (A)
$ git add .

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/tom/kaol (A)
$ git commit -m "A分支代码提交"
[A ccb2626] A分支代码提交
 2 files changed, 3 insertions(+), 3 deletions(-)

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/tom/kaol (A)
$ git push origin A
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 376 bytes | 376.00 KiB/s, done.
Total 4 (delta 1), reused 3 (delta 1), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
remote: Create a pull request for &#39;A&#39; on Gitee by visiting:
remote:     https://gitee.com/lingpe/kaol/pull/new/lingpe:A...lingpe:master
To https://gitee.com/lingpe/kaol.git
 * [new branch]      A -> A

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/tom/kaol (A)
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/tom/kaol (master)
$ git merge A
Updating 40c0115..ccb2626
Fast-forward
 README.md | 2 +-
 main.cpp  | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/tom/kaol (master)
$ git push origin master
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/lingpe/kaol.git
   40c0115..ccb2626  master -> master

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/tom/kaol (master)
$

1.3, jack이 코드를 수정했습니다. 병합 제출

jack이 코드를 다음과 같이 수정했습니다

main.cpp

#include <stdio.h>
#include <string.h>

int main()
{
	char data[100] = "my branch name is B";
	int length = strlen(data);
	
	for(int i = 0; i < length; i++)
	{
		printf("%c", data[i]);
	}
	
	printf("branch BBB\n");
	
	return 0;
}

README.md

this is BBB branch

코드를 제출하고 트렁크에 병합

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B)
$ git add .

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B)
$ git commit -m "B分支代码提交"
[B bdcbe03] B分支代码提交
 2 files changed, 3 insertions(+), 3 deletions(-)

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B)
$ git push origin B
Enumerating objects: 53, done.
Counting objects: 100% (53/53), done.
Delta compression using up to 12 threads
Compressing objects: 100% (34/34), done.
Writing objects: 100% (50/50), 4.66 KiB | 2.33 MiB/s, done.
Total 50 (delta 16), reused 43 (delta 12), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
remote: Create a pull request for &#39;B&#39; on Gitee by visiting:
remote:     https://gitee.com/lingpe/kaol/pull/new/lingpe:B...lingpe:master
To https://gitee.com/lingpe/kaol.git
 * [new branch]      B -> B

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B)
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (master)
$ git merge B
Updating 40c0115..bdcbe03
Fast-forward
 README.md | 2 +-
 main.cpp  | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (master)
$

충돌이 발생했습니다.

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (master)
$ git push origin master
To https://gitee.com/lingpe/kaol.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://gitee.com/lingpe/kaol.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (master)
$

2. 충돌을 해결합니다

다음 단계는 충돌을 해결하는 방법입니다. 换 스위치를 B 브랜치로 다시 전환한 다음 메인 브랜치 코드

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B)
$ git pull origin master
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 356 bytes | 178.00 KiB/s, done.
From https://gitee.com/lingpe/kaol
 * branch            master     -> FETCH_HEAD
   40c0115..ccb2626  master     -> origin/master
Auto-merging main.cpp
CONFLICT (content): Merge conflict in main.cpp
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
E

取 如何 如何 如何 如何 如何 如何如何 如何 如何如何 如何 如何 如何 如何 如何 如何 如何 如何 如何 如何 如何 如何 어떤 파일에 충돌이 있습니다.

main.cpp 파일을 직접 열면 어떤 코드 줄이 충돌을 일으키는지 알려주는 다음 특수 문자를 볼 수 있습니다.

#include <stdio.h>
#include <string.h>

int main()
{
<<<<<<< HEAD
        char data[100] = "my branch name is B";
=======
        char data[100] = "my branch name is A";
>>>>>>> ccb26269f42245dfcbedfbf2218419c5ab7f2787
        int length = strlen(data);

        for(int i = 0; i < length; i++)
        {
                printf("%c", data[i]);
        }

<<<<<<< HEAD
        printf("branch BBB\n");
=======
        printf("branch AAA\n");
>>>>>>> ccb26269f42245dfcbedfbf2218419c5ab7f2787

        return 0;
}

파일에서 직접 충돌을 수동으로 해결하세요. 파일에서 특수 문자를 제거하고 필요에 따라 코드를 수정합니다.

#include <stdio.h>
#include <string.h>

int main()
{
        char data[100] = "my branch name is B and A";
        int length = strlen(data);

        for(int i = 0; i < length; i++)
        {
                printf("%c", data[i]);
        }

        printf("branch BBB\n");
        printf("branch AAA\n");
        return 0;
}
~

마찬가지로 README.md의 경우 충돌을 수동으로 해결하세요.

this is BBB and AAA branch

충돌 해결 후 B 브랜치에 제출

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B|MERGING)
$ git add .

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B|MERGING)
$ git commit -m "解决冲突"
[B f30e1ea] 解决冲突

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B)
$ git push origin B
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 405 bytes | 405.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/lingpe/kaol.git
   bdcbe03..f30e1ea  B -> B

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B)
$

마지막으로 B 브랜치를 트렁크에 병합하면 충돌이 발생하지 않습니다

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (B)
$ git checkout master
Switched to branch 'master'
Your branch and 'origin/master' have perged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (master)
$ git merge B
Updating bdcbe03..f30e1ea
Fast-forward
 README.md | 2 +-
 main.cpp  | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (master)
$ git push origin master
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/lingpe/kaol.git
   ccb2626..f30e1ea  master -> master

lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/jack/kaol (master)
$

이 시점에서 충돌이 성공적으로 해결되었습니다

트렁크 브랜치의 코드를 보세요

main.cpp

#include <stdio.h>
#include <string.h>

int main()
{
	char data[100] = "my branch name is B and A";
	int length = strlen(data);
	
	for(int i = 0; i < length; i++)
	{
		printf("%c", data[i]);
	}
	
	printf("branch BBB\n");
	printf("branch AAA\n");
	return 0;
}

README.md

this is BBB and AAA branch

OK

추천 학습: "

Git Tutorial

"

위 내용은 Git에서 병합 충돌을 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.