programing

핫픽스 브랜치를 기능 브랜치로 병합

i4 2023. 4. 16. 14:34
반응형

핫픽스 브랜치를 기능 브랜치로 병합

Git에서 다음과 같은 상황이 발생했다고 가정해 봅시다.

  1. 생성된 저장소:

    mkdir GitTest2
    cd GitTest2
    git init
    
  2. 마스터의 몇 가지 수정이 이루어지고 커밋됩니다.

    echo "On Master" > file
    git commit -a -m "Initial commit"
    
  3. Feature1은 마스터에서 분기되어 몇 가지 작업이 완료됩니다.

    git branch feature1
    git checkout feature1
    echo "Feature1" > featureFile
    git commit -a -m "Commit for feature1"
    
  4. 한편 마스터 코드에서 버그가 검출되어 핫픽스브런치가 확립됩니다.

    git checkout master
    git branch hotfix1
    git checkout hotfix1
    
  5. 이 버그는 핫픽스브런치에서 수정되어 마스터로 돌아갑니다(풀 요구/코드 확인 후).

    echo "Bugfix" > bugfixFile
    git commit -a -m "Bugfix Commit"
    git checkout master
    git merge --no-ff hotfix1
    
  6. 기능 1에 대한 개발은 계속됩니다.

    git checkout feature1
    

기능 브랜치에 핫픽스가 필요하다고 합시다.아마도 거기서 버그가 발생하기 때문입니다.커밋을 기능 브랜치에 복제하지 않고 이 작업을 수행하려면 어떻게 해야 합니까?

기능 구현과 무관한 두 개의 새로운 커밋이 기능 브랜치로 전송되는 것을 방지하고 싶다.pull request를 사용하는 경우 특히 중요한 것 같습니다.이러한 커밋은 모두 풀 요구에도 포함되며, 이미 (핫픽스가 마스터에 있기 때문에) 확인되어야 합니다.

는 할 수 없다git merge master --ff-only ":: " (: "Fast-forwarding, 빨리 감다, 빨리 감다.라고 말했지만 도움이 되었는지 모르겠습니다.

마스터 브런치를 기능 브런치에 결합하려면 어떻게 해야 합니까?간단:

git checkout feature1
git merge master

여기서 패스트포워드 머지를 강제하는 것은 의미가 없습니다.그것은 할 수 없기 때문입니다.기능 브랜치와 마스터 브랜치에 모두 커밋했습니다.지금은 빨리 감기가 불가능합니다.

GitFlow를 보세요.팔로우 할 수 있는 git의 분기 모델입니다만, 무의식적으로 이미 팔로우 해 버렸습니다.Git의 확장기능이기도 합니다.Git의 확장기능은 새로운 워크플로우 스텝에 명령어를 추가하는 것으로, 새로운 워크플로 스텝에서는 수동으로 작업을 수행해야 합니다.

워크플로우에서 제대로 한 일은 무엇입니까?2개의 브런치가 있으며, 기본적으로 GitFlow 모델에서는 feature1 브런치가 "develope" 브런치입니다.

마스터에서 핫픽스 분기를 생성하여 다시 병합했습니다.그리고 이제 넌 갇혔어.

GitFlow 모델은 핫픽스를 개발 브랜치에도 병합하도록 요구하는데, 이 경우 "feature1"입니다.

따라서 진정한 답은 다음과 같습니다.

git checkout feature1
git merge --no-ff hotfix1

그러면 핫픽스 내에서 이루어진 모든 변경이 기능 브랜치에 추가되지만 변경되는 것은 그뿐입니다.이러한 변경은 브랜치 내의 다른 개발 변경과 경합할 수 있지만 기능 브랜치를 마스터에 다시 병합해도 마스터 브랜치와 경합하지 않습니다.

기준 변경에 매우 주의해야 합니다.다른 리포지토리에 브랜치를 푸시하지 않은 경우 등 변경한 내용이 리포지토리에 로컬로 남아 있는 경우에만 기본을 재설정하십시오.리베이스링은 로컬 커밋을 세상에 내놓기 전에 유용한 순서로 정렬하는 데 매우 유용한 도구이지만, 나중에 리베이스하면 당신과 같은 git 초보자에게 혼란을 줄 수 있습니다.

마스터에서 브랜치를 기본 재배치할 수 있습니다.

git checkout feature1
git rebase master

발생하는 모든 충돌을 관리합니다.버그 수정(이미 마스터)이 있는 커밋에 도달하면 Git은 변경 사항이 없으며 이미 적용되었을 수도 있다고 말합니다.그런 다음 기본 재배치(이미 마스터에 있는 커밋을 건너뛰고)를 계속합니다.

git rebase --skip

" " " " "git log기능 브랜치에서는 버그 수정 커밋이 마스터 부분에 한 번만 표시됩니다.

는, Git 의 해 주세요.git rebase(https://git-scm.com/docs/git-rebase)에서 이 사용 사례에 대해 설명합니다.

================ 추가 컨텍스트에 대한 편집 ====================

이 답변은 특별히 @theomega의 질문에 대해 그의 특별한 상황을 고려하여 제공되었습니다.이 부분에 주의해 주세요.

기능 구현과 관련이 없는 기능 브랜치의 [...] 커밋을 방지하고 싶다.

그의 개인 지사를 마스터로 재배치하는 것이 바로 그 결과를 낳는 것이다.반면 마스터를 브런치에 Marge하면 브런치를 통해 작업하고 있는 기능 구현과는 무관한 커밋을 추가하는 등 특별히 하고 싶지 않은 작업을 정확하게 수행할 수 있습니다.

질문 제목을 읽고 질문의 실제 내용과 컨텍스트를 건너뛰고 상위 답변을 맹목적으로 읽으려면 해당 사용자(다른)의 사용 사례에 항상 적용된다고 가정하고 다음 사항을 자세히 설명하겠습니다.

  • 개인 지점만 기본 재배치(즉, 로컬 저장소에만 존재하고 다른 사람과 공유되지 않음)합니다.공유 브랜치를 베이스로 하면, 다른 유저가 가지고 있는 카피가 「파손」됩니다.
  • 브랜치(마스터인지 다른 브랜치인지)에서 퍼블릭 브랜치로 변경을 통합하는 경우(예를 들어 브랜치를 푸시하여 풀 요청을 열었지만 현재 마스터와 경합이 발생하고 있으며 이러한 경합을 해결하기 위해 브랜치를 갱신해야 합니다)에서 이들 변경을 통합해야 합니다(예를 들어 와).git merge master@Sven 답 @ @ @ @ @ @ @ @ @ @ 。
  • 원하는 경우 브런치를 로컬 개인 브런치로 병합할 수도 있지만 브런치에 "외부" 커밋이 발생한다는 점에 유의하십시오.

마지막으로 이 답변이 @theomega에 대한 답변이었지만 귀하의 상황에 가장 적합하지 않다는 사실에 만족하지 못하는 경우 아래에 설명을 추가하는 것은 특별히 도움이 되지 않습니다.나는 어떤 답을 선택할지 제어할 수 없다. 오직 @theomega만이 선택할 수 있다.

git merge

다음 단계를 수행할 수 있습니다.

merge 1. 지머origin/masterfeature

# step1: change branch to master, and pull to update all commits
$ git checkout master
$ git pull

# step2: change branch to target, and pull to update commits
$ git checkout feature
$ git pull

# step3: merge master to feature(⚠️ current is feature branch)
$ git merge master


. merge 2. ★★★featureorigin/master

origin/master는 입니다만,master 입니다.

$ git checkout master
$ git pull origin/master

$ git merge feature
$ git push origin/master

기사에 근거해, 다음의 작업을 실시할 필요가 있습니다.

  • 마스터의 새로운 버전을 기반으로 하는 새로운 분기를 작성하다

    git branch -b newmaster

  • 이전 기능 브랜치를 새 브랜치로 병합

    git checkout newmaster

  • 새로운 기능 브랜치에서의 경합을 해결

의 두 는 2개의 명령어로 할 수 .git checkout -b newmaster.

이렇게 하면 백머지가 필요 없기 때문에 이력이 명확해집니다.Git 베이스 변경은 필요 없기 때문에, 그렇게 주의할 필요는 없습니다.

다른 사람과 마찬가지로 답변을 덧붙입니다만, 읽고 실행하는 것이 가장 빠를지도 모릅니다.

메모: 이 경우 기본 재설정은 필요하지 않습니다.

, 내가 ★★★★★★★★★★★★★★★★★★★★★.repo1의 브런치 (2개의 브런치)master ★★★★★★★★★★★★★★★★★」dev-user.

dev-user is is is is is 、 is 、 is 、 is 、 is 、 is is is is is of of of of 。master.

, 그럼 이제 두 가지 .dev-user ★★★★★★★★★★★★★★★★★」master★★★★★★ 。

어느 순간 나는dev-usermaster.

제가 그걸 어떻게 합니까?

저장소 루트 폴더에서 먼저 이동합니다.

cd name_of_the_repository

그리고나서

git checkout master 
git pull 
git checkout dev-user
git pull
git merge master 
git push 

나는 이것이 같은 상황에 있는 다른 누군가에게 도움이 되기를 바란다.

지미의 답변은 이 과정을 대략적으로 설명한다.자세한 내용은 다음과 같습니다.

  1. 새 분기를 생성하여 전환합니다. 지사를 기반으로 .master최근의 핫픽스도 포함되어 있습니다.

    git checkout master
    git branch feature1_new
    git checkout feature1_new
    
    # Or, combined into one command:
    git checkout -b feature1_new master
    
  2. 새 분기로 전환한 후 기존 기능 분기의 변경 사항을 병합합니다.그러면 핫픽스 커밋이 중복되지 않고 커밋이 추가됩니다.

    git merge feature1
    
  3. 새 브랜치에서 기능과 마스터 브랜치 간의 경합을 해결합니다.

완료! 이제 새 분기를 사용하여 기능을 계속 개발하십시오.

다음은 마스터 분기를 현재 분기에 병합하는 데 사용할 수 있는 스크립트입니다.

이 스크립트는 다음을 수행합니다.

  • 마스터 브랜치로 전환합니다.
  • 마스터 브랜치를 꺼냅니다.
  • 현재의 브랜치로 전환합니다.
  • 마스터 분기를 현재 분기에 병합합니다.

이 코드를 배치 파일(.bat)로 저장하고 스크립트를 저장소의 임의의 위치에 배치합니다.그런 다음 클릭하여 실행하면 됩니다.

:: This batch file pulls current master and merges into current branch

@echo off

:: Option to use the batch file outside the repo and pass the repo path as an arg
set repoPath=%1
cd %repoPath%

FOR /F "tokens=*" %%g IN ('git rev-parse --abbrev-ref HEAD') do (SET currentBranch=%%g)

echo current branch is %currentBranch%
echo switching to master
git checkout master
echo.
echo pulling origin master
git pull origin master
echo.
echo switching back to %currentBranch%
git checkout %currentBranch%
echo.
echo attemting merge master into %currentBranch%
git merge master
echo.
echo script finished successfully
PAUSE

기능 브랜치에 필요한 커밋을 정확하게 끌어오기 위해 "체리픽"을 수행할 수 있습니다.

을 실행합니다.git checkout hotfix1hotfix1 브랜치에 접속합니다.그럼 다음 순서를 수행합니다.git log문제의 커밋의 SHA-1 해시(커밋을 일의로 식별하는 랜덤 문자와 숫자의 큰 시퀀스)를 취득합니다.카피합니다(또는 최초의 10 문자 정도).

그리고나서,git checkout feature1기능 브랜치로 돌아갈 수 있습니다.

그리고나서,git cherry-pick <the SHA-1 hash that you just copied>

이 커밋을 기능 브랜치로 끌어당깁니다.그 변경은 지점에 있을 것입니다.그냥 '체리픽'을 한 것입니다.그 후, 일을 재개해, 편집, 커밋, 푸시등을 마음껏 합니다.

최종적으로 하나의 브런치에서 기능 브런치(또는 그 반대)로 다른 머지를 실행하면 Git은 그 특정 커밋에서 이미 머지된 것을 인식하고 다시 머지할 필요가 없다는 것을 알고 그냥 건너뜁니다.

이러한 명령어는 반복되므로 기존 답변을 보완하여 연속적으로 실행할 수 있습니다.기능 브랜치에서는, 다음과 같이 되어 있습니다.

git checkout master && git pull && git checkout - && git merge -

또는 에일리어스로 추가합니다.

alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"

저는 피처브런치 담당으로 리팩터링을 하고 있습니다.마스터 변경 내용을 기능 브랜치에 병합합니다.나는 훨씬 뒤떨어져 있다.주의: 기능 브랜치에는 모듈이 한 곳에서 다른 곳으로 이동되어 있기 때문에 마스터 변경을 로컬로 풀하지 않습니다.아래만 풀 없이 수행할 수 없다는 것을 알게 되었습니다."이미 최신 상태"라고 쓰여 있어요.

 //below does not get the latest from remote master to my local feature branch without git pull
    git checkout master 
    git fetch 
    git checkout my-feature-branch 
    git merge master

아래는 동작합니다.git merge origin/master를 사용합니다.

 git checkout master 
    git fetch 
    git checkout my-feature-branch 
    git merge origin/master
In Eclipse -

1) 마스터 지점 체크아웃

Git Repositories ->Click on your repository -> click on Local ->double click master branch
->Click on yes for check out

2) 마스터 브랜치를 당기다

Right click on project ->click on Team -> Click on Pull

3) 기능 브랜치를 체크합니다(1 포인트에서 설명한 것과 같은 순서에 따릅니다).

4) 마스터를 기능에 통합하다

Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on merge ->Click on Local ->Click on Master ->Click on Merge.

5) 기능 브랜치의 마스터 브랜치의 모든 변경 내용이 표시됩니다.경합이 있는 경우 제거합니다.

For conflict if any exists ,follow this -
Changes mentioned as Head(<<<<<< HEAD) is your change, Changes mentioned in branch(>>>>>>> branch) is other person change, you can update file accordingly.

참고 - 충돌 파일에 대한 인덱스에 추가해야 합니다.

6)기능 브랜치로 변경을 커밋하여 푸시합니다.

Right click on project ->click on Team -> Click on commit -> Commit and Push.

또는

Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on Push Branch ->Preview ->Push

언급URL : https://stackoverflow.com/questions/16955980/git-merge-hotfix-branch-into-feature-branch

반응형