git이 병합할 때 브랜치의 파일을 삭제하는 이유는 무엇입니까?

먼저 병합으로 인해 코드가 삭제되는 상황을 재현해 보겠습니다.

예는 다음과 같습니다:

1. 웨어하우스를 초기화하고 새 master.txt 파일을 생성한 후 제출합니다.

$ git init tem
Initialized empty Git repository in D:/temp/tem/.git/

$ cd tem

$ touch master.txt

$ vim master.txt

$ cat master.txt
this is master branch!

$ git commit -a -m "commit master branch"
[master (root-commit) 3e4d6ff] commit master branch
 1 file changed, 1 insertion(+)
 create mode 100644 master.txt

2. 새로운 브랜치를 개발하고, development.txt 파일을 생성한 후 제출하세요.

$ git checkout -b develop
Switched to a new branch 'develop'

$ touch develop.txt

$ vim develop.txt

$ cat develop.txt
this is develop branch!

$ git add .

$ git commit -a -m "commit develop branch"
[develop f439ba3] commit develop branch
 1 file changed, 1 insertion(+)
 create mode 100644 develop.txt

3. 브랜치 feature1을 생성하고, feature.txt라는 새 파일을 생성하여 제출합니다.

$ git checkout -b feature1
Switched to a new branch 'feature1'

$ touch feature1.txt

$ vim feature1.txt

$ git add .

$ git commit -a -m "feature1 commite"
[feature1 98e05e7] feature1 commite
 1 file changed, 1 insertion(+)
 create mode 100644 feature1.txt

4. 개발 브랜치를 병합합니다.

$ git checkout master
Switched to branch 'master'

$ ll
total 1
-rw-r--r-- 1 mydwh 197121 23 Jul 22 16:18 master.txt

$ git merge develop
Updating 3e4d6ff..f439ba3
Fast-forward
 develop.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 develop.txt

5. feature1 분기 병합

$ git merge feature1
Updating f439ba3..98e05e7
Fast-forward
 feature1.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 feature1.txt

$ ll
total 3
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:01 develop.txt
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:03 feature1.txt
-rw-r--r-- 1 mydwh 197121 23 Jul 22 16:18 master.txt

6. feature1.txt 파일을 삭제하고 제출하세요.

$ rm feature1.txt

$ ll
total 2
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:01 develop.txt
-rw-r--r-- 1 mydwh 197121 23 Jul 22 16:18 master.txt

$ git commit -a -m "delete feature1.txt,commit master branch"
[master 88cd117] delete feature1.txt,commit master branch
 1 file changed, 1 deletion(-)
 delete mode 100644 feature1.txt

7. feature1 브랜치에서 로그아웃하고 master.txt, development.txt를 삭제한 후 제출합니다.

$ git checkout feature1
Switched to branch 'feature1'

$ ll
total 3
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:01 develop.txt
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:08 feature1.txt
-rw-r--r-- 1 mydwh 197121 23 Jul 22 16:18 master.txt

$ rm master.txt develop.txt

$ ll
total 1
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:08 feature1.txt

$ git commit -a -m "delete master.txt ,develop.txt,commit feature1 branch"
[feature1 70b4ed7] delete master.txt ,develop.txt,commit feature1 branch
 2 files changed, 2 deletions(-)
 delete mode 100644 develop.txt
 delete mode 100644 master.txt

8. 마스터 분기에서 로그아웃하고 feature1 분기를 병합합니다.

$ git checkout master
Switched to branch 'master'

$ ll
total 2
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:11 develop.txt
-rw-r--r-- 1 mydwh 197121 24 Jul 22 17:11 master.txt

$ git merge feature1
Merge made by the 'ort' strategy.
 develop.txt | 1 -
 master.txt  | 1 -
 2 files changed, 2 deletions(-)
 delete mode 100644 develop.txt
 delete mode 100644 master.txt

$ ll
total 0

질문: 마지막 병합 중에 git이 병합에 실패했을 뿐만 아니라 파일도 삭제한 것을 발견했습니다. 이유는 무엇입니까?

우선, git의 병합은 수학적 컬렉션 병합입니까?

아니요. 수학에서의 병합은 집합 A에 {a, b}가 있고 집합 B에 {c}가 있는 경우 병합된 집합은 {a, b, c}입니다.

git의 병합은 소스코드 파일의 병합이 아니라 브랜치 개발자들의 바람을 담은 병합이라고 생각합니다. 이것을 이해하면 병합할 때 git이 파일을 삭제하는 이유를 더 쉽게 이해할 수 있습니다.

내 실험에서 마스터 브랜치를 회사 창업자와 비교해보면, 그는 먼저 master.txt 파일을 만들어 회사 창고에 넣어두고 직접 사용했다. 그러다가 사부는 수련회에 들어가고 싶어서 개발 프로젝트 관리자를 찾았고 회사의 원본 파일을 기반으로 개발.txt 파일을 만들어 회사 창고에 넣어 중국 공산당이 자체적으로 사용할 수 있도록 했습니다. 얼마 후, 개발도 수련회를 하고 싶어서 다른 프로젝트 매니저인 feature1을 찾았고, 그 사람은 자신이 사용할 feature1.txt 파일을 만들었습니다.

사부는 수련 중이기 때문에 회사 창고에 development.txt, feature1.txt 파일이 있다는 사실을 알지 못합니다. 마스터와 개발 병합 시 둘 다 웨어하우스에 있는 파일을 사용하겠다는 의사를 교환합니다. 합병 결과, 마스터는 웨어하우스에 development.txt 파일이 있음을 인지하고 이를 사용할 수 있게 되었다. 병합은 마스터가 development.txt 파일을 복사한다는 의미가 아니라 내가 사용할 수 있는 웨어하우스에 development.txt 파일이 있다는 것을 의미합니다.

같은 방식으로 마스터가 feature1과 병합되면 마스터는 웨어하우스에 사용할 수 있는 feature1.txt 파일이 있음을 인식합니다.

마치 회사 창업자가 나와서 두 프로젝트 매니저와 의견을 교환한 것 같습니다. 회사 창립자들은 회사의 자산이 증가했다는 사실을 발견했습니다. 3개의 파일이 되었습니다.

다음으로 마스터와 기능1이 모두 회사를 관리합니다. 마스터가 master.txt, development.txt 파일을 삭제했습니다. feature1이 feature1.txt 파일을 삭제했습니다.

여기서 git 삭제에 대한 이해가 필요하다는 점 참고하세요. 파일을 웨어하우스에 제출하는 한 항상 웨어하우스에 남아 있고, 원하는 만큼 언제든지 찾을 수 있습니다. 따라서 파일 삭제는 실제로 웨어하우스에서 삭제하는 것이 아니라 지점에서 해당 파일을 폐기하는 것으로 이해될 수 있습니다.

이때의 상황은 마스터가 웨어하우스에 있는 feature1.txt 파일만 사용하고, master.txt, development.txt는 폐기하는 상황입니다. Feature1은 master.txt 및 development.txt 파일만 사용하고 feature1.txt 파일은 삭제됩니다. 마스터가 feature1 브랜치를 병합하려고 할 때 많은 사람들은 파일 병합이라고 생각합니다. 그러면 마스터 브랜치에 master.txt 및 development.txt 파일이 없습니다. 그런 다음 feature1에 master.txt 및 development.txt를 병합합니다. 이렇게 master 브랜치에는 3개의 파일이 존재하게 됩니다. 사실은 그렇지 않습니다.. 합병은 본질적으로 feature1을 채택하려는 마스터의 의도입니다. 왜냐하면 마스터가 master.txt와 development.txt 파일을 삭제했을 때 feature1이 어떤 이의도 표명하지 않았기 때문에 git은 충돌이 없다고 생각했기 때문입니다. 마스터의 바램은 master.txt와 development.txt 파일을 버리는 것이었습니다. Git은 병합할 때 마스터입니다. 또한 feature1은 feature1.txt 파일을 더 이상 사용하지 않으며 master는 이의가 없으며 git은 충돌이 없다고 생각하고 feature1의 희망을 채택하고 병합 중에 master 분기에서 feature1.txt 파일을 삭제합니다. 병합의 최종 결과는 다음과 같습니다. 두 분기의 파일을 사용하려는 최신 의지가 결합됩니다. 즉, 병합 후 마스터 분기에 파일이 없습니다.

많은 사람들이 브랜치를 병합할 때 소스코드를 git delete로 삭제하는 것이 원칙입니다. 일단 이해하고 나면 소스 코드가 삭제될 가능성을 피할 수 있는 방법은 여러 가지가 있습니다.

추천

출처blog.csdn.net/wwwjr00/article/details/131869388