글이 좀 긴데 과정을 적은 것이니 

한번 따라 해 보셔도 좋습니다.


커널에서 v3.8 버전에서 시작한 branch 를 v3.9 버전에 branch 한 버전에 merge 시키는 

과정을 쭈욱 적은 것입니다.


kernel mainline 을 다운로드하고 중간 버전에서 branch 하여 최신 버전에 merge 를 해본다.


root@boggle70-P55-US3L:kernel# pwd

/staff/work/kernel

root@boggle70-P55-US3L:kernel# git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

root@boggle70-P55-US3L:kernel# cd linux-stable/

root@boggle70-P55-US3L:linux-stable# git tag

v3.8

v3.8-rc1

v3.8.9

v3.9

v3.9-rc1

v3.9-rc8

v3.9.1

v3.9.10

v3.9.11

v3.9.2

root@boggle70-P55-US3L:linux-stable# git branch

* master

root@boggle70-P55-US3L:linux-stable# 


내가 하고자 하는 작업의 순서는

1. 3.8 버전에서 AAA 로 branch

2. 3.8 branch 에서 수정 작업

3. 3.9 버전에서 BBB 로 branch

4. AAA branch 에서 BBB branch로 merge



3.8 버전으로 checkout 후 branch를 생성한다.


root@boggle70-P55-US3L:linux-stable# git branch

* master

root@boggle70-P55-US3L:linux-stable# git checkout v3.8

Checking out files: 100% (25423/25423), done.

Note: checking out 'v3.8'.


You are in 'detached HEAD' state. You can look around, make experimental

changes and commit them, and you can discard any commits you make in this

state without impacting any branches by performing another checkout.


If you want to create a new branch to retain commits you create, you may

do so (now or later) by using -b with the checkout command again. Example:


 git checkout -b new_branch_name


HEAD is now at 19f949f... Linux 3.8

root@boggle70-P55-US3L:linux-stable# git status

# Not currently on any branch.

nothing to commit (working directory clean)

root@boggle70-P55-US3L:linux-stable# git branch

* (no branch)

 master

친절하게도 checkout 을 하면 no branch 라고 안내해준다.

branch 를 따서 작업을 하라는 것이겠지.

그러니 branch 를 하나 따주자.

root@boggle70-P55-US3L:linux-stable# git branch v3.8-boggle70

root@boggle70-P55-US3L:linux-stable# git status

# Not currently on any branch.

nothing to commit (working directory clean)

root@boggle70-P55-US3L:linux-stable# git branch

* (no branch)

 master

 v3.8-boggle70


음... 현재 상태에서 새로운 브랜치를 만들때 그냥 branch 라고 하면 안되는것 같다

아직 no branc 상태이다.

아마도 그건 브랜치만 만드는 명령인것 같다... 

root@boggle70-P55-US3L:linux-stable# git checkout v3.8-boggle70

Switched to branch 'v3.8-boggle70'

root@boggle70-P55-US3L:linux-stable# git status

# On branch v3.8-boggle70

nothing to commit (working directory clean)

root@boggle70-P55-US3L:linux-stable# git branch

 master

* v3.8-boggle70

그래서 checkout 을 하니 그제서야 branch 로 이동했다.

이제 Makefile 을 고쳐보자.

분명 버전은 바뀔것이니 해당 위치를 수정하면 merge 의 필요성이 생길것이다.

  1 VERSION = 3

  2 PATCHLEVEL = 8

  3 SUBLEVEL = 70

  4 EXTRAVERSION =

  5 NAME = Unicycling Gorilla

  6 

  7 # *DOCUMENTATION*

  8 # To see a list of typical targets execute "make help"

  9 # boggle70

 10 # More info can be located in ./README

위와 같이 3라인과 9라인을 고쳤다.

3라인을 충돌이 발생할 것이고 9라인은 머지가 되어야 한다.


이 상태에서 다른 branch 로 가볼까?

root@boggle70-P55-US3L:linux-stable# git checkout master

error: Your local changes to the following files would be overwritten by checkout:

Makefile

Please, commit your changes or stash them before you can switch branches.

Aborting

로컬 파일이 수정되어 할수 없단다 커밋을 하란다.

root@boggle70-P55-US3L:linux-stable# git commit -a -m "boggle70 merge test"

[v3.8-boggle70 4bd26e5] boggle70 merge test

Committer: root <root@boggle70-P55-US3L.(none)>

Your name and email address were configured automatically based

on your username and hostname. Please check that they are accurate.

You can suppress this message by setting them explicitly:


   git config --global user.name "Your Name"

   git config --global user.email you@example.com


After doing this, you may fix the identity used for this commit with:


   git commit --amend --reset-author


1 file changed, 2 insertions(+), 1 deletion(-)


커밋을 하고 다른 버전으로 가보자.

root@boggle70-P55-US3L:linux-stable# git checkout master

Checking out files: 100% (25423/25423), done.

Switched to branch 'master'


수정된 내용은 master 의 내용으로 바뀌어져 있다.

이제 다시 나의 브랜치로 이동하자.

root@boggle70-P55-US3L:linux-stable# git branch

* master

 v3.8-boggle70

root@boggle70-P55-US3L:linux-stable# git checkout v3.8-boggle70

Checking out files: 100% (25423/25423), done.

Switched to branch 'v3.8-boggle70'

내가 아까 수정한 내용으로 바뀌어져 있다.

이제 master 의 branch 를 하나 생성하고 두개의 버전을 merge 해보자.

root@boggle70-P55-US3L:linux-stable# git checkout master

Checking out files: 100% (25423/25423), done.

Switched to branch 'master'

root@boggle70-P55-US3L:linux-stable# git branch v3.9-boggle70

root@boggle70-P55-US3L:linux-stable# git branch

* master

 v3.8-boggle70

 v3.9-boggle70


이제 3.9 버전의 boggle70 이 생겼다.

v3.8-boggle70 과 v3.9-boggle70 을 머지하여 패치된 커널에 나의 수정된 내용을

merge 하게 해보자.

root@boggle70-P55-US3L:linux-stable# git checkout v3.9-boggle70

Switched to branch 'v3.9-boggle70'

root@boggle70-P55-US3L:linux-stable# git merge v3.8-boggle70

Auto-merging Makefile

CONFLICT (content): Merge conflict in Makefile

warning: inexact rename detection was skipped due to too many files.

warning: you may want to set your merge.renamelimit variable to at least 5299 and retry the command.

Automatic merge failed; fix conflicts and then commit the result.


예상대로 자동 머지가 실패했다.

그럼... 실패한 파일을 열어보자.

root@boggle70-P55-US3L:linux-stable# vi Makefile 

  1 VERSION = 3

  2 <<<<<<< HEAD

  3 PATCHLEVEL = 13

  4 SUBLEVEL = 0

  5 =======

  6 PATCHLEVEL = 8

  7 SUBLEVEL = 70

  8 >>>>>>> v3.8-boggle70

  9 EXTRAVERSION =

 10 NAME = One Giant Leap for Frogkind

 11 

 12 # *DOCUMENTATION*

 13 # To see a list of typical targets execute "make help"

 14 # boggle70

 15 # More info can be located in ./README


예상한 대로 14라인에는 수정한 내용이 반영되어 들어왔고

77라인에 수정한 내용은 다르다고 표시되어 있다.

이제 수정해 보자.

3라인은 수정되어야 하는 것이니 놔두고 4라인의 SUBLEVEL 만 수정한다.


  1 VERSION = 3

  2 PATCHLEVEL = 13

  3 SUBLEVEL = 70

  4 EXTRAVERSION =

  5 NAME = One Giant Leap for Frogkind

  6 

  7 # *DOCUMENTATION*

  8 # To see a list of typical targets execute "make help"

  9 # boggle70


수정한 내용을 확인하고 커밋해 보자.

root@boggle70-P55-US3L:linux-stable# git status

# On branch v3.9-boggle70

# Unmerged paths:

#   (use "git add/rm <file>..." as appropriate to mark resolution)

#

# both modified:      Makefile

#

no changes added to commit (use "git add" and/or "git commit -a")

root@boggle70-P55-US3L:linux-stable# git commit -a -m "solved Makefile conflict"

[v3.9-boggle70 638f28c] solved Makefile conflict

Committer: root <root@boggle70-P55-US3L.(none)>

Your name and email address were configured automatically based

on your username and hostname. Please check that they are accurate.

You can suppress this message by setting them explicitly:


   git config --global user.name "Your Name"

   git config --global user.email you@example.com


After doing this, you may fix the identity used for this commit with:


   git commit --amend --reset-author


커밋은 되었고 다시 머지를 해보면 잘 되었다고 나온다.

root@boggle70-P55-US3L:linux-stable# git merge v3.8-boggle70

Already up-to-date.


이제 master 버전과 내 브랜치와의 다른 점을 확인해보자.

root@boggle70-P55-US3L:linux-stable# git diff master

diff --git a/Makefile b/Makefile

index b8b7f74..ae65894 100644

--- a/Makefile

+++ b/Makefile

@@ -1,11 +1,12 @@

VERSION = 3

PATCHLEVEL = 13

-SUBLEVEL = 0

+SUBLEVEL = 70

EXTRAVERSION =

NAME = One Giant Leap for Frogkind

 

# *DOCUMENTATION*

# To see a list of typical targets execute "make help"

+# boggle70

# More info can be located in ./README

# Comments in this file are targeted only to the developer, do not

# expect to learn how to build the kernel reading this file.


내가 수정한 두개의 내용이 잘 적용되어 있고 커널은 업데이트가 되었다.