GIT(2) : merge

notepad·2023년 1월 29일
0

git

목록 보기
2/14

git의 merge 와 관련된 기능 정리

fast-foward merge

가장 기본적인 merge이며 실상황에서 쓰일일은 거의없음.
master branch 에서 새로운 branch(bugfix)를 복사생성하여 commit이 여러개 진행 되고
master branch 에는 아무런 변경사항이 없는 상황에서 bugfix branch의 변경사항을 master branch 에 merge 하는 것이
fast-foward merge 라고 보면된다.
bugfix 브랜치에서 작업후 변경사항을 master 브랜치에 병합하고 싶은경우 아래와 같이 작업.
merge 된 branch는 남아있다.
이때는 force 옵션 없이 해당 브랜치를 삭제할 수 있음.

veritas@veritas:~/git/gittest$ git status
On branch master
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git switch -c bugfix
Switched to a new branch 'bugfix'
veritas@veritas:~/git/gittest$ git status
On branch bugfix
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ vim main.py # 변경작업 수행
veritas@veritas:~/git/gittest$ git status
On branch bugfix
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   main.py

no changes added to commit (use "git add" and/or "git commit -a")
veritas@veritas:~/git/gittest$ git add main.py 
veritas@veritas:~/git/gittest$ git commit -m "bugfix on bugfix branch"
[bugfix 7e38b41] bugfix on bugfix branch
 1 file changed, 1 insertion(+), 1 deletion(-)
veritas@veritas:~/git/gittest$ git status
On branch bugfix
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git switch master
Switched to branch 'master'
veritas@veritas:~/git/gittest$ git merge bugfix
Updating b4f198d..7e38b41
Fast-forward
 main.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
veritas@veritas:~/git/gittest$ git status
On branch master
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git branch
  bugfix
  dev2
  dev3
* master
veritas@veritas:~/git/gittest$ git branch -d bugfix
Deleted branch bugfix (was 7e38b41).
veritas@veritas:~/git/gittest$ git branch
  dev2
  dev3
* master

no conflict case

master 브랜치에서 bugfix 브랜치 복사 생성
bugfix 브랜치에서 module.py 생성 및 작업
master 브랜치에서도 작업이 이루어지나 bugfix 브랜치와 conflict 될 작업은 이루지지않음.
ex : master 브랜치에서 파일을 삭제하거나 master 브랜치와 bugfix 브랜치가 같은 파일, 같은 라인을 다르게 수정하는등.

veritas@veritas:~/git/gittest$ git status
On branch master
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git switch -c bugfix
Switched to a new branch 'bugfix'
veritas@veritas:~/git/gittest$ touch module.py
veritas@veritas:~/git/gittest$ git add .
veritas@veritas:~/git/gittest$ git commit -m "no conflict case"
[bugfix 6f12fe3] no conflict case
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 module.py
veritas@veritas:~/git/gittest$ git status
On branch bugfix
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git switch master
Switched to branch 'master'
veritas@veritas:~/git/gittest$ touch main2.py 
# master 브랜치에서 작업이 이루어지긴하나 bugfix 브랜치와 conflict 일어날 소지는 없음.
veritas@veritas:~/git/gittest$ git add .
veritas@veritas:~/git/gittest$ git commit "no conflict case"
error: pathspec 'no conflict case' did not match any file(s) known to git
veritas@veritas:~/git/gittest$ git commit -m "no conflict case"
[master 33dc667] no conflict case
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 main2.py
veritas@veritas:~/git/gittest$ git status
On branch master
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git merge bugfix
Merge made by the 'ort' strategy.
 module.py | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 module.py
veritas@veritas:~/git/gittest$ git status
On branch master
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git branch
  bugfix
  dev2
  dev3
* master
veritas@veritas:~/git/gittest$ git branch -d bugfix
Deleted branch bugfix (was 6f12fe3).
veritas@veritas:~/git/gittest$ git branch
  dev2
  dev3
* master

conflict case

사실상 해당 케이스가 가장 많이 발생.
master 브랜치에서 bugfix 브랜치 복사 생성
bugfix 와 master branch 에서 main.py 의 같은 라인을 수정시 발생하는 상황.

veritas@veritas:~/git/gittest$ git status
On branch master
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git switch -c bugfix
Switched to a new branch 'bugfix'
veritas@veritas:~/git/gittest$ vim main.py # main.py 수정
veritas@veritas:~/git/gittest$ git status
On branch bugfix
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   main.py

no changes added to commit (use "git add" and/or "git commit -a")
veritas@veritas:~/git/gittest$ git add .
veritas@veritas:~/git/gittest$ git commit -m "modify on bugfix branch"
[bugfix 72ea1d9] modify on bugfix branch
 1 file changed, 1 insertion(+), 1 deletion(-)
veritas@veritas:~/git/gittest$ git status
On branch bugfix
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git switch master
Switched to branch 'master'
veritas@veritas:~/git/gittest$ vim main.py 
veritas@veritas:~/git/gittest$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   main.py

no changes added to commit (use "git add" and/or "git commit -a")
veritas@veritas:~/git/gittest$ git add .
veritas@veritas:~/git/gittest$ git commit -m "modify on master branch"
[master 14d78fd] modify on master branch
 1 file changed, 1 insertion(+), 1 deletion(-)
veritas@veritas:~/git/gittest$ git merge bugfix
Auto-merging main.py
CONFLICT (content): Merge conflict in main.py
Automatic merge failed; fix conflicts and then commit the result.

이때 master branch 의 main.py 파일이 아래와 같이 변경됨

a=1
b=2
<<<<<<< HEAD
c=5
=======
c=4
>>>>>>> bugfix

c=5 라인에서 HEAD가르키는 브랜치(여기선 master)와 bugfix 브랜치가 충돌한다는 의미.
추가된 라인을 삭제하고 원하는 방향으로 수정 및 저장.

a=1
b=2
c=4

그후 커맨드창에서 변경된 사항을 add 한후 commit 한다.
이러면 conflict 해결

veritas@veritas:~/git/gittest$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   main.py

no changes added to commit (use "git add" and/or "git commit -a")
veritas@veritas:~/git/gittest$ git add main.py
veritas@veritas:~/git/gittest$ git commit -m "resolve conflict"
[master 5d37f57] resolve conflict

GUI 상에서는 아래와 같이 bugfix 브랜치가 master 브랜치에 병합된다.

0개의 댓글