git의 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
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
사실상 해당 케이스가 가장 많이 발생.
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 브랜치에 병합된다.