다음을 통해 공유


Git 기록 간소화 이해

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Git 역사 단순화는 혼란스러운 짐승이 될 수 있습니다. 99%의 시간이 존재한다는 것을 알지 못하지만, 가끔은 Git의 어두운 구석에서 뛰어내리고 물기도 합니다. 이 문서에서는 기록 단순화의 정의와 파일 기록을 볼 때 어떻게 혼동을 일으킬 수 있는지 살펴보겠습니다.

일반적인 시나리오부터 시작해 보겠습니다.

  1. 변경 사항을 파일로 푸시한 다음 변경 사항을 기본 병합합니다.
  2. 동료 중 일부는 분기를 병합하여 기본.
  3. 잠시 후에 돌아와서 변경 내용이 누락된 것을 알 수 있습니다.
  4. 범인을 찾고, 당신은 파일 기록을보고 통지 이동 ... 변경 내용이 나열되지 않습니다!?

Git 커밋 기록은 트리입니다. 시간순 기록이 실제 파일 트리 기록과 동일하지 않은 경우도 있습니다. 이 상황은 병합 커밋이 파일을 원래 상태로 되돌리기 때 가장 자주 발생합니다. 이 경우 기술적으로 파일이 변경되지 않았기 때문에 기본 기록 보기 에 모든 변경 내용이 실제로 표시되지는 않습니다. 이 시나리오에서 Git은 기록을 간소화할 수 있으며 가장 가능성이 큰 "변경 내용"이 로그에서 제거된다는 것을 인식합니다.

당신이 전에 그것을 실행하지 않는 한, 당신은 좌절 될 수 있습니다, 도대체 내 변화가 어디로 갔는지 궁금해 ?

기록 단순화: 기본적으로 켜기

기본적으로 파일 git log file.txt 에서 로그 명령을 실행하면 기록이 자동으로 간소화되고 출력에서 일부 커밋이 숨어질 수 있습니다. 자세한 내용은 git 로그 맨 페이지를 참조 하세요.

혼동을 더하는 것은 단순히 실행하는 git log경우 기록 단순화가 발생하지 않는다는 것입니다. 모든 변경 내용을 보고 있으므로 단순화할 것이 없기 때문입니다.

기록 단순화를 해제하려면 명령줄 스위치 --full-history를 사용해야 합니다.

기록 단순화의 예

단순화가 어떻게 작동하는지 더 잘 이해하기 위해, 우리는 역사 단순화의 우리 자신의 예를 만듭니다. 먼저 만들 기록 다이어그램을 살펴보겠습니다.

Git 분기

여기서 볼 수 있듯이 다음을 수행합니다.

  1. 파일을 만듭니다.
  2. 분기(동물)의 해당 파일에 줄을 추가합니다.
  3. 다른 분기(과일)의 해당 파일에 다른 줄을 추가합니다.
  4. 분기 동물을 다시 기본 병합합니다.
  5. 분기 과일을 다시 기본 병합하고 과일 분기에서 파일의 전체 복사본을 선택합니다.
  6. 파일의 기록을 확인합니다.

Git은 우리에게 역사를 단순화할 것입니다. 여기서는 5단계가 핵심입니다. 우리는 동물 분기의 모든 변화를 무시했습니다. Git은 파일이 기본적으로 1단계와 5단계 사이에 변경되지 않았기 때문에 두 개의 기록 항목만 표시 합니다.

먼저 파일을 만들고 리포지토리에 추가합니다.

> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"

이제 동물 분기의 파일에 "당나귀" 텍스트를 추가하기로 결정했습니다.

> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"

실험하는 동안 파일에서 과일을 대신 사용하려고 하므로 다른 분기를 만들고 파일 끝에 "바나나"라는 텍스트를 추가합니다.

> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"

우리의 변화에 만족하는 느낌, 우리는 기본 다시 우리의 동물 분기를 병합하기로 결정 :

> git checkout main
> git merge animals

이제 파일에 대한 로그를 test.txt 살펴보겠습니다.

> git log test.txt
    
    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

지금까지 좋은, 오른쪽? 로그 출력에서 일반적인 항목은 없습니다. 이제 마음을 바꾸고 과일 가지를 병합하기로 결정했다고 가정해 보겠습니다.

>git merge fruit
    
    Auto-merging test.txt
    CONFLICT (content): Merge conflict in test.txt
    Automatic merge failed; fix conflicts and then commit the result.

어- 오, 병합 충돌. 몇 가지 고려 후 과일 분기의 전체 test.txt 파일을 사용하기로 결정했습니다. 일반적으로 일종의 텍스트 편집기 또는 병합 도구를 사용하지만, 두 줄에 불과하므로 전체 파일만 다시 만듭니다.

> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"

이제 파일의 기록을 test.txt 살펴보겠습니다.

> git log test.txt
    
    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

물론 로그의 첫 번째 실험에서 변경된 내용이 표시되지 않으며 병합도 표시되지 않습니다. 그들은 여전히 거기에 있습니까? Git에서 변경 내용을 완전히 제거했나요?

> git log --full-history test.txt

볼 수 있듯이 플래그 없이 full-history 로그를 간소화했지만 Git은 모든 변경 내용을 유지했습니다.

> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
    Merge: 6b33d99 fdd4dfd
        Date:   Mon Feb 15 10:59:34 2016 -0500

        Fixed merge conflict

    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Git 기록 단순화 요약

역사 단순화에 대한 것은 대부분의 경우 당신이 그것을 눈치 채지 못할 것이라는 것입니다. 그러나 병합 충돌 잘못되고 무슨 일이 일어났는지 알고 싶을 때 git 로그 기록을 보고 변경 내용이 어디로 갔는지 궁금할 수 있습니다.

이제 당황하는 대신 다음을 알 수 있습니다.

  • 파일에 대한 기록 간소화는 기본적으로 설정되어 있습니다.
  • 플래그는 --full-history 보다 포괄적인 파일 기록을 제공합니다.

업데이트: 이 문서를 작성한 이후 Azure DevOps Services는 웹에서 다양한 멋진 기록 보기 옵션을 도입했습니다. 즉, 명령줄을 통해 로깅하지 않으려면 탐색기에서 기록을 보려는 파일을 끌어올 수 있으며 단순 또는 단순하지 않은 기록 보기를 지정할 수 있는 아래 기록 필터가 표시됩니다.

Git 필터

(c) 2016 Microsoft Corporation. All rights reserved. 이 문서는 "있는 그대로" 제공됩니다. URL 및 기타 인터넷 웹 사이트 참조를 포함하여 이 문서에 표현된 정보 및 보기는 예고 없이 변경될 수 있습니다. 이 문서의 사용으로 발생하는 위험은 귀하의 책임입니다.

이 문서는 어떠한 Microsoft 제품에 포함된 어떠한 지적 자산에 대한 법적 권한도 귀하에게 제공하지 않습니다. 이 문서는 내부 참조용으로 복사 및 사용할 수 있습니다.