中級レベルのGitユーザー向けの便利な20のヒント。 パート2

これは、 中級レベルのGitユーザー向けの便利なヒントの記事XXの続きです。



リセットについて、エイリアスについて、またフィルターブランチについて、rerereとのマージと競合の解決について、リベース(インタラクティブではなく)について、そして最終的にはギターのサービスについて、予定外です。







1. Git`aはどこでリセットされますか


最後のコミットまたはそれ以降の変更を何らかの方法で元に戻す必要がある最も一般的なケースを取り上げると、これはgit reset(別名git reset --mixed HEAD)およびgit reset --hardコマンドになります。 最初はインデックスから最後のコミットを削除しますが、ファイルの変更には触れませんが、2番目は指​​定されたコミット時にインデックスとファイルの両方を元の形式^ W ^ W状態に容赦なくもたらします。

つまり、$ gitをHEADにリセットすることで、git addを介して編集を元に戻すことができます(git unstageエイリアスを覚えていますか?)。

そして、最後のコミット(つまり、最後から2番目のコミット時の巻き戻し時間)を完全に削除します-$ git reset --hard HEAD ^



2.その他のエイリアス


歴史の研究に続いて| grep "git" | sort -d | uniq、別のエイリアスを追加しました-$ git config --global alias.amend 'commit --amend -C HEAD'- git amendコマンドは最後のコミットを同じメッセージで上書きします。

おそらく、そこに-aスイッチを追加します(毎回git addを実行しないようにするため)。



3.フィルターブランチ-混乱の救済!


git filter-branchは、履歴を操作するための十分な機会を提供します。

内部ブランチではなくマスターにバトルパスワードを保存していないことに気付いたときに、このチームに会いました。

公開リポジトリにプッシュする前にこれに気づいたことを神に感謝します!

$ git filter-branch --tree-filter "sed -e 's#my_secret_pass#dbpassword#' -e 's#my_db_hostdbhost.tld#' -i settings.py" HEAD

単純なアクションで、各コミットで設定ファイルのパスワードを書き換えました。



絞り込みパラメーター--index-filter、-msg-filter、-commit-filter-tag-name-filterなどを指定することにより、範囲を狭めることができます。

--allはすべてのブランチを意味します。



4.そして再びマージについて。


潜在的に有用なブランチマージ競合ツールを指摘してくれたghisguthに感謝します。

私自身はまだ使用していませんが、設定ファイルにすでに行があります(忘れないでください)。



したがって、満たす-git rerere-競合の解決を記録し、再度マージするときにそれらを再度使用することができます。

このように含まれています-$ git config --global rerere.enabled 1



別のブランチ(マスターなど)と完全に競合する長寿命の開発ブランチがある場合、次の順序でマージ中のギターの体の動きに対する「学習」が発生する場合に便利です。最初にgit pull originマスターを行い、競合を解決し、テストマージをロールバックします- $ git reset --hard HEAD ^ 。 実際の合併では、手で行ったのと同じ動きがすべて自動的に行われます。



実際、git rerereはユーザーの介入や引数なしで起動しますが、進行状況を調整できます。

コマンド:git rerere [clear | diff | status | gc]



clear-自動競合解決がキャンセルされた場合、rerereが使用するメタデータをリセットします。

たとえば、git am [--skip | --abort]またはgit rebase [--skip | --abort]は自動的にこのオプションを使用します。

diff-競合解決の現在の状態の差分を表示します。 競合が解決されてから変更された内容を追跡するのに役立ちます。 追加のパラメーターは、diffコマンドに直接渡されます。

diffとは異なり、競合を解決するために追跡されるファイル名のみを表示します。

gc-ずっと前に発生した競合マージエントリを削除します。 デフォルトでは、15日より古い未解決の競合および60日より古い解決された競合はクリアされます。 これらの値は、gc.rerereunresolvedおよびgc.rererereresolvedで説明されています。



5.リベースについて


リベースについては、このコマンドを使用すると、変更を「移動」し、履歴のローカル編集中に「先に行った」ウィザードからのコミットを配置できると既に述べています。



別の興味深いアプリケーションがあります-rebase --onto。

したがって、完全にサードパーティのブランチに基づいてコミットを転送できます。

たとえば、次のような写真があります。

.-x ------------マスター

。 |

。 \ -----サーバー実験

。 |

。 \ --- http-interface



ブランチをマスターへの新しいインターフェースで染色し、ゲームをサーバー側に残すには、次を行う必要があります

$ git rebase --onto master server-experiments http-interface



その後、マスターに切り替えてブランチをマージすることができます(git checkout master; git merge http-interface)-結果として、メインブランチ、新しいインターフェースがそこに注がれ、完全に分離されます-サーバー側で実験を行う残りのブランチ。

利益!



行のすべてをリベースすることはできませんが、インタラクティブかつ選択的にリベースできます-このためには、-iオプション(--interactive)が必要です。

$ git rebase -i masterは、「command SHA commit_message」という形式の指定されたコミットのリストでエディターを開きます。

チームは次のとおりです。

p | pick-コミットを使用します。

e | edit-コミットを使用しますが、-amendのために一時停止します(プロセスは次の項目の前に停止するため、独自の特別な変更を加えることができます。たとえば、変更を小さなコミットに分割します)

s | squash-コミットを使用しますが、以前のコミットとマージします。 (プロセスでは、エディターウィンドウが開き、一般的なコミットメッセージを作成できます。一種のグローバルコミット-修正)



行を削除すると、コミットが削除されます。



$ git rebase --continueで物事の自然な流れを続けることができます



6.サービス


アクティブな開発があり、コードをリモートサーバーにプッシュしない場合は、定期的にガベージコレクションを行う価値があります。

$ git gc

これにより、ガベージがクリーンアップされます-何にも接続されていないオブジェクトが削除され、残りのオブジェクトが効果的に(再-| y-)パックされます。

別のサーバーにプッシュする前に、オブジェクトは自動的に処理されるため、リモートサーバーについて説明しました。



それがギタについて言いたいことのすべてです)



All Articles