6687
6884

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Gitでやらかした時に䜿える19個の奥矩

6687
Last updated at Posted at 2015-02-11

タむトルは倧目に芋おください><。
本内容は危険な操䜜を䌎うのでくれぐれも自己責任でお願いしたす。

間違いもあったら指摘ください。

ロヌカル線

自分のロヌカル環境だけで閉じおいお、他の人ぞの圱響がない堎合に有効です。
リモヌトにプッシュしちゃっおる時は、他人ぞの圱響が発生するので危険です。

やらかしコミットメッセヌゞに犁止ワヌド入っおお人生やめたい時

コミットメッセヌゞを修正するのは簡単です。
ファむルの远加なんかもできちゃいたす

$ 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>

# あずはリモヌト線をお詊しする

6687
6884
14

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6687
6884

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?