Git CLI Process Journey : to cmd_merge()
Git CLI์์ cmd_merge()๊น์ง์ ์ฌ์
Section titled โGit CLI์์ cmd_merge()๊น์ง์ ์ฌ์ โ์ฌ์ฉ์๊ฐ ํฐ๋ฏธ๋์์ git merge feat๋ฅผ ์
๋ ฅํ๋ฉด ์ด๋ป๊ฒ cmd_merge() ํจ์๊ฐ ํธ์ถ๋ ๊น์? ์ด ๊ณผ์ ์ ๋ง์น ํธ์ง๊ฐ ์ฐ์ฒด๊ตญ์ ๊ฑฐ์ณ ์ต์ข
๋ชฉ์ ์ง์ ๋๋ฌํ๋ ๊ฒ์ฒ๋ผ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค. ์ด ๋ฌธ์์์๋ ๊ทธ ์ฌ์ ์ ๋จ๊ณ๋ณ๋ก ์ถ์ ํด๋ณด๊ฒ ์ต๋๋ค.
1๋จ๊ณ: ์์คํ ์์์ Git ์คํ ํ์ผ ์ฐพ๊ธฐ
Section titled โ1๋จ๊ณ: ์์คํ ์์์ Git ์คํ ํ์ผ ์ฐพ๊ธฐโgit merge feat์ฌ์ฉ์๊ฐ ์ด ๋ช
๋ น์ ์
๋ ฅํ๋ฉด, ์ด์์ฒด์ ์ ์(bash, zsh ๋ฑ)์ ๋จผ์ git์ด๋ผ๋ ์คํ ํ์ผ์ ์ฐพ์ต๋๋ค. ์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- PATH ํ๊ฒฝ ๋ณ์ ๊ฒ์: ์์ PATH์ ๋ฑ๋ก๋ ๋๋ ํ ๋ฆฌ๋ค์ ์์๋๋ก ํ์ํฉ๋๋ค
- ์คํ ํ์ผ ๋ฐ๊ฒฌ: ๋ณดํต
/usr/bin/git๋๋/usr/local/bin/git์์ Git ์คํ ํ์ผ์ ์ฐพ์ต๋๋ค - ํ๋ก์ธ์ค ์์ฑ: ์์ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ
git๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํฉ๋๋ค
2๋จ๊ณ: Git ๋ฉ์ธ ํจ์ ์ง์
Section titled โ2๋จ๊ณ: Git ๋ฉ์ธ ํจ์ ์ง์ โGit์ ์ง์
์ ์ git.c ํ์ผ์ main() ํจ์์
๋๋ค:
int main(int argc, const char **argv){ const char *cmd; int done_help = 0;
/* ์คํ ํ์ผ ์ด๋ฆ์์ ๋ช
๋ น ์ถ์ถ * ์: git-merge๋ก ์คํ๋์๋ค๋ฉด "merge"๋ฅผ ์ถ์ถ */ cmd = argv[0]; if (!cmd) cmd = "git-help"; else { const char *slash = find_last_dir_sep(cmd); if (slash) cmd = slash + 1; }
/* Git ํ๊ฒฝ ์ด๊ธฐํ */ startup_info = &git_startup_info;
/* ๋ช
๋ นํ ์ธ์ ์ฒ๋ฆฌ */ argv++; argc--;
/* ํต์ฌ: handle_builtin() ํธ์ถ! */ handle_builtin(argc, argv);
return 0;}3๋จ๊ณ: ๋ด์ฅ ๋ช ๋ น์ด ์ฒ๋ฆฌ - handle_builtin()
Section titled โ3๋จ๊ณ: ๋ด์ฅ ๋ช ๋ น์ด ์ฒ๋ฆฌ - handle_builtin()โGit์ ๋ ๊ฐ์ง ์ข ๋ฅ์ ๋ช ๋ น์ด๋ฅผ ์ง์ํฉ๋๋ค:
- ๋ด์ฅ ๋ช ๋ น์ด(builtin): Git ๋ฐ์ด๋๋ฆฌ์ ์ง์ ํฌํจ๋ ๋ช ๋ น์ด
- ์ธ๋ถ ๋ช ๋ น์ด: ๋ณ๋์ ์คํฌ๋ฆฝํธ๋ ํ๋ก๊ทธ๋จ์ผ๋ก ๊ตฌํ๋ ๋ช ๋ น์ด
merge๋ ๋ด์ฅ ๋ช
๋ น์ด์ด๋ฏ๋ก handle_builtin() ํจ์์์ ์ฒ๋ฆฌ๋ฉ๋๋ค:
static int handle_builtin(int argc, const char **argv){ const char *cmd; struct cmd_struct *builtin;
cmd = argv[0];
/* ๋ด์ฅ ๋ช
๋ น์ด ํ
์ด๋ธ์์ "merge" ์ฐพ๊ธฐ */ builtin = get_builtin(cmd);
if (builtin) return run_builtin(builtin, argc, argv);
return 0;}4๋จ๊ณ: ๋ช ๋ น์ด ํ ์ด๋ธ - Git์ ์ ํ๋ฒํธ๋ถ
Section titled โ4๋จ๊ณ: ๋ช ๋ น์ด ํ ์ด๋ธ - Git์ ์ ํ๋ฒํธ๋ถโGit์ ๋ชจ๋ ๋ด์ฅ ๋ช ๋ น์ด๋ฅผ ํ ์ด๋ธ๋ก ๊ด๋ฆฌํฉ๋๋ค. ์ด๊ฒ์ ๋ง์น ์ ํ๋ฒํธ๋ถ์ฒ๋ผ ๋ช ๋ น์ด ์ด๋ฆ๊ณผ ์ค์ ํจ์๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค:
static struct cmd_struct commands[] = { { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE }, { "branch", cmd_branch, RUN_SETUP | DELAY_PAGER_CONFIG }, { "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE }, { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE }, { "diff", cmd_diff, NO_PARSEOPT }, { "fetch", cmd_fetch, RUN_SETUP }, { "log", cmd_log, RUN_SETUP }, { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE }, /* ์ฌ๊ธฐ! */ { "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE }, { "push", cmd_push, RUN_SETUP }, { "rebase", cmd_rebase, RUN_SETUP | NEED_WORK_TREE }, /* ... ๋ ๋ง์ ๋ช
๋ น์ด๋ค ... */};๊ฐ ํญ๋ชฉ์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ช ๋ น์ด ์ด๋ฆ: โmergeโ
- ํจ์ ํฌ์ธํฐ:
cmd_merge(์ค์ ์์ ์ ์ํํ๋ ํจ์) - ํ๋๊ทธ:
RUN_SETUP | NEED_WORK_TREE(์คํ ์กฐ๊ฑด)
ํ๋๊ทธ์ ์๋ฏธ:
RUN_SETUP: Git ์ ์ฅ์ ์ค์ ์ ๋ก๋ํด์ผ ํจNEED_WORK_TREE: ์์ ํธ๋ฆฌ๊ฐ ํ์ํจ (bare ์ ์ฅ์์์๋ ์คํ ๋ถ๊ฐ)
5๋จ๊ณ: ๋ช ๋ น์ด ์คํ ์ค๋น - run_builtin()
Section titled โ5๋จ๊ณ: ๋ช ๋ น์ด ์คํ ์ค๋น - run_builtin()โ๋ช ๋ น์ด๋ฅผ ์ฐพ์์ผ๋ ์ด์ ์คํํ ์ฐจ๋ก์ ๋๋ค. ํ์ง๋ง ๋ฐ๋ก ์คํํ์ง ์๊ณ ์ค๋น ์์ ์ ๋จผ์ ์ํํฉ๋๋ค:
static int run_builtin(struct cmd_struct *p, int argc, const char **argv){ int status; struct stat st; const char *prefix;
/* ํ๋๊ทธ์ ๋ฐ๋ฅธ ์ฌ์ ์ค๋น ์์
*/ if (p->option & RUN_SETUP) { /* Git ์ ์ฅ์์ธ์ง ํ์ธํ๊ณ ์ค์ ๋ก๋ */ prefix = setup_git_directory(); }
if (p->option & NEED_WORK_TREE) { /* ์์
ํธ๋ฆฌ๊ฐ ์๋์ง ํ์ธ */ if (!have_repository || is_bare_repository()) die(_("this operation must be run in a work tree")); }
/* ์ถ๊ฐ ํ๊ฒฝ ์ค์ */ commit_pager_choice();
/* ๋๋์ด! ์ค์ ๋ช
๋ น์ด ํจ์ ํธ์ถ */ status = p->fn(argc, argv, prefix, the_repository);
/* ์ ๋ฆฌ ์์
*/ if (status) return status;
/* ์ง์ฐ๋ ์์
๋ค ์ํ */ run_post_command_hook();
return 0;}6๋จ๊ณ: cmd_merge() ๋๋ฌ!
Section titled โ6๋จ๊ณ: cmd_merge() ๋๋ฌ!โ์ด์ ๋๋์ด builtin/merge.c์ cmd_merge() ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค:
int cmd_merge(int argc, const char **argv, const char *prefix, struct repository *repo){ /* ๋ณํฉ ์์
์์! */ // ...}ํจ์ ๋งค๊ฐ๋ณ์์ ์๋ฏธ:
argc: ์ธ์ ๊ฐ์ (์๋ ๋ช ๋ น์์ โgitโ ๋ถ๋ถ์ ์ ์ธ)argv: ์ธ์ ๋ฐฐ์ด (argv[0]์ โmergeโ, argv[1]์ โfeatureโ ๊ฐ์ ๋ณํฉ ๋์)prefix: ํ์ฌ ๋๋ ํ ๋ฆฌ์ Git ์ ์ฅ์ ๋ฃจํธ๋ก๋ถํฐ์ ์๋ ๊ฒฝ๋กrepo: ์ ์ฅ์ ์ ๋ณด๋ฅผ ๋ด์ ๊ตฌ์กฐ์ฒด
์ ์ฒด ํธ์ถ ์คํ ์์ฝ
Section titled โ์ ์ฒด ํธ์ถ ์คํ ์์ฝโ์ฌ์ฉ์๊ฐ git merge feature๋ฅผ ์
๋ ฅํ์ ๋์ ์ ์ฒด ํธ์ถ ์คํ์ ์ ๋ฆฌํ๋ฉด:
1. ์ ํ๋ก์ธ์ค โโ> 2. git (main ํจ์) โโ> 3. handle_builtin() โโ> 4. get_builtin("merge") โโ> 5. run_builtin() โโ> 6. cmd_merge()ํฅ๋ฏธ๋ก์ด ์ฌ์ค๋ค
Section titled โํฅ๋ฏธ๋ก์ด ์ฌ์ค๋คโ1. Git์ ๋ชจ๋ํ ์ค๊ณ
Section titled โ1. Git์ ๋ชจ๋ํ ์ค๊ณโGit์ ๊ฐ ๋ช ๋ น์ด๋ฅผ ๋ ๋ฆฝ์ ์ธ ํจ์๋ก ๊ตฌํํฉ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค:
- ์ ์ง๋ณด์ ์ฉ์ด์ฑ: ๊ฐ ๋ช ๋ น์ด๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์์ ๊ฐ๋ฅ
- ํ ์คํธ ๊ฐ๋ฅ์ฑ: ๊ฐ๋ณ ๋ช ๋ น์ด๋ฅผ ๋จ์ ํ ์คํธ ๊ฐ๋ฅ
- ํ์ฅ์ฑ: ์๋ก์ด ๋ช ๋ น์ด ์ถ๊ฐ๊ฐ ์ฌ์
2. ํ๋๊ทธ ์์คํ ์ ์งํ
Section titled โ2. ํ๋๊ทธ ์์คํ ์ ์งํโ๋ช ๋ น์ด๋ง๋ค ๋ค๋ฅธ ์๊ตฌ์ฌํญ์ด ์์ต๋๋ค:
git init๋ ์ ์ฅ์๊ฐ ์์ด๋ ์คํ ๊ฐ๋ฅ (RUN_SETUP ์์)git merge๋ ์์ ํธ๋ฆฌ๊ฐ ํ์ (NEED_WORK_TREE)git config๋ ์ด๋์๋ ์คํ ๊ฐ๋ฅ (ํน๋ณํ ํ๋๊ทธ ์์)
3. ์ ์ด๋ ๊ฒ ๋ณต์กํ ๊น?
Section titled โ3. ์ ์ด๋ ๊ฒ ๋ณต์กํ ๊น?โ์ด ๋ณต์กํ ๊ตฌ์กฐ๋ Git์ ์ ์ฐ์ฑ์ ์ํด ํ์ํฉ๋๋ค:
- ๋ค์ํ ์คํ ํ๊ฒฝ ์ง์: bare ์ ์ฅ์, ์ผ๋ฐ ์ ์ฅ์, ์ ์ฅ์ ์ธ๋ถ
- ์ผ๊ด๋ ์๋ฌ ์ฒ๋ฆฌ: ๋ชจ๋ ๋ช ๋ น์ด๊ฐ ๋์ผํ ๊ฒ์ฆ ๊ณผ์ ์ ๊ฑฐ์นจ
- ํ์ฅ ๊ฐ๋ฅํ ์ํคํ ์ฒ: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ๊ฐ ๊ธฐ์กด ์ฝ๋์ ๋ฏธ์น๋ ์ํฅ ์ต์ํ
์ค์ต ์ ์
Section titled โ์ค์ต ์ ์โ์ด ๊ณผ์ ์ ๋ ๊น์ด ์ดํดํ๋ ค๋ฉด:
-
GDB๋ก ์ถ์ ํ๊ธฐ:
Terminal window gdb gitbreak mainrun merge featurestep -
strace๋ก ์์คํ ์ฝ ๊ด์ฐฐ:
Terminal window strace -e trace=execve git merge feature -
Git ์์ค ์ฝ๋ ์ง์ ์์ :
cmd_merge()์์ ๋ถ๋ถ์ ๋๋ฒ๊ทธ ๋ฉ์์ง ์ถ๊ฐ- Git์ ๋ค์ ์ปดํ์ผํ๊ณ ์คํํด๋ณด๊ธฐ
์ด๋ ๊ฒ Git CLI์์ cmd_merge()๊น์ง์ ์ฌ์ ์ ๋จ์ํด ๋ณด์ด๋ ๋ช
๋ น ํ๋๊ฐ ์ค์ ๋ก๋ ์ฌ๋ฌ ๊ณ์ธต์ ์ถ์ํ์ ๊ฒ์ฆ์ ๊ฑฐ์ณ ์คํ๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ Git์ด ๋จ์ํ ๋๊ตฌ๊ฐ ์๋๋ผ ์ ๊ตํ๊ฒ ์ค๊ณ๋ ์์คํ
์์ ์๋ ค์ค๋๋ค.