How to Get Your Change Into the Linux Kernel์์ ์๊ฐ์ ๋ฐ์ Git ์คํ์ผ ๊ฐ์ด๋์ ๋๋ค. Git ๊ณต์๋ฌธ์์ ์ ๋ช ํ ์ปค๋ฎค๋ํฐ์์ ๊ฒฝํํ ๊ฒ์ ์ ์ด๋จ์ต๋๋ค.
์ด ๊ฐ์ด๋๋ ์๋ ์ธ์ด๋ก ๋ฒ์ญ๋์ด ์์ต๋๋ค.
ํจ๊ป ํ๊ณ ์ถ์ผ์๋ฉด, ์์ ๋กญ๊ฒ ํ์ธ์. Fork ํ์๊ณ pull request ๋ณด๋ด์ฃผ์ธ์.
-
๊ฐ๊ฒฐํ๊ณ ์ ์ค๋ช ๋ ์ ์๋ ์ด๋ฆ์ ์ ํํ์ธ์.
# good $ git checkout -b oauth-migration # bad - ๋๋ฌด ์ ๋งคํจ $ git checkout -b login_fix
-
์ธ๋ถ ์๋น์ค(์๋ฅผ ๋ค์ด ๊นํ)์ ํฐ์ผ(ํ ์ผ)์ ํด๋นํ๋ ์ด๋ฆ๋ ๋ธ๋์น ์ด๋ฆ์ผ๋ก ์ฐ๋๋ฐ ์ข์ ์์ ์ค ํ๋์ ๋๋ค.
# GitHub issue #15 $ git checkout -b issue-15 -
๋จ์ด๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด ์ด์ํ(-) ๋ฅผ ์ฌ์ฉํ์ธ์.
-
๋ช๋ช ์ ์ฌ๋๋ค์ด ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ๋ค๋ฉด, ๊ฐ์ธ์ ๊ธฐ๋ฅ ๋ธ๋์น์ ํ ๊ธฐ๋ฅ ๋ธ๋์น๋ฅผ ๊ฐ์ง๊ณ ์์ ํ๋๋ฐ ํธ๋ฆฌ ํ ์ ์์ต๋๋ค. ์๋์ ๊ฐ์ ๋ช ๋ช ๊ท์น์ ์ฌ์ฉํด ๋ณด์ธ์.
$ git checkout -b feature-a/master # team-wide branch $ git checkout -b feature-a/maria # Maria's personal branch $ git checkout -b feature-a/nick # Nick's personal branch
ย ๊ฐ์ธ์ด ์์ ํ ๋ธ๋์น๋ ๊ณ์ํด์ ํ์ด ๊ตฌํํ๋ ๋ธ๋์น๋ก ํฉ์ณ์ง๊ณ ๋์ค์ "master"์ ํฉ์ณ์ง ๊ฒ์ ๋๋ค. (see "Merging").
-
๋ธ๋์น๊ฐ ๋จธ์ง๋ ์ดํ์๋ (๋จ๊ฒจ๋ฌ์ผ ํ ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด) ๋ฆฌํ์งํ ๋ฆฌ์์ ์ญ์ ํฉ๋๋ค.
Tip: "master"๋ธ๋์น์ ํฉ์ณ์ง ๋ธ๋์น๋ฅผ ๋ณด๋ ค๋ฉด ์๋์ ๊ฐ์ ๋ช ๋ น์ ์คํํ์ธ์.
$ git branch --merged | grep -v "\*"
-
๊ฐ๊ฐ์ ์ปค๋ฐ์ ํ๋์ ๋ ผ๋ฆฌ์ ๋ณํ๋ฅผ ๋ํ๋ด์ผ ํฉ๋๋ค. ์ฌ๋ฌ๊ฐ์ ๋ ผ๋ฆฌ์ ๋ณํ๋ฅผ ํ๋ฒ์ ์ปค๋ฐํ์ง ๋ง์ธ์. ์๋ฅผ ๋ค์ด ํ๋์ ๋ฌธ์ ์ ์ ์์ ํ๊ณ ๊ธฐ๋ฅ์ ์ฑ๋ฅ์ ํฅ์ ์์ผฐ๋ค๋ฉด, ๋ ๊ฐ์ ์ปค๋ฐ์ผ๋ก ๋ถ๋ฆฌํด์ผ ํฉ๋๋ค.
-
ํ๊ฐ์ ๋ ผ๋ฆฌ์ ๋ณํ๋ฅผ ์ฌ๋ฌ๊ฐ์ ์ปค๋ฐ์ผ๋ก ๋๋์ง ๋ง์ธ์. ์๋ฅผ ๋ค์ด ํ๋์ ๊ตฌํ๋ ๊ธฐ๋ฅ๊ณผ ๊ทธ๊ฒ์ ํ ์คํธ ์ฝ๋๋ ํ ์ปค๋ฐ์ด์ด์ผ ํฉ๋๋ค.
-
์ปค๋ฐ์ ๋นจ๋ฆฌ ๊ทธ๋ฆฌ๊ณ ์์ฃผ ํ์ธ์. ๋ ๋ฆฝ์ ์ธ ์ปค๋ฐ์ ๋ฌด์ธ๊ฐ ์๋ชป๋ฌ์๋, ์ดํดํ๊ณ ๋๋๋ฆฌ๊ธฐ ์ฝ์ต๋๋ค.
-
์ปค๋ฐ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ์์๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ปค๋ฐ X๋ ์ปค๋ฐ Y์ ๋ณํ์ ์์กดํ๋ค๋ฉด ์ปค๋ฐ Y๋ ์ปค๋ฐ X ๋ณด๋ค ๋จผ์ ์ผ์ด๋์ผ ํฉ๋๋ค.
-
์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ ๋, ํฐ๋ฏธ๋ ๋ณด๋ค๋ ์๋ํฐ๋ฅผ ์ฌ์ฉํ์ธ์.
# good $ git commit # bad $ git commit -m "Quick fix"
ํฐ๋ฏธ๋์ ํตํ ์ปค๋ฐ์ ํ์ค์ ๋ชจ๋ ๊ฒ์ ์จ์ผํ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๊ทธ๊ฒ์ ํญ์ ์ ๋ณด๊ฐ ์๊ณ , ๋ชจํธํ ์ปค๋ฐ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
-
์์ฝํ๋ ๋ฌธ์ฅ(์๋ฅผ ๋ค์ด, ๋ฉ์์ง์ ์ฒซ์ถ)์ ๊ฐ๋จ๋ช ๋ฃํ ์ค๋ช ์ด ๋์ด์ผ ํฉ๋๋ค. 50๊ธ์๋ฅผ ๋์ง ์๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค. ๋๋ฌธ์๋ก ์์ํ๋ ๋ช ๋ นํ ํ์ฌ์์ ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ปค๋ฐ์ ์ค์ง์ ์ธ ์ ๋ชฉ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ง์นจํ(์จ์ )๋ก ๋๋๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์ต๋๋ค.
# good - 50๊ธ์๋ฅผ ๋์ง์๊ณ ๋๋ฌธ์๋ก ์์ํ๋ ๋ช ๋ นํ ํ์ฌ์์ ๋ฌธ์ฅ Mark huge records as obsolete when clearing hinting faults # bad fixed ActiveModel::Errors deprecation messages failing when AR was used outside of Rails.
-
์ดํ์ ์์ธํ ์ค๋ช ์ ์ํด ์ด์ด์ง๋ ๋ฌธ์ฅ ์์ ๋น ์ค์ด ์์ผ ํฉ๋๋ค. 72๊ธ์ ์ ๋์์ ์ค๋ฐ๊ฟ์ด ๋ผ์ผํ๋ฉฐ ์ ๋ณํ๊ฐ ํ์ํ๋์ง, ์ด๋ป๊ฒ ๋ณ๊ฒฝํ๋์ง์ ๋ํ ์ค๋ช ์ด ํ์ํ๊ณ ํน์๋ ์์์ง ๋ชจ๋ฅด๋ side-effects์ ๋ํด์ ๊ธฐ์ ํด์ผ ํฉ๋๋ค.
๋ํ ๊ด๋ จ๋ ๋ฆฌ์์ค์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ( ์๋ฅผ ๋ค์ด ๋ฒ๊ทธ ํธ๋์ปค์์ ๊ด๋ จ๋ ์ด์๋ก ๋ฐ๋ก ๊ฐ๋ ๋งํฌ )
Short (50 chars or fewer) summary of changes More detailed explanatory text, if necessary. Wrap it to 72 characters. In some contexts, the first line is treated as the subject of an email and the rest of the text as the body. The blank line separating the summary from the body is critical (unless you omit the body entirely); tools like rebase can get confused if you run the two together. Further paragraphs come after blank lines. - Bullet points are okay, too - Use a hyphen or an asterisk for the bullet, followed by a single space, with blank lines in between Source http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
๊ถ๊ทน์ ์ผ๋ก, ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ ๋, ์ง๊ธ๋ถํฐ 1๋ ํ์ ์ปค๋ฐ์ ๊ฑฐ์ฌ๋ฌ ๊ฐ๋ ๋ฌด์์ด ํ์ํ์ง๋ฅผ ์๊ฐํด์ผ ํฉ๋๋ค.
-
๋ง์ฝ ์ปค๋ฐ A๊ฐ ๋ค๋ฅธ ์ปค๋ฐ B์ ์์กดํ๋ค๋ฉด, ์ปค๋ฐ A ๋ฉ์์ง์ ์์์ ์์กด์ฑ์ ์ธ๊ธํด์ผ ํฉ๋๋ค. ์ปค๋ฐ์ ์ธ๊ธํ ๋๋ ์ปค๋ฐ ํด์ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋น์ทํ๊ฒ, ์ปค๋ฐ B์์ ๋ฐ์๋ ๋ฒ๊ทธ๋ฅผ ์ปค๋ฐ A์์ ํ์๋ค๋ฉด ์ปค๋ฐ A์์ ๊ทธ๊ฒ์ ์ธ๊ธํด์ผ ํฉ๋๋ค.
-
๋ง์ฝ ๋ค๋ฅธ ์ปค๋ฐ์ ๋ฐ์ด๋ฃ์ผ๋ ค๋ฉด
--squash๋ฅผ ์ฌ์ฉํ๊ณ , ์๋๋ฅผ ํ์คํ๊ฒ ํ์ํ๊ณ ์ ํ๋ค๋ฉด--fixup์ ์ฌ์ฉํ์ธ์.$ git commit --squash f387cab2
(Tip: ๋ฆฌ๋ฒ ์ด์ค ํ ๋
--autosquash๋ฅผ ์ฌ์ฉํ์ธ์. ํ์๋ ์ปค๋ฐ์ ์๋์ผ๋ก ๋ฐ์ด ๋ฃ์ด์ง๋๋ค.)
-
๋ฐฐํฌ๋ ์ด๋ ฅ(History)๋ฅผ ์ฌ ๊ธฐ๋กํ์ง ๋ง์ธ์ ๋ฆฌํ์งํ ๋ฆฌ์ ์ด๋ ฅ์ ์ ๋๋ก ๋์ด ์์๋ ๊ฐ์น์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ผ์ด ์ค์ ๋ก ์ผ์ด๋ฌ๋๊ฐ๋ฅผ ๋งํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ฐฐํฌ๋ ์ด๋ ฅ์ ์์ ํ๋ค๋ ๊ฒ์ ํ๋ก์ ํธ์์ ์ผํ๋ ๋ชจ๋์๊ฒ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
-
๊ทธ๋ฌ๋, ์ด๋ ฅ์ ๋ค์ ๊ธฐ๋กํด๋ ๋๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋
-
์์ง ๋ฆฌ๋ทฐ๋์ง ์์๊ณ ํผ์์๋ง ๊ฐ๋ฐํ๋ ๋ธ๋์น์ธ ๊ฒฝ์ฐ.
-
๋ธ๋์น๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํ๊ณ (์๋ฅผ ๋ค์ด squash commit๊ฐ์) ๋์ค์ ๋จธ์งํ๊ธฐ ์ํด "master"๋ฅผ ๋ฆฌ๋ฒ ์ด์ค ํ๋ ๊ฒฝ์ฐ.
์ด๋ง์ ์ ๋ "master"๋ธ๋์น๋ ๋ค๋ฅธ ํน๋ณํ ๋ธ๋์น์ ์ด๋ ฅ์ ์ฌ๊ธฐ๋กํ์ง ๋ง๋ผ๋ ๊ฒ์ ๋๋ค. (์๋ฅผ ๋ค๋ฉด, ์ด์ํ๋๋ฐ ์ฌ์ฉ๋๊ฑฐ๋, CI ์๋ฒ์์ ์ฌ์ฉํ๋ )
-
-
์ด๋ ฅ์ "๊น๋"ํ๊ณ "๋จ์"ํ๊ฒ ์ ์งํ์ธ์. ๋ธ๋์น๋ฅผ "๋จธ์งํ๊ธฐ ๋ฐ๋ก ์ง์ ์"
-
์ด๋ ฅ์ด ๊ด์ต์ ๋ฐ๋ฅด๊ณ ์๋์ง, ํ์ํ์ง ์์ ํ์๋ ์๋์ง ํ์ธํ์ธ์. (squash/reorder commits, reword messages etc.)
-
๋จธ์ง๋ ๋ธ๋์น๋ฅผ ๋ฆฌ๋ฒ ์ด์ค ํ์ธ์.
[my-branch] $ git fetch [my-branch] $ git rebase origin/master # then merge์ด ๊ฒฐ๊ณผ๋ "master"๋ธ๋์น์ ๋งจ๋ค์ ์ด๋ ฅ์ ๋ถ์ฌ์ ๋งค์ฐ ๊ฐ๋จํ ์ด๋ ฅ์ ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค.
*(๋ ธํธ: ์ด๋ฌํ ์ ๋ต์ ์งง์ ๊ธฐ๊ฐ ๋์ ๋ธ๋์น๋ฅผ ์ ์งํ๋ ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค. ํํธ์ผ๋ก ๋ฆฌ๋ฒ ์ด์คํ๋ ๊ฒ๋ณด๋ค "master"๋ธ๋์น์ ๋จธ์งํ๋ ๊ฒ์ด ๋์ ๊ฒฝ์ฐ๋ ์ข ์ข ์์ต๋๋ค.
-
-
๋ง์ฝ ๋ธ๋์น์ ํ๋ ์ด์์ ์ปค๋ฐ์ด ์๋ค๋ฉด, fast-forward ๋จธ์ง๋ ํ์ง ๋ง์ธ์.
# good - ๋จธ์ง ์ปค๋ฐ์ด ๋ฐ๋์ ์ผ์ด๋ฉ๋๋ค. $ git merge --no-ff my-branch # bad $ git merge my-branch
-
๋ค์ํ workflow๋ค์ด ์กด์ฌํ๊ณ ๊ฐ๊ฐ์ด ๊ฐ์ ๊ณผ ์ฝ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ค workflow๊ฐ ํ์ฌ ์ํฉ์ ์ ํฉํ ์ง๋, ํ, ํ๋ก์ ํธ ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ ์ ์ฐจ์ ๋ฐ๋ผ ์ ํด์ ธ์ผ ํฉ๋๋ค.
์ด๋ค workflow๋ฅผ ์ ํํ๊ณ ๊ณ์ํ ์ง๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
-
๋์ผํ ๊ท์น์ ์ฌ์ฉํ์ธ์. ์ด๊ฒ์ workflow์ ์ฐ๊ด๋์์ ๋ฟ ์๋๋ผ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ๋ ๊ฒ, ๋ธ๋์น ๋ช ์ด๋ ํ๊ทธ๋ฅผ ๋ฌ๋๋ ํ์ฅํ ์ ์์ต๋๋ค. ๋ฆฌํ์งํ ๋ฆฌ ์ ์ฒด์ ๋์ผํ ๊ท์น์ ๊ฐ์ง๋ ๊ฒ์ ์ปค๋ฐ ๋ฉ์์ง ๋๋ ๋ก๊ทธ๋ฅผ ์ฐพ์ ๋, ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋๋ค.
-
ํธ์ํ๊ธฐ ์ ์ ํ ์คํธ ํ์ธ์. ์๋ฃ๋์ง ์์ ์ผ์ ํธ์ํ์ง ๋ง์ธ์.
-
๋ฆด๋ฆฌ์ฆ๋ ์ค์ํ ์ด๋ ฅ์ ๊ธฐ๋กํ๊ธฐ ์ํด annotated tags๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ์ธ์ ์ผ ๋๋ lightweight tags ์ฆ, ๋์ค ์ฐธ์กฐ๋ฅผ ์ํ ๋ถ๋งํฌ ์ปค๋ฐ ๊ฐ์๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
-
์ข ์ข ์ฑ๋ฅ ์ ์ง ์์ ์ ํตํด ๋ฆฌํ์งํ ๋ฆฌ๊ฐ ์ข์ ๋ชจ์ต์ ๊ฐ์ง๋๋ก ์ ์งํ์ธ์. ๊ทธ๊ฒ์ด ๋ก์ปฌ ๋ฆฌํ์งํ ๋ฆฌ์ด๊ฑด, ์๊ฒฉ ๋ฆฌํ์งํ ๋ฆฌ๊ฑด ๊ฐ์
์ด ๋ฌธ์๋ Creative Commons Attribution 4.0 International license๋ฅผ ๋ฐ๋ฆ ๋๋ค.
chris
