[Gitクリア]操作をキャンセルする

12599 ワード

この記事では、Gitからタスクを返す方法について説明します.
  • 復元変更
  • stagingキャンセル
  • commit変更、削除
  • しかし、これらを使用する前に、ブランチを十分に利用し、操作をキャンセルしないようにしなければなりません.面倒くさいから.

    削除、変更したファイルの復元


    A.txtがあるとしたら、A.txtを削除しましょう.
    $ rm A.txt
    削除したファイルを返しましょう.
    # git checkout -- [파일 이름]
    $ git checkout -- A.txt
    上記のコマンドに従ってファイルcheckoutHEAD(現在の作業ブランチの最新コミット)を実行すると、ファイルが返されます.削除したファイルに加えて、ファイルの変更が元の状態に戻ったときに書き込むこともできます.

    リセット:分類解除


    変更をstagingした場合は、resetを返さなければなりません.resetは、HEADが指すcommitを変更するコマンドです.
    # git reset HEAD [staging 된 파일]
    $ git reset HEAD A.txt
    使用法は--soft--mixedに分けられ、--hardのオプションは--mixedであり、--softはここでは説明しない.
    gitのresetコマンドについては、リセットの明確な理解を参照してください.

    --mixed:stagingのみキャンセル


    上記のコマンド(git reset HEAD A.txt)は、git reset --mixed HEAD A.txtと同じコマンドを使用してHEADと同じstaging A.txtを返します.ファイル内の変更はまだ存在しますが、stagingステータスのみが解除されます.簡単にstagingを解除するだけであることがわかります.
    ファイル名が指定されていない場合は、すべての階層ファイルがターゲットファイルにリセットされます.

    --hard:階層ファイルを削除して復元する

    --hardオプションを貼り付けると、現在の状態はHEADと同じになります.
    # git reset --hard HEAD [staging 된 파일]
    $ git reset --hard HEAD A.txt
    stagingを無効にするだけでなく、変更も失われます.上記の場合、削除したファイルも復元され、stagingもキャンセルされます.
    したがって、--hardオプションは、次のコードに示す効果を有する.
    $ git reset HEAD A.txt
    $ git checkout -- A.txt
    同様に、ファイル名が指定されていない場合は、すべてのファイルがターゲットファイルにリセットされます.

    commitの変更


    ダイレクトコミットの変更


    コミット前に追加するファイルを削除した場合は、次のコマンドを実行します.
    $ git commit --amend
    viエディタに入り、commitメッセージを変更すればいいです.commitメッセージのみを変更しても、上記のコマンドを実行できます.

    resetでコミットをキャンセルする


    前述したように、resetコマンドは、HEAD指向のコミットを変更します.--hardオプションがない場合はresetだけで、変更は保持され、HEADは過去のcommitに戻り、コミットがマージされます.
    $ git log --oneline
    c361f69 (HEAD -> master) commit4
    72d8e4e commit3
    b48f3c3 commit2
    317db86 commit1
    マスターの歴史は上と同じです.この状態で、HEADはコミットから2日後に戻ります.
    $ git reset b48f3c3
    $ git log --oneline
    b48f3c3 (HEAD -> master) commit2
    317db86 commit1
    変更も表示されますが、HEADはcommit2を指します.
    HEAD以前のコミットresetを使用すると、元に戻すcommitと同じ効果が得られます.
    git reset HEAD~1
    HEAD~[数字]は「HEADから[数字]への遡及」という意味です.--hardオプションは変更をキャンセルするので、前のcommitを存在しないcommitとして作成できます.
    # 3개의 commit 없애기
    git reset --hard HEAD~3

    rebase:ブランチを最新状態にコミットする更新


    実際、rebaseは操作を取り消すコマンドではありません.
    ブランチのマージ
    前述したように、主にブランチのマージに使用されます.では、rebaseはいったい何をする命令なのでしょうか.
    rebaseコマンドを使用して、ブランチの開始を親ブランチの最新のコミットから開始するように変更します.

    [↑ターンテーブルの前]

    [↑乗り継ぎ後]
    うっかりメインブランチをメインブランチとマークしてしまいました.説明はMaster Branchで
    # 자식 브랜치로 이동
    git checkout good-idea
    
    # git rebase [부모 브랜치]
    git rebase master

    いつダンプするか


    親ブランチが最新に更新された場合、子ブランチも最新に更新するために使用されます.
    たとえば、good-idea2ブランチを作成して新しい機能を追加すると、リモート・リポジトリのプライマリ・ブランチが更新され、新しいcommitが追加されます.pullコマンドを使用して、ローカルmasterブランチの最新のステータスを維持します.しかし、good-idea2ブランチは、依然として古い状態masterブランチに基づいてコードを記述する.この状態では、ブランチで作業を続けても、good-idea2コードはブランチに適用されません.したがって、最新の状態masterブランチに沿ってmasterブランチが最新の状態に更新されることを確認してください.

    rebase原理:ctrl+c、ctrl+v


    実際、rebaseは、上の図のように簡単に親commitを変更するだけでなく、ブランチ全体をコピーします.親ブランチの最新のcommitになるように親commitをコピーして貼り付け、既存のcommitを削除します.したがって、commitのhash値は変更されます.

    [rebase原理]

    再基地衝突

    good-idea2ブランチのA.txtファイルgood-idea2を変更し、ブランチのA.txtファイルを削除し、'rebase test code add' commitを作成しました.
    # good-idea2 브랜치로 이동
    $ git checkout -b good-idea2
    
    # A.txt 파일 수정 및 'rebase test code add' commit 생성
    ...
    
    # master 브랜치로 이동
    $ git checkout master
    
    # A.txt 파일 삭제 및 'delete file' commit 생성
    ...
    
    # 다시 good-idea2 브랜치로 이동
    $ git checkout good-idea2 
    
    # good-idea2 브랜치를 master 브랜치로 rebase
    $ git rebase master
    error: could not apply 53fa77e... rebase test code add
    Resolve all conflicts manually, mark them as resolved with
    "git add/rm <conflicted_files>", then run "git rebase --continue".
    You can instead skip this commit: run "git rebase --skip".
    To abort and get back to the state before "git rebase", run "git rebase --abort".
    Could not apply 53fa77e... rebase test code add
    CONFLICT (modify/delete): A.txt deleted in HEAD and modified in 53fa77e (rebase test code add). Version 53fa77e (rebase test code add) of A.txt left in tree.
    このようなエラーが発生した場合、再基地を停止します.HEADは変なところを指します
    (good-idea2|REBASE 1/1)
    以上の場合masterブランチのA.txtファイルは削除され、'delete file' commitブランチのA.txtファイルは依然として存在し修正されているため、競合が発生し、ユーザ選択権が与えられる.
  • メインブランチに沿ってファイルを削除します.
  • good-idace 2ブランチファイルの保存と変更
  • エラーで説明したように、この場合、3つのコマンドを実行できます.
  • 競合の解決master(競合の解決と更新の継続)
  • good-idea2:この競合をスキップします.
  • git rebase --continue:rebaseを存在しないことにする.
  • 競合を解決して新しいコミットを作成すると、git rebase --skipは、次の競合または再基地局の完了を通知します.上記の場合、resetで削除したファイルを返す必要があります.
    $ git reset HEAD A.txt
    コード競合がファイル削除ではなくファイル内部で発生した場合.
    競合はブランチのマージの説明に従って解決できます.git rebase --abort競合は無視されます.この場合、親ブランチのcommitのみが有効です.(上記の場合、Aファイルは削除されます.)git rebase --continuerebaseは存在しないことになります.

    インタラクティブデータベース

    # git rebase --interactive [기준 commit]
    git rebase --interactive HEAD~5
    
    # git rebase -i [기준 commit]
    git rebase -i HEAD~5
    git rebase --skipオプションはcommitをクリーンアップするために使用されます.削除、マージ(git rebase --abort)、変更コミットメッセージ(--interactive)など.
    9c44575 commit5
    c981984 commit4
    3840dec commit3
    0805289 commit2
    323f12e commit1
    5a564d5 commit0
    上記の歴史があるとしましょう.
    git rebase -i HEAD~5
    squashcommitはインタラクティブダンプを行う.
    pick 323f12e commit1
    pick 0805289 commit2
    pick 3840dec commit3
    pick c981984 commit4
    pick 9c44575 commit5
    
    # Rebase 5a564d5..9c44575 onto 5a564d5 (5 commands)
    #
    # 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
    # l, label <label> = label current HEAD with a name
    # t, reset <label> = reset HEAD to a label
    # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
    # .       create a merge commit using the original merge commit's
    # .       message (or the oneline, if no original merge commit was
    # .       specified). Use -c <commit> to reword the commit message.
    #
    # These lines can be re-ordered; they are executed from top to bottom.
    上記の冗長なviエディタが表示されます.「条件付きコミット」(HEAD~5)から、コミットを逆順に配置し、コメントに置き換える方法を示します.必要に応じてpickを特定のコマンドとして保存し、viエディタを終了できます.
    デフォルトはpickに設定されていますが、多くのコマンドがあります.r(reword),e(edit),s(スカッシュ),d(drop)を代表的に理解する.
  • reword(r):commitメッセージのみを変更します.
  • edit(e):commitを変更します.
  • squash(s):commitを上のcommitにマージします.
  • drop(d):commitを削除します.
  • amendの場合、commitの323f12eオプションと同じです.HEADを特定のコミットeditに戻します.次に、変更を追加して--amendを実行し、--amendを実行します.git commit --amend特定のcommitとその上のcommitを統合して、commitメッセージを再作成します.たとえば、git rebase --continueに変更した場合は、commit 3とcommit 4を組み合わせ、viエディタを解放してcommitメッセージを入力します.

    何をするべきか分からない時


    rebaseとgit操作を実行するときに、どのコマンドを入力する必要があるのか、どの程度実行する必要があるのか分からない場合は、squash c981984 commit4コマンドを入力します.gitには現在のステータスと次のコマンドが表示されます.

    の最後の部分


    次の記事では、マージをキャンセルするrevertとresetについて説明します.