강좌 & 팁
글이 좀 긴데 과정을 적은 것이니
한번 따라 해 보셔도 좋습니다.
커널에서 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.
내가 수정한 두개의 내용이 잘 적용되어 있고 커널은 업데이트가 되었다.