ã¿ã€ãã«ã¯å€§ç®ã«èŠãŠãã ãã><ã
æ¬å
容ã¯å±éºãªæäœã䌎ãã®ã§ãããããèªå·±è²¬ä»»ã§ãé¡ãããŸãã
ééãããã£ããææãã ããã
ããŒã«ã«ç·š
èªåã®ããŒã«ã«ç°å¢ã ãã§éããŠããŠãä»ã®äººãžã®åœ±é¿ããªãå Žåã«æå¹ã§ãã
ãªã¢ãŒãã«ããã·ã¥ãã¡ãã£ãŠãæã¯ãä»äººãžã®åœ±é¿ãçºçããã®ã§å±éºã§ãã
ããããïŒïŒã³ãããã¡ãã»ãŒãžã«çŠæ¢ã¯ãŒãå ¥ã£ãŠãŠäººçããããæ
ã³ãããã¡ãã»ãŒãžãä¿®æ£ããã®ã¯ç°¡åã§ãã
ãã¡ã€ã«ã®è¿œå ãªãããã§ãã¡ãããŸã
$ git commit --amend
# ããšã¯èªç±ã«ã³ã¡ã³ãæžãæãããŸããã
ããããïŒïŒéããŠãŒã¶ãŒåã§ã³ããããã¡ãã£ãæ
èªå® ãšä»äºå Žã§äœæ¥ããŠããŠgit configã䜿ãåããŠãããããšäœ¿ãåãééãæããããŸãã
ããã¯Author倿Žã®ã話ã§ãã
Commiterã¯.gitconfigã.git/configã§å€æŽããŠãã ããã
HEADã®ãŠãŒã¶ãŒåorã¡ãŒã«ã¢ãã¬ã¹ãå€ãããå Žå
# user.nameãšuser.emailã®éšåãé©å®ä¿®æ£ããŠãã ãã
$ git commit --amend -m "ã³ãããã¡ãã»ãŒãž" --author="user.name <user.email>"
çµæ§åã®ã³ãããã倿Žãããå Žå
$ git rebase -i <ã³ããã>
====
# ãšãã£ã¿ãéãã®ã§ä»¥äžã®ããã«å€æŽããŠä¿å
# (倿Žå)äžããé ã«å€ãã³ãããã䞊ã¶
pick aa11bbc ã³ãããã¡ãã»ãŒãžïŒ
pick b2c3c4d ã³ãããã¡ãã»ãŒãžïŒ
pick 4e56fgh ã³ãããã¡ãã»ãŒãžïŒ
ã»ã»ã»
# (倿ŽåŸ)察象ã®ã³ããããeditã«å€æŽ
edit aa11bbc ã³ãããã¡ãã»ãŒãžïŒ
pick b2c3c4d ã³ãããã¡ãã»ãŒãžïŒ
pick 4e56fgh ã³ãããã¡ãã»ãŒãžïŒ
ã»ã»ã»
====
# ããšã¯åãããã«ä¿®æ£
$ git commit --amend -m "ã³ãããã¡ãã»ãŒãž" --author="user.name <user.email>"
# å
ã«æ»ã
$ git rebase --continue
(å±éº)æŽå²ãå®å šã«æžãæãã
ããcommitteråãç¹å®ã®å€ã®æã«ããããããŸãšããŠæžãæãã
æŽå²ãå®å
šã«ããããŸã
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
then
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
ããããïŒïŒäœèšãªãã¡ã€ã«ãã³ããããããã©ãã£ã±ignoreãããæ
åé€ã³ãããããå Žå
äœèšãªãã®ãå ¥ã£ãŠããåé€ããŠignore远èš
# ãŸãã¯ã³ãããæžã¿ã®ãã¡ã€ã«ããªããžããªããæ¶ã
$ git rm --cached <ãã¡ã€ã«å>
# ç¶ããŠgitignoreã«è¿œèš
$ echo '<ãã¡ã€ã«å>' >> .gitignore
ãããããã¡ã€ã«ãªããŠãªãã£ãããšã«ããå Žå
ãããããªãã¡ã€ã«ãªãã£ããïŒãšããç¶æ ã«ãã
# å±¥æŽããã®ã¿åé€ããïŒã¯ãŒãã³ã°ããªãŒã«ã¯æ®ãïŒ
$ git filter-branch -f --index-filter 'git rm --cached -rf --ignore-unmatch <ãã¡ã€ã«å>' HEAD
# å±¥æŽãããã¯ãŒãã³ã°ããªãŒãããåé€ãã
$ git filter-branch -f --index-filter 'git rm -rf --ignore-unmatch <ãã¡ã€ã«å>' HEAD
ããããïŒïŒãã©ã³ãåãããµãããŠãã£ã±ãªããªã»ã»ã»ãªæ
誰ã«ãèŠãããŠãªããªããã£ãããã©ã³ãåãå€ããŸããã
$ git branch -m <倿ŽåŸã®ãã©ã³ãå>
ããããïŒïŒè¡è¿·ã£ãŠãã®ã§ã³ãããèªäœãªãã«ãããæ
誰ã«ããã¬ãŠãªãïŒïŒåã蟌ãŸããŠããªãïŒå Žå
çŽåã®æŽå²ãæ¹å€ããŸããã
# çšéã«å¿ããŠïŒã€ã®ã©ããã§æŽå²ãå·»ãæ»ã
# 1.HEADã ããå
ã«æ»ã
$ git reset --soft HEAD~
# 2.HEADãšã€ã³ããã¯ã¹ãå
ã«æ»ã
$ git reset HEAD~
# 3.ïŒã€ãŸãã®ã³ããããŸã§ã€ã³ããã¯ã¹ãã¯ãŒãã³ã°ããªãŒãå«ããŠå
ã«æ»ã
$ git reset --hard HEAD~
誰ãã«ãã¬ãŠãïŒïŒåã蟌ãŸããŠãïŒå Žå
æŽå²æ¹å€ãããšã«ãªã¹ãªã®ã§æã¡æ¶ãã³ãããã§ãã®ããŸã
$ git revert <ã³ããã>
ããããïŒïŒçްããããã®ã§éå»ã®æ°ã³ãããããŸãšãããæ
rebase + squash(or fixup)ã§éå»ã®æ°ã³ãããããŸãšãã¡ãããŸãã
# HEADãå«ãéå»ã®nã³ãããåãrebase
# äŸ) git rebase -i HEAD~3
$ git rebase -i HEAD~<æ°å>
====
# ãšãã£ã¿ãéãã®ã§ä»¥äžã®ããã«å€æŽããŠä¿å
# (倿Žå)äžããé ã«å€ãã³ãããã䞊ã¶
pick aa11bbc ã³ãããã¡ãã»ãŒãžïŒ
pick b2c3c4d ã³ãããã¡ãã»ãŒãžïŒ
pick 4e56fgh ã³ãããã¡ãã»ãŒãžïŒ
ã»ã»ã»
# (倿ŽåŸ)squashãšæžããã³ãããã¯ïŒã€åã®ã³ãããã«ãŸãšãããã
pick aa11bbc ã³ãããã¡ãã»ãŒãžïŒ
squash b2c3c4d ã³ãããã¡ãã»ãŒãžïŒ
squash 4e56fgh ã³ãããã¡ãã»ãŒãžïŒ
ã»ã»ã»
====
squashã®ä»£ããã«fixupã§ããããããã®å Žåã«ã¯fixupãšæžããã³ãããã®ã³ãããã¡ãã»ãŒãžã¯åé€ãããŸã
ããããïŒïŒå€§ããããã³ããããã¹ããŒãã«åå²ãããæ
ããããïŒã§ãŸãšããã¯ãããã©ãŸãšããããã®ãåé¡ã§ãã
æ©èœè¿œå ãšãã°ãã£ãã¯ã¹ãäžç·ã«ãªã£ã¡ãã£ããšããªã©ã«äŸ¿å©ãªæ¹æ³
# ãªã¢ãŒãã«ããã·ã¥ããããšã«ã¯ãããªãããš
# ãŸãã¯HEADãšã€ã³ããã¯ã¹ãïŒã€ãŸãã«æ»ã
# ã€ãŸãã§ããã³ãããããªãã£ãããšã«ãªã£ãŠã¯ãŒãã³ã°ããªãŒã«ã®ã¿ããç¶æ³ã«ãã
$ git reset HEAD~
# äžã®ã³ãã³ãã§çްåã(=hunk)ããšã«ã€ã³ããã¯ã¹è¿œå (y)orä¿ç(n)ãéžã¶
# 现åãã§ã倧ãããªã(s)ã§ããã«åå²ïŒgit add -pã®è©³çްã¯ã°ã°ã£ãŠãïŒ
$ git add -p
# å¿
èŠãªå€æŽã®ã¿ãå
¥ã£ãç¶æ
ã§ã³ããã
$ git commit -m "ã³ãããã¡ãã»ãŒãž"
# ããšã¯é©å®äžèšãç¹°ãè¿ãã³ããããç¹°ãè¿ãã ã
ããããïŒïŒééã£ãŠéããã©ã³ãã«commitãã¡ãã£ãæ
ãã£ããmasterã«commitãã¡ãã£ããã©ãã³ãã¯å¥ãã©ã³ãã«commitããããªãæããããŸã
# ãŸãã¯ã³ããããæ®ã£ãç¶æ
ã§å¥ãã©ã³ããäœã
$ git branch other-branch
# masterã®HEADãã€ã³ããã¯ã¹ãã¯ãŒãã³ã°ããªãŒå
šãŠãïŒã€ãŸãã«æ»ã
$ git reset --hard HEAD~
# ã³ããããæ®ã£ãŠããå¥ãã©ã³ãããã§ãã¯ã¢ãŠã
$ git checkout other-branch
ããããïŒïŒãããªããã¡ã€ã«ãå šéšæ¶ãå»ãããæ
èªåçæãã¡ã€ã«ãšãèªåããã¯ã¢ãããã¡ã€ã«ãšããããªããã¡ã€ã«äžç¬ã§æ¶ãå»ãããæãããŸããã
git管ç察象ãããã§ãªãå Žåãã³ãããããŠãªã倿Žããµã¯ããšåé€ã§ããŸã
ããããã§ã¯ãªããã»ã»ã»
# ãŸãã¯å¿
èŠãªç©ã¯ãã¹ãŠaddïŒcommit
# ããããªããšå¿
èŠãªç©ãŸã§æ¶ãã¡ããã
$ git add <å¿
èŠãªãã¡ã€ã«>
$ git commit -m "ã³ãããã¡ãã»ãŒãž"
# git stashã§untrackedãªãã¡ã€ã«ãå«ããŠéé¿
$ git stash -u
# stashãããã®ãdropããŠæ¶å»
$ git stash drop
ã¡ãªã¿ã«ãªããžããªç®¡çãããŠããªããã¡ã€ã«ã ããªã以äžã§OK
# 察象ãã¡ã€ã«ã念ã®ãã確èª
$ git clean -n
# åé€å®è¡
$ git clean -f
ããããïŒïŒïŒäžæçã«äœæ¥å 容ãéé¿ããŠå¥ãã©ã³ãã§äœæ¥ãããæ
èªåã¯æªããªããã©ç·æ¥å¯Ÿå¿å
¥ã£ã¡ãããšäžæŠäœæ¥æ¢ããªããšè¡ããŸããã
ãããããããã§ã¯ãªããã
# äœæ¥äžã®å
å®¹ãæ ¹ãããéé¿
$ git stash -u
# å¥ã®ãã©ã³ããåã£ãŠå¥ã®äœæ¥ãããªã
$ git checkout -b other-branch
~äœæ¥~
$ git add <å¿
èŠãªãã¡ã€ã«>
$ git commit -m "ã³ãããã¡ãã»ãŒãž"
# å
ã®ãã©ã³ãã«æ»ã
$ git checkout origin-branch
# éé¿ããŠããäœæ¥å
容ãåãåºã
$ git stash pop
ããããïŒïŒïŒå€§äºãªå€§äºãªã³ãããããã£ããæ¶ãã¡ãã£ãæ
ããããããšãã®çŠã床No1ãgit resetã§--hardãã¡ãã£ãæãšãèµ·ãããã¡ã
ã§ãã©ããªã³ãããã§ãæ»ãããã§ã
# ãŸãã¯éå»ã®ã³ãããäžèЧãèŠã
$ git reflog
# ããããã³ããããéžæããŠåŸ©å
ããã
# äŸïŒgit reset --hard HEAD@{2}
$ git reset --hard <ã³ããã>
ããããïŒïŒïŒãã£ãããã©ã³ããåé€ãããã©å ã«æ»ãããæ
reflogãããã°å€§äžå€«ããã©ã³ãã¯åŸ©å
ã§ããŸãã
ç¡åãã©ã³ãã§ã³ãããããããšãå¥ãã©ã³ããã§ãã¯ã¢ãŠãããŠæ¶ãã¡ãã£ãå Žåãåæ§ã§ãã
ããããïŒïŒãšã»ãŒäžç·ã§ã
# ãŸãã¯éå»ã®ã³ãããäžèЧãèŠã
$ git reflog
# ããããã³ããããéžæããŠãã©ã³ããäœæã
# äŸïŒgit branch new-branch HEAD@{2}
$ git branch <ãã©ã³ãå> <ã³ããã>
ããããïŒïŒïŒã³ãããå 容ãäžéšå€æŽãããæ
ã¿ã€ããšãã¡ãã£ãšããä¿®æ£ããããšãã«ããããæã¡æ¶ãã®ããªïœãšããæã«ã¯ã³ãããèªäœãç·šéããŸããã
# 察象ã®ã³ããããæå®
$ git rebase -i <ã³ããã>
====
# ãšãã£ã¿ãéãã®ã§ä»¥äžã®ããã«å€æŽããŠä¿å
# (倿Žå)äžããé ã«å€ãã³ãããã䞊ã¶
pick aa11bbc ã³ãããã¡ãã»ãŒãžïŒ
pick b2c3c4d ã³ãããã¡ãã»ãŒãžïŒ
pick 4e56fgh ã³ãããã¡ãã»ãŒãžïŒ
ã»ã»ã»
# (倿ŽåŸ)察象ã®ã³ããããeditã«å€æŽ
edit aa11bbc ã³ãããã¡ãã»ãŒãžïŒ
pick b2c3c4d ã³ãããã¡ãã»ãŒãžïŒ
pick 4e56fgh ã³ãããã¡ãã»ãŒãžïŒ
ã»ã»ã»
====
# 察象ã®ã³ããããã¯ãŒãã³ã°ããªãŒã«å±éãããŠããã®ã§ç·šéãadd
$ git add <ãã¡ã€ã«>
# 察象ã³ãããã倿Ž
$ git commit --amend
# rebaseãå®äºããŠå
ã«ãã©ã
$ git rebase --continue
# rebaseãåãæ¶ãããå Žå
$ git rebase --abort
ããããïŒïŒïŒãã©ã³ãèåïŒrebase)ã§ã³ã³ããªã¯ããèµ·ãã£ãæ
mergeãããªãrebaseã§ãã©ã³ããèåãããå Žåãã³ã³ããªã¯ããããçŠããŸãã
# branch1ã«ããç¶æ
ã§branch2ã«èå
$ git rebase branch2
~~ ã³ã³ããªã¯ãçºç ~~
# ç¡åãã©ã³ãã«ãªã£ãŠããã®ã§èŠæ³šæ
$ git branch
* (no branch, rebasing branch2)
branch1
branch2
master
# ã³ã³ããªã¯ããé 匵ã£ãŠè§£æ¶ããŠãã ãã
# çµãã£ããaddããŠrebaseãç¶è¡
$ git add <ãã¡ã€ã«>
# 察象ã³ãããã倿Ž
$ git commit --amend
$ git rebase --continue
ããããïŒïŒïŒããŒãžãããã©ãã£ã±ãå ã«æ»ãããæ
ãããŸã§ä»è ã«åã蟌ãŸããŠããªãå Žåã§ãïŒ
# ããŒãžããã
$ git checkout <ããŒãžå
ãã©ã³ã>
$ git merge <ããŒãžå
ãã©ã³ã>
# ããŒãžããããšããã£ã±ãããã£ãŠæã£ããããããã
# ORIG_HEADãæå®ããã°ããŒãžåã«æ»ã
$ git reset --hard ORIG_HEAD
ãªã¢ãŒãç·š
ããããïŒïŒïŒãªã¢ãŒãããpullãããã³ã³ããªã¯ãããŸãã£ãã®ã§äžæŠå ã«æ»ãããæ
æŽæ°åã蟌ãã§å±±ã»ã©ã³ã³ããªã¯ãããŠããšããã£éãã»ã»ã»ãšãããæ»ããããªããŸã
ããããïŒïŒãšã»ãŒåãã§ãã
# ãªã¢ãŒãããæŽæ°ãååŸ
$ git pull origin master
# ã³ã³ããªã¯ãçºçïŒïŒ
# ãã£ã±ãpull(fetch + merge)ã®ãã¡mergeããããã
$ git reset --hard ORIG_HEAD
ããããïŒïŒïŒãªã¢ãŒãã®masterã«åŒ·å¶pushããŠãã³ãããæ
origin/masterã«push -fã¯çŠç©ã§ãã
ãããŸã«ãããã人ãããã®ã§ãç®ã«ã¯ç®ãã»ã»ã»
ã€ã±ãã€ã³ããããæ¶ãå»ã£ãŠåŒ·å¶pushãçŽããŸããã
ïŒã€åã®ã³ãããpushããã°æžãå Žå
# ãã¡ãïœãã¡ãã¡(匷å¶ããã·ã¥
$ git commit -m "ã³ãããã¡ãã»ãŒãž"
$ git push -f origin master
# ãŸã£ãšããªäŒç€Ÿãªãããã§æãããŸã
# ïŒã€åã®ã³ãããã«å
ã«æ»ããããªã£ãã
$ git push -f origin HEAD~:master
ããŒã«ã«ã«ãåæ ãããããªãresetã§ããããã
$ git reset HEAD~
$ git push -f origin master
äœåãåã®ã³ããããæ¶ãããå Žå
# ãã¡ãïœãã¡ãã¡(匷å¶ããã·ã¥
$ git commit -m "ã³ãããã¡ãã»ãŒãž"
$ git push -f origin master
# æãããŠå
ã«æ»ããããªã£ãã
$ git rebase -i <察象ã³ããã>
====
# ãšãã£ã¿ãéãã®ã§ä»¥äžã®ããã«å€æŽããŠä¿å
# (倿Žå)äžããé ã«å€ãã³ãããã䞊ã¶
pick aa11bbc ã³ãããã¡ãã»ãŒãžïŒ
pick b2c3c4d ã³ãããã¡ãã»ãŒãžïŒ
ã»ã»ã»
# (倿ŽåŸ)ãããªãã³ãããè¡ãåé€
pick b2c3c4d ã³ãããã¡ãã»ãŒãžïŒ
ã»ã»ã»
====
# å床匷å¶ããã·ã¥
$ git push -f origin master
ããããïŒïŒïŒãªãªãŒã¹ããŠãã°ããã£ãã®ã§çéã§åãæ»ãããæ
é害çºçãªã©ã§ãmasterãžã®ããŒãžãäžæŠå
ã«åãæ»ãããããšã¯ãããããŸãã
ã§ãã³ãããæ°ãå€ããšïŒã€ïŒã€revertããããã«ããããŸããã
# ã³ããããã°ç¢ºèª
$ git log --oneline --graph
====
* 1x3y5z7 - Merge pull request #4 from develop
|\
| * a2b45c7 - (develop) ã³ãããïŒ
* | dbc65f4 - ã³ãããïŒ
* | f0b0a91 - ã³ãããïŒ
# æ»ãå
ãæå®ããŠrevert(åºæ¬ã¯1ã§OK)
====
# masterã«developãããŒãžãããšããŠãmasterãªãïŒãdevelopãªãïŒãæå®ããŠrevert
# äŸïŒgit revert -m 1 1x3y5z7
$ git revert -m 1 <ããŒãžã³ããã>
誰ãåã蟌ã¿ããŠãªãåæãªã以äžãè¡ããŸãïŒå±éºã§ãïŒ
# ããŒãžåã«æ»ã
$ git reset ORIG_HEAD
# 匷å¶PUSH
$ git push -f origin master
ããããïŒïŒïŒåãæ»ããŠããã€ã远å ã³ããããããã©åããŒãžã§ããªãæ
ããããïŒïŒãªã©ã§ããŒãžãæã¡æ¶ãããå Žåãä¿®æ£ããŠåããŒãžããããšãããšããããŸãã
ãæã¡æ¶ãåŸã«è¿œå ããã³ãããã ããåæ ãããŠããããšããçœ ã«ã
æã¡æ¶ãã¯ããŒãžããªãã£ãããšã«ãªãããã§ã¯ãªããããŒãžããã³ããããšã¯éã®å€æŽãã³ãããããè¡çºãªã®ã§ãã
ãšããããšã§åããŒãžããå Žåã¯ãæã¡æ¶ãã³ããããããã«æã¡æ¶ããŸãããã
# ããããïŒïŒã®ç¶ã
# developãã©ã³ãã§è¿œå ã³ããã
$ git checkout develop
$ git commit -m "ã³ãããã¡ãã»ãŒãž"
# masterããã§ãã¯ã¢ãŠã
$ git checkout master
# æã¡æ¶ãã³ããããæã¡æ¶ã
$ git revert <æã¡æ¶ããã³ããã>
# developãããŒãž
$ git merge develop
äžèšãå®å šãªç°å¢ã§è©ŠããŠã¿ããæã¯ã»ã»ã»
ãã£ã±ãæ £ããŠããªããšãããªãå®è·µããã®ã¯å€§å€ã§ãã
ãã§ã«ãããã¯ãããã人ã¯ããã¹ãçšã«å¥égit cloneããŠããŠãã®ç°å¢ã§è©ŠããŸãããã
ããããã°å€±æããããšäœããããšã¡ã€ã³ã®éçºç°å¢ã«ã¯åœ±é¿ããããŸããã
ãããã¯ããªããŠãªã人ã¯ãGithubããé©åœã«æåããŠããŸãããã
æåãã³ãã®ãªããžããªãgit cloneããŠããŠãããã§è©ŠããŠã¿ãã°ããããšæããŸãã
ãã æ°ãã€ããã¹ãã¯ããããŒã«ã«ç·šããã詊ããªããã£ãŠããšã§ãã
ããªã¢ãŒãç·šãã詊ãããå Žåã«ã¯ãGithubã«ãã¹ãçšã®ç°å¢ãçšæããŠãgit cloneããŠãããã®ã®åãå ããã¡ãã«å€ããŠããå¿ èŠããããŸãã
ã ããã以äžã®æ§ãªã€ã¡ãŒãž
# git cloneããŠãã
$ git clone <ãªããžããªURL>
# ããŒã«ã«ç·šãè²ã
ã詊ããã
# ãªã¢ãŒããªããžããªã確èª
$ git remote -v
# ãªã¢ãŒããªããžããªç»é²ãåé€
$ git remote rm origin
# Githubã«ãã¹ãçšã®ç°å¢ãçšæãã
# & åãå
ãå€ãã
$ git remote add origin <æ°ãããªããžããªURL>
# ããšã¯ãªã¢ãŒãç·šãã詊ããã