gitのチェックアウトのためのカンニングペーパー、隠し場所、リセット、クリーン、リバート、リベース


Originally posted at michaelzanggl.com. Subscribe to my newsletter to never miss out on new content.


Gitはあなたが徐々に学ぶこれらのものの一つです.あなたはgit add . ステージファイルにgit commit -m “message” 最終的にローカルにコミットするgit push リモートリポジトリにプッシュする.
しかし、時間をかけてミスを犯すと、常にGoogleとランダムなコマンドで貼り付ける場合は、簡単にコマンドの全くの量によって混乱を得る可能性がありますgit reset , git revert , git clean , git checkout . , git rebase -i , git commit --amend など.一緒に一人で行きましょう!

目次

  • Understanding key terms
  • Don't undo: save changes for later use
  • Don't undo: Add something to the latest commit or change the message
  • Unstage files (precommit)
  • Revert changes (precommit)
  • Remove new/untracked files and directories
  • Revert a commit in a new commit
  • Remove latest commit(s) without a new commit
  • Change history
  • Remove branch locally
  • Remove remote branch
  • Conclusion
  • 重要な用語を理解する


    いつでもより多くのヘルプを見つけることができますhere , しかし、重要な用語を理解することは重要です.
  • インデックスファイルを使用するときgit add これは、インデックスファイルにファイルを追加します.したがって、ステージングはインデックスと同じです.
  • 追跡されていない:新しいファイルを作成する場合は、それをステージまで追跡されます.
  • ヘッド:ヘッドは現在のブランチの最新コミットにポイントします.そういうわけで、時々あなたは時々選ばれますdetached HEAD , 例えば、古いコミットをチェックするとき.
  • ドットgit add . カレントディレクトリを参照します.したがって、カレントディレクトリとすべてのサブディレクトリのすべてのファイルがステージになります.我々は、ドットを使用するいくつかのより多くのコマンドを学びます.
  • 元に戻す


    git stash -u


    これはすべての追跡されていないファイル(- uフラグ)を保存し、ステージを変更し、変更を変更します.
    再度最新の隠し場所を取得するには
    git stash apply
    
    あなたの隠しリストを清潔に保つには、また、実行することができますgit stash pop 代わりに.それは適用と同じですが、また、隠し場所リストから適用された隠し場所を削除します.
    用途git stash list すべてのストアドのリストを取得するには.
    ユースケース:あなたは何かに取り組んでいますが、突然支店を変更する必要があります
    ボーナス:どのような隠し場所に何を知っているには、実行してあなたの隠しノートを与えることができます:git stash push -u -m "your message"

    元に戻す:何かを最新のコミットまたはメッセージを変更するに追加


    git commit --amend -m "added file and changed message to this"

    amend より多くのファイルを最新のコミットに加えることができます.
    ユースケース:コミットの一部である必要がある特定のファイルをステージに忘れてしまった.
    ボーナス:ファイルがまだ“メッセージ”を変更するには、“修正”オプションでコミットすることができますが追加されていない場合でも.
    他の人があなたのブランチに取り組んでいるならば、最新のコミットがすでに発表されたときに修正しないように注意してください.必要になるgit push --force

    アンステージファイル( precommit )


    git reset .


    よく見られるgit reset例:
    echo "code code code" >> index.js
    git add .
    git reset .
    
    それは単にunstageindex.js 変更を作業ツリーに戻します.あなたが適用することができます--hard フラグを完全に変更を取り除く.
    ユースケース:習慣のうち、すべての変更を使用してステージを使用してgit add . , しかし、彼らをseparetelyにコミットする特定のファイルを非表示にします.
    ボーナス:あなたがそれと同じ方法を行うことができます特定のファイルのみをunstageにgit add
    git add User.js UserController.js UserService.js
    git reset UserService.js User.js
    
    これは続くUserController.js ステージ.

    反転( precommit )


    git checkout .

    git checkout はブランチを変更するために使用されますが、代わりにfilepathをチェックすると、別の目的があります.
    ローカルでファイルを変更した場合は、インデックスやコミットのいずれかで変更を取り消します.すぐにその上で.
    例:
    echo -n "1" >> newfile
    git add .
    git commit -m "added newfile"
    
    echo -n "2" >> newfile
    
    それで、私たちは新しいファイルをつくりました.
    あなたが現在走るならばgit checkout newfile この場合、ローカルの変更は削除されます.あなたの作業ツリーは再びきれいになります.
    の間にステージングを開始するときに何が起こるかを見てみましょう.これはあなたに新しい視点を与えるgit add , これまで以上に強力なコマンドを作る.
    echo -n "1" >> newfile
    git add .
    git commit -m "added newfile"
    
    echo -n "2" >> newfile
    git add .
    
    echo -n "3" >> newfile
    
    これは異なる状態のファイルの内容です
  • ヘッド"1 "
  • インデックス:"12 "
  • ワーキングツリー: "123 "
  • あなたが現在走るならばgit checkout newfile コンテンツを削除するだけです3 あなたのローカル変化から.言い換えれば、インデックス内のファイルを見つけた場合、それはインデックスで何であるかによって変更されます.それはまだ持ちますnewfile 内容“12”でステージ.
    また、“2”を削除するには、最初に私たちが学んだようにファイルを非表示にし、再度チェックアウトする必要があります.
    git reset
    git checkout .
    

    Since it only replaces the files with those from the index / HEAD, git checkout won't do anything with untracked files.


    use case :ファイルAを修正し、ファイルBを変更するときには、ファイルAの変更が実際に必要とされていないことがわかりました.
    あなたがチェックアウトしたいファイルがブランチと同じ名前を持つのに十分不幸であるならば、あなたはこのようにチェックアウトしなければなりませんgit checkout -- master マスターブランチをチェックアウトするのを避けるために.

    ファイル/ディレクトリを削除します


    git clean -f


    同様git checkout . という違いで、それは追跡されていないファイルでのみ動作します.あなたは走ることができるgit clean --dry-run or git clean -n どのファイルが永久的に削除されるかを確認します.追加する-d ディレクトリを含むフラグ.
    touch newfile
    git clean -d -n
    
    出力はWould remove newfileボーナス使用git clean -i インタラクティブなクリーニングを開始するには、それぞれのファイルを個別に行う上でより多くのオプションを与える.

    新しいコミットでコミットを戻す


    git revert commit-id


    コミットIDの変更を破棄し、新しいコミットを作成します.
    ユースケース:プッシュされているコミットは、バグを引き起こし、反転する必要があります.
    ボーナス:適用-e or --edit コミットメッセージを変更するフラグ.たとえば、このコミットを戻す必要がある理由を追加できます.

    新しいコミットなしで最新のコミットを削除する


    git reset HEAD^


    あなたが事故で何かを犯すと想像し、コミットを取り消したい.git reset HEAD^ それは決して起こらなかったように最新のコミットを元に戻して、変更をあなたのローカル作業木に戻します.それは新しいコミットを作成しません、そして、最新のコミットは歴史から消えます.
    見たgit reset すでにファイルを展開する前に.しかし、コミットを渡すときには、実際に頭を任意のコミットにリセットすることができます.あなたがコミットA、BとCを持っていると想像してくださいgit reset A 意志は最新のコミットになります、そしてgit log , あなたは、BとCをもはや見つけません.
    私たちはgit reset HEAD^ 作業ツリーの変更を保持します.つまり言い換えればgit reset HEAD^ 頭とインデックスをリセットします.
    使用する--soft 頭をリセットするだけのフラグです.staged .
    使用する--hard フラグをリセットする頭、インデックス、および作業ツリーは、変更を完全に削除されることを意味します.
    の代わりにgit reset HEAD^ また、書き込むことができますgit reset HEAD^1 , git reset HEAD~1 or git reset HEAD~ .
    他の人があなたのブランチで働いているならば、あなたがリセットしたコミットがすでに発表されたとき、前のコミットに頭をリセットしないように注意してください.必要になるgit push --forceユースケース:ローカルで変更をコミットしましたが、間違ったブランチにコミットしていることに気付きました.
    ボーナス:ちょうど最新のコミットよりもリセットする4つの方法の合計があります.
    これらの4行すべてが最後の2つのコミットをリセット
    git reset HEAD^2
    git reset HEAD^^
    
    git reset HEAD~2
    git reset HEAD~~
    
    Bonus 2 :git reset 実際に最新のコミットを削除しません、それは単にあなたが望むコミットに頭を「ロールバック」します.BとCはまだ30日間保存されます.

    歴史を変える


    インタラクティブな再構築について簡単に調べましょう.我々は学んだgit reset HEAD~1 --hard 最新のコミットを削除する方法です.我々は、それがより強力であるだけで、インタラクティブrebasingと同じことを達成することができます.rebase 今回は実際にコミットオブジェクトを変更し、頭を特定のコミットに向けるだけではありません.
    git rebase -i HEAD~4
    
    私たちは同じHEAD~4git reset 前に.4あなたが再ベースしたいコミットの数を参照します.
    これでエディタが開きます次のコンテンツ
    pick 123a44b0 your latest commit
    pick C23a44b0 commit 3
    pick B23a44b0 commit 2
    pick A23a44b0 commit 1
    
    # Rebase ...
    #
    # Commands:
    # p, pick <commit> = use commit
    # r, reword <commit> = use commit, but edit the commit message
    # e, edit <commit> = use commit, but stop for amending
    # s, squash <commit> = use commit, but meld into previous commit
    # f, fixup <commit> = like "squash", but discard this commit's log message
    # x, exec <command> = run command (the rest of the line) using shell
    # b, break = stop here (continue rebase later with 'git rebase --continue')
    # d, drop <commit> = remove commit
    
    置き換えましょう
    pick 123a44b0 your latest commit
    pick C23a44b0 commit 3
    pick B23a44b0 commit 2
    pick A23a44b0 commit 1
    
    そば
    pick 123a44b0 your latest commit
    fixup C23a44b0 commit 3
    f B23a44b0 commit 2
    drop A23a44b0 commit 1
    
    ご覧の通り、オプションのように書くこともできますfixup または省略名を使用するf この場合
    これはつぶれますC23a44b0 and B23a44b0 into 123a44b0 , それを解雇する.Regarding A23a44b0 , このコミットは完全に削除されます.それで、一旦ベースが完成するならば、あなたは1つのコミットだけで終わります123a44b0 .
    他の人があなたのブランチの上で働いているならば、あなたがrebaseをするコミットがすでに発表されたとき、再ベースにならないように注意してください.必要になるgit push --forceユースケース:あなた自身のブランチで一人で作業していて、PR/Mr .のコミットのクリーンなリストを持ちたいです.
    ボーナス:あなたも、リスト内に表示される順序を変更することによってコミットを移動することができます.

    ブランチを削除する


    git checkout master

    git branch -D branch-to-delete


    ユースケース:コミットの束を反転するのではなく、時々それはあなたのローカルブランチを削除し、再度それをチェックアウトするだけで高速です.

    リモートブランチを削除する

    git push origin branch-to-delete --deleteユースケース:あなたが選択した名前を実現するプッシュ後に意味をなさないし、それを変更したいgit branch -m "new-name" )

    結論


    Gitはマスターするための全くの獣です、そして、私は確かにこれらの仕事のいくらかを成し遂げる他の方法があると確信します.あなたが知っていればコメントを残してください、私はリストにそれらを追加することができます.
    この記事があなたを助けたならば、私は書くソフトウェアを単純化することに多くのヒントを持っていますhere .