Git로 한 번 더 합쳐볼게요.

4185 단어 Gittech

병합 해제


지트로 구성관리를 하고 합병은 했지만 나중에 취소하려고 할 때도 있다.이 경우 병합된 제출을 지정하십시오
만약
$ git revert -m1 マージコミット
이라면 합병에서 포획된 변화의 적자점을 적용하여 원수를 기대 상태에 있게 한다.
예를 들어 합병 후의 변경에 문제가 있어 잠시 취소한 후에 발표하는 경우 리베이트를 이용하여 합병을 취소할 수 있다.

재결합 취소된 결합


합병을 취소한 후 변경에 문제가 있다는 것을 깨닫는 것은 잘못된 인식이다. 다시 얻으려는 상황이나 변경 내용의 전부에 문제가 있는 것이 아니라 추가로 수정하고 다시 얻으려는 상황에 대해 고려한다.
목표 제출git merge을 지정해도 취소된 합병을 다시 적용할 수 없습니다.
$ git merge --no-ff マージコミット^2
Already up to date.
여기マージコミット^2는 합병하여 제출한 두 번째 아버지다.첫 번째 부모는 합병 전 HEAD, 두 번째 부모는 합병 후 제출한 대상의 제출이다.
더 이상 적용할 수 없는 이유는요.
$ git merge-base --is-ancestor マージコミット^2 HEAD
$ echo $?
0
에서 알 수 있듯이 역사 기록에 이미 이 제출이 포함되어 있다.
Giit는 DAG(Directed Acyclic Graph, 비순환 그래프)에 제출된 역사를 유지하고 같은 제출 대상이 다시 역사 기록(DAG의'A', 즉'Acyclic'의 제약)에 들어가는 것을 허용하지 않는다.
그럼 어떻게 하면 좋을까요?취소된 병합을 다시 적용하려면 취소를 취소할 수 있습니다.
$ git revert リバートコミット
따라서 정렬 트리는 응용 합병 제출 상태에 있습니다.

취소로 인해 해결할 수 없는 상황


위에 적힌 리베이트는 일반적으로 리베이트가 있지만 해결할 수 없는 경우도 있다.예컨대
  • 피쳐 브랜치를 통해 경쟁하는 두 가지 변경 사항인 A, B.
  • A 선합병
  • 이어서 B를 합병한다.병합 시 충돌 제거
  • A를 말아서 B의 상태에만 적용하고 싶습니다
  • 상황자세히 봐봐.
    보통git revert -m1 Aのマージコミット이지만 이렇게 되면 충돌을 다시 없애야 한다.B를 먼저 합병하면 충돌을 해소할 필요가 없는데 방법이 없나요.일단 쌍방의 합병을 취소합시다.
    $ git revert -m1 Bのマージコミット
    $ git revert -m1 Aのマージコミット
    
    는 두 개의 합병이 취소되었다.여기서 B 를 다시 적용해보자면.
    $ git merge --no-ff Bのマージコミット^2
    Already up to date.
    
    여전히 적용되지 않습니다.Acyclic의 제약이 여기서도 나타났다.

    다시 적용하기


    재적용을 위해서는 대상의 제출을 재제작할 필요가 있다.다시 적용하고 싶은 제출 프로그램 하나 또는 두 개git cherry-pick가 있으면 순서대로 적용할 수 있다.cherry-pick는 각자 제출한 차점을 적용해 제출 자체가 재실행되기 때문에 에이치클릭의 제약을 피했다.
    순서대로 적용하는 게 번거롭거나 제출이 너무 많아 하나하나 할 수 없다면git rebase 다시 지점을 만들어 제출한 뒤 통합하면 된다.
    $ git checkout -b branch-for-rebase-B Bのマージコミット^2
    Switched to a new branch 'branch-for-rebase-B'
    $ git rebase -f $(git merge-base Bのマージコミット^1 HEAD)
    Current branch branch-for-rebase-B is up to date, rebase forced.
    Successfully rebased and updated refs/heads/branch-for-rebase-B.
    $ git checkout master
    Switched to branch 'master'
    $ git merge --no-ff branch-for-rebase-B
    Merge made by the 'recursive' strategy.
    
    기준점을 이동하지 않기 위해 다시 제출하기 위해rebase에 - f 옵션을 추가합니다.

    포크를 사용할 수 있는 상황


    이전에 역사를 바꾸지 않고 통합을 다시 적용하는 방법을 설명했지만, 통합 제출을 원격으로 누르지 않거나 force push를 허용하지 않으면 다른 해답으로 사용합니다.
    $ git reset --hard -m1 Aのマージコミット^1
    $ git merge Bのマージコミット^2
    
    로 역사를 개작하는 방법에서도 충돌이 발생하지 않고 합병을 다시 적용할 수 있다.
    이 경우 브랜치 B의 피쳐 브랜치 제출은 A의 히스토리를 결합하지 않고 직접 반영될 수 있습니다.

    총결산

    git revert 합병을 취소한 후 다시 적용하고 싶은 상황을 고려했다.기릿의 제출 내역은 DAG가 표시하기 때문에 단순하게git merge 재적용할 수 없다.여기 있다
  • 역방향 제출git revert을 지정하는 방법
  • 다시 제출 후git merge 방법
  • 제약을 피하고 다시 적용할 수 있음을 설명했다.

    좋은 웹페이지 즐겨찾기