[Gitクリア]操作をキャンセルする
12599 ワード
この記事では、Gitからタスクを返す方法について説明します.復元変更 stagingキャンセル commit変更、削除 しかし、これらを使用する前に、ブランチを十分に利用し、操作をキャンセルしないようにしなければなりません.面倒くさいから.
A.txtがあるとしたら、A.txtを削除しましょう.
変更をstagingした場合は、
gitのresetコマンドについては、リセットの明確な理解を参照してください.
上記のコマンド(
ファイル名が指定されていない場合は、すべての階層ファイルがターゲットファイルにリセットされます.
したがって、
コミット前に追加するファイルを削除した場合は、次のコマンドを実行します.
前述したように、
HEAD以前のコミット
実際、
ブランチのマージ
前述したように、主にブランチのマージに使用されます.では、rebaseはいったい何をする命令なのでしょうか.
rebaseコマンドを使用して、ブランチの開始を親ブランチの最新のコミットから開始するように変更します.
[↑ターンテーブルの前]
[↑乗り継ぎ後]
うっかりメインブランチをメインブランチとマークしてしまいました.説明はMaster Branchで
親ブランチが最新に更新された場合、子ブランチも最新に更新するために使用されます.
たとえば、
実際、rebaseは、上の図のように簡単に親commitを変更するだけでなく、ブランチ全体をコピーします.親ブランチの最新のcommitになるように親commitをコピーして貼り付け、既存のcommitを削除します.したがって、commitのhash値は変更されます.
[rebase原理]
メインブランチに沿ってファイルを削除します. good-idace 2ブランチファイルの保存と変更 エラーで説明したように、この場合、3つのコマンドを実行できます.競合の解決 競合を解決して新しいコミットを作成すると、
競合はブランチのマージの説明に従って解決できます.
デフォルトはpickに設定されていますが、多くのコマンドがあります.r(reword),e(edit),s(スカッシュ),d(drop)を代表的に理解する.reword(r):commitメッセージのみを変更します. edit(e):commitを変更します. squash(s):commitを上のcommitにマージします. drop(d):commitを削除します.
rebaseとgit操作を実行するときに、どのコマンドを入力する必要があるのか、どの程度実行する必要があるのか分からない場合は、
次の記事では、マージをキャンセルするrevertとresetについて説明します.
削除、変更したファイルの復元
A.txtがあるとしたら、A.txtを削除しましょう.
$ rm A.txt
削除したファイルを返しましょう.# git checkout -- [파일 이름]
$ git checkout -- A.txt
上記のコマンドに従ってファイルcheckout
HEAD(現在の作業ブランチの最新コミット)を実行すると、ファイルが返されます.削除したファイルに加えて、ファイルの変更が元の状態に戻ったときに書き込むこともできます.リセット:分類解除
変更を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ファイルは依然として存在し修正されているため、競合が発生し、ユーザ選択権が与えられる.master
(競合の解決と更新の継続)good-idea2
:この競合をスキップします.git rebase --continue
:rebaseを存在しないことにする.git rebase --skip
は、次の競合または再基地局の完了を通知します.上記の場合、resetで削除したファイルを返す必要があります.$ git reset HEAD A.txt
コード競合がファイル削除ではなくファイル内部で発生した場合.競合はブランチのマージの説明に従って解決できます.
git rebase --abort
競合は無視されます.この場合、親ブランチのcommitのみが有効です.(上記の場合、Aファイルは削除されます.)git rebase --continue
rebaseは存在しないことになります.インタラクティブデータベース
# 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
squash
commitはインタラクティブダンプを行う.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)を代表的に理解する.
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について説明します.
Reference
この問題について([Gitクリア]操作をキャンセルする), 我々は、より多くの情報をここで見つけました https://velog.io/@dev2820/Git-정리-작업-취소하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol