git pro tips - RLidea/dev.docs GitHub Wiki
Git Notes for Professionals์๋ ํ์ด ๋ง์ผ๋ ์ฐธ๊ณ .
git config credential.helper store
ref: How can I perform a git pull
without re-entering my SSH password?
git stash
git checkout other-branch (๋ธ๋ฐ์น๋ฅผ ์์ฑํด์ผํ๋ฉด git checkout -b other-branch)
git stash pop
$ ssh-keygen
์ผ๋ก rsa ํค๋ฅผ ์์ฑํ ๋ค(์ฐธ๊ณ ), public ํค๋ฅผ github > settings > SSH keys ์ ๋ฑ๋กํด์ค๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ: ์ฐธ๊ณ ๋งํฌ
commit์ ์์ ํ๋ฉด ํด๋น commit์ key ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค. history๊ฐ ์ผ์นํ์ง ์๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฏ๋ก remote์ push
ํ๋ ค๋ฉด $ git push --force
ํน์ $ git push --force-with-lease
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๊ณต๋์์
์๊ฐ ์๋ ๊ฒฝ์ฐ ๊ธฐ์กด ์์
๋ฌผ์ ์ญ์ ํ๊ณ ์๋ก clone
ํด์ผ ํ๋ ๋ฑ์ ์ฌ๋ฌ ๋ถํธํจ์ด ์๊ธฐ๋ฏ๋ก commit์ ๋ณ๊ฒฝ์ ๋๋๋ก์ด๋ฉด ํ์ง ์๋ ํธ์ด ์ข๋ค.
$ git commit --amend --author="username <[email protected]>"
์ด ๋ ์ด๋ฉ์ผ์ < >
๋ก ๊ฐ์ธ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๋ฌ๋ค.
fatal: --author 'username [email protected]' is not 'Name <email>' and matches no existing author
--amend
๋ช
๋ น์ด๊ฐ ์คํ๋๋ฉด commit ๋ฉ์ธ์ง๋ฅผ ์์ ํ ์ ์๋ ํ๋ฉด์ด ํ์๋๋ค. :wq
๋ก ์ ์ฅ ํ ์ข
๋ฃํ๋ฉด commit์ author์ ๋ฉ์ธ์ง๊ฐ ์ ์์ ์ผ๋ก ๋ณ๊ฒฝ๋์์์ ํ์ธํ ์ ์๋ค.
$ git log --pretty='[%cn]%ce: %cd' // commiter ํ์ธ (cn: committer name, ce: committer email, cd: commit date)
$ git -c user.name="username" -c [email protected] commit --amend --reset-author
rebase
๋ฅผ ์ฌ์ฉํ๋ค. A -> B -> C -> D(Head)
์์๋ก commit์ด ์์ฑ๋์ด ์์ ๋, C commit์ author๋ฅผ ์์ ํ๊ณ ์ถ๋ค๋ฉด A ํน์ B commit์ key๋ฅผ ์์์ผํ๋ค. ์ฆ ์์ ํ๋ ค๋ commit๋ณด๋ค ์ด์ ์ ์์ฑ๋ commit์ base๋ก ๋ค์(re) ์ค์ , rebase ํ๋ ๊ฒ์ด๋ค.
rebase
๊ฐ ์ข
๋ฃ๋๋ฉด ์์ ํ commit ์ดํ์ ๋ชจ๋ commit๋ค์ key ๊ฐ ๋ํ ๋ณ๊ฒฝ๋๋ค. history๊ฐ ์ผ์นํ์ง ์๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฏ๋ก remote์ push
ํ๋ ค๋ฉด $ git push --force
ํน์ $ git push --force-with-lease
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๊ณต๋์์
์๊ฐ ์๋ ๊ฒฝ์ฐ ๊ธฐ์กด ์์
๋ฌผ์ ์ญ์ ํ๊ณ ์๋ก clone
ํด์ผ ํ๋ ๋ฑ์ ์ฌ๋ฌ ๋ถํธํจ์ด ์๊ธฐ๋ฏ๋ก commit์ ๋ณ๊ฒฝ์ ๋๋๋ก์ด๋ฉด ํ์ง ์๋ ํธ์ด ์ข๋ค.
$ git log // ๋ฐ๊พธ๋ ค๋ commit ์ด์ ์ ์์ฑ๋ commit์ key๋ฅผ ํ์ธ
$ git rebase --interactive [key] // git rebase -i [key]๋ ๊ฐ๋ฅ
rebase
๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด key๋ก ์ฌ์ฉํ commit ์ดํ์ ๋ชจ๋ commit(merge commit ์ ์ธ)๋ค์ด ์ฐจ๋ก๋ก ํ์๋๋ค. ๊ทธ ์ค ์์ ์ ์ํ๋ commit์ pick
์ edit
์ผ๋ก ๋ณ๊ฒฝํ๋ค.
edit 6ca128b commit message1
pick 210dd87 commit message2
pick 730fcc1 commit message3
edit 9de4e16 commit message4
...
:wq
๋ก ์ ์ฅ ํ ์ข
๋ฃํ๊ณ ์๋ ๋ช
๋ น์ด๋ฅผ ํตํด ํด๋น commit์ author๋ฅผ ๋ณ๊ฒฝํ๋ค.
$ git commit --amend --author="username <[email protected]>"
์ด ๋ ์ด๋ฉ์ผ์ < >
๋ก ๊ฐ์ธ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๋ฌ๋ค.
fatal: --author 'username [email protected]' is not 'Name <email>' and matches no existing author
--amend
๋ช
๋ น์ด๊ฐ ์คํ๋๋ฉด commit ๋ฉ์ธ์ง๋ฅผ ์์ ํ ์ ์๋ ํ๋ฉด์ด ํ์๋๋ค. :wq
๋ก ์ ์ฅ ํ ์ข
๋ฃํ๋ฉด commit์ author์ ๋ฉ์ธ์ง๊ฐ ์ ์์ ์ผ๋ก ๋ณ๊ฒฝ๋์์์ ํ์ธํ ์ ์๋ค.
$ git rebase --continue
์ดํ --continue
๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด edit
์ผ๋ก ์ค์ ํ ๋ค์ commit์ผ๋ก ์ด๋ํ๊ณ , ์์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก author๋ฅผ ์์ ํ๋ฉด ๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ์ ๋๋ง์น ๋ค --continue
๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด rebase
๊ฐ ์ข
๋ฃ๋๋ค.
$ git rebase --interactive --root
$ git rebase --interactive --rebase-merges [key]
$ git log --pretty='[%cn]%ce: %cd' // commiter ํ์ธ (cn: committer name, ce: committer email, cd: commit date)
$ git -c user.name="username" -c [email protected] commit --amend --reset-author
shell script ๋ก ํด๊ฒฐํ์. ํ๋ก์ ํธ ๋ฃจํธ์ ch.sh
๋ผ๊ณ ํ์ผ์ ๋ง๋ค๊ฒ ๋ค.
#!/bin/sh
git filter-branch -f --env-filter '
OLD_EMAIL="your@old_email.com"
CORRECT_NAME="your name"
CORRECT_EMAIL="your@new_email.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
์คํ์
$ chomod +x ch.sh
$ ./ch.sh
or
$ sh ./ch.sh
remote backup repo ๋ ๋ฏธ๋ฆฌ ๋ฑ๋กํ ๋ค ์คํํ ๊ฒ.
#!/bin/sh
git branch backup
git checkout backup
git filter-branch -f --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="your name"
CORRECT_EMAIL="[email protected]"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
git push -f backup backup:master
git checkout master
git branch -D backup
.git/info/exclude
ํ์ผ์ ์์ ํ๋ค. ์์ฑ ๋ฐฉ๋ฒ์ .gitignore
์ ๊ฐ๋ค.
example:
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
exclude-file-name
ํ์ฌ ์์ ์ดํ์ ํน์ ํ์ผ ๋ณ๊ฒฝ์ฌํญ๋ค์ ํ์ผ์ ์ ๊ฑฐํ์ง ์๊ณ ignore ์ฒ๋ฆฌํ๊ธฐ
git update-index --assume-unchanged <ํ์ผ ๊ฒฝ๋ก>
$ ssh-keygen -t rsa -b 4096 -C "[email protected]"
ํ์ผ๋ช
์ ๋ฌด์์ผ๋ก ํด๋ ๋์ง๋ง ๊ฐ ๊ณ์ ๋ง๋ค ๋ค๋ฅด๊ฒ ํด์ค์ผ ํ๋ค. ํธ์์ id_rsa_work
๋ฑ์ผ๋ก ์์๋ณด๊ธฐ ์ฝ๊ฒ ๋ง๋ค์.
์์ฑํ ํค์ ๊ถํ์ 600
์ผ๋ก ์ ์ฉํด์ค๋ค.
chmod 600 id_rsa_yourid
chmod 600 id_rsa_yourid.pub
2. ssh public key ๋ฅผ ๊ฐ๊ฐ์ github ๊ณ์ ์ ๋ฑ๋ก (๊ณต์๋ฌธ์)
๊ฐ๊ฐ์ ๊ณ์ ์์ SSH and GPG Keys๋ฉ๋ด์ ssh public key๋ฅผ ๋ฑ๋กํ๋ค
pbcopy < id_rsa_work.pub
~/.ssh/config
ํ์ผ์ (์์ผ๋ฉด ์์ฑํด์) ์์ ์ ๊ณ์ ์ ๋ฑ๋กํด์ค๋ค.
# Personal git
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_personal
# Work git
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_work
๊ทธ๋ฆฌ๊ณ ์ ๋์ํ๋์ง ํ ์คํธ
$ ssh -T [email protected]
$ ssh -T [email protected]
๋ฆฌํด์ผ๋ก ์์ ์ ์์ด๋๊ฐ ๋์จ๋ค๋ฉด ์ฑ๊ณต์ด๋ค.
~/Workspace/Company
๋๋ํ ๋ฆฌ ์์์๋ ๋ค๋ฅธ .gitconfig
ํ์ผ์ ์ฌ์ฉํ ์ ์๋ ์์ ์ด๋ค.
vi ~/.gitconfig
[user]
name = Your Name
email = [email protected]
[includeIf "gitdir:~/Workspace/Company/"]
path = ~/Workspace/Company/.gitconfig
vi ~/Workspace/Company/.gitconfig
[user]
email = [email protected]
์ด์ ํ์ํ repo ๋ฅผ ํด๋ก ํ์. ์ด๋ SSH๋ฅผ ์ฌ์ฉํ๋ฉฐ, origin url ์ด ๋ค๋ฆ์ ์ ์ํ๋ค. example:
git clone [email protected]:myCompany/myProject.git
๊ธฐ๋ณธ์ ์ผ๋ก ๊น ์ ์ ์ ์ ๋ณด๋ ์๋ ๋ช ๋ น์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค.
git config user.email <your-email>
git config user.name <your-name>
ํ์ง๋ง git-user-switch ๋ฅผ ์ด์ฉํ๋ฉด ํธ๋ฆฌํ๋ค.
npm i -g git-user-switch
ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ branch ๋ก remote branch ๋ฅผ pull ํด์จ๋ค.
remote ์ ์ด๋ค ๋ธ๋ฐ์น๋ค์ด ์๋์ง ํ์ธ
git remote show origin
ํ์ฌ ์ฌ์ฉ๋๊ณ ์๋ branch ํ์ธ
git branch -v
์ํ๋ค๋ฉด ๋ธ๋ฐ์น๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ์์ฑํ๋ค
git checkout target-branch
git checkout -b target-branch
๊ทธ๋ฆฌ๊ณ pull
git pull origin <branch name>