やあ、全部元に戻したい!エラー修正コマンド

画像



Gitは便利ですが複雑なシステムです。まず第一に、不注意によって間違いを犯す可能性があり、それを修正することは困難または不可能ですらあります。Gitのドキュメントには、バグの修正に役立つ多くのコマンドの説明が記載されています。



ただし、問題を解決するには、コマンドの正確な名前を知っている必要があります。そして、ここに典型的な鶏肉と卵の問題があります。この記事では、問題のある状況を解決するのに役立つコマンドについて説明します。



くそー、私は何か間違ったことをした。魔法のタイムマシンをください!



git reflog
# you will see a list of every thing you've
# done in git, across all branches!
# each one has an index HEAD@{index}
# find the one before you broke everything
git reset HEAD@{index}
# magic time machine
      
      





画像



このコマンドを使用すると、問題の原因となったマージをロールバックすることにより、誤って削除されたデータを回復できます。refLogは非常に頻繁に使用されます-このコマンドの追加を提案してくれてありがとうとしましょう。



コミットしましたが、すぐに間違いに気づきました。修正する必要があります。



# make your change
git add . # or add individual files
git commit --amend --no-edit
# now your last commit contains that change!
# WARNING: never amend public commits
      
      





このコマンドを使用すると、何かをコミットした後、「=」記号の後にスペースがないなどの問題が発生したときに、不快な小さなことを修正できます。はい、2つをrebase -iと組み合わせることで、新しいコミットで変更を加えることができます。しかし、それは長い道のりです。



NB!パブリックブランチのコミットは絶対に変更しないでください。このコマンドは、ローカルブランチでのコミットにのみ使用してください。そうしないと、問題が発生します。



最後のコミットのメッセージを変えたい!



git commit --amend
# follow prompts to change the commit message
      
      





それはただ...愚かな投稿要件です。



新しいブランチにあるはずなのに、誤ってマスターにコミットしました!



# create a new branch from the current state of master
git branch some-new-branch-name
# remove the last commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# your commit lives in this branch now :)
      
      





すでにパブリックスレッドにコミットしている場合、コマンドは機能しません。この場合、HEAD〜の代わりにgit reset HEAD @ {元に戻すコミットの数を指定}が役立ちます。



まあ、私は間違って間違ったブランチにコミットしました



# undo the last commit, but leave the changes available
git reset HEAD~ --soft
git stash
# move to the correct branch
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here";
# now your changes are on the correct branch
      
      





多くの開発者がチェリーピックを使用している別の方法があります。



git checkout name-of-the-correct-branch
# grab the last commit to master
git cherry-pick master
# delete it from master
git checkout master
git reset HEAD~ --hard
      
      





diffを実行する必要がありますが、何も機能しません。



変更が加えられていることは確かですが、diffが空の場合は、addを使用して変更のインデックスを作成した可能性があります。したがって、特別なフラグを使用する価値があります。



git diff --staged



一般的に、これはバグではなく機能ですが、それは明らかです¯\ _(ツ)_ /¯5



コミット前に行われたコミットを緊急に取り消す必要があります



# find the commit you need to undo
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git revert [saved hash]
# git will create a new commit that undoes that commit
# follow prompts to edit the commit message
# or just save and commit
      
      





幸い、古いファイルと新しいファイルをコピーして貼り付けることで、5つのコミットに戻る必要はありません。元に戻すと、これをすべて元に戻すことができます。



さらに、コミットだけでなくファイル全体をロールバックできます。確かに、これらはすでに他のコマンドになります...



ファイルの変更を元に戻します



そしてここに、これらの他のコマンドがあります。



# find a hash for a commit before the file was changed
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git checkout [saved hash] -- path/to/file
# the old version of the file will be in your index
git commit -m "Wow, you don't have to copy-paste to undo"
      
      





この機会を最初に見つけたのは、COOL、COOL、K-R-U-T-Oでした。しかし、考えてみれば、ファイル内の変更を破棄するための最良のオプションがチェックアウトであるのはなぜですか?:shakes-fist-at-linus-torvalds:



すべて、私はあきらめます



cd ..
sudo rm -r fucking-git-repo-dir
git clone https://some.github.url/fucking-git-repo-dir.git
cd fucking-git-repo-dir
      
      





EricVに感謝します。この方法について。そして、彼にsudoを使用することについてのすべての不満に対処します。



変更をゼロにして元のバージョンに完全にロールバックする必要がある場合は、それを試すことができます。ただし、覚えておいてください。これらのコマンドは破壊的で元に戻せません。



# get the lastest state of origin
git fetch origin
git checkout master
git reset --hard origin/master
# delete untracked files and directories
git clean -d --force
# repeat checkout/reset/clean for each borked branch
      
      





注意!この記事は、包括的なガイドを目的としたものではありません。そして、はい、同じことを行う他の方法があり、さらに良い方法があります。しかし、私は試行錯誤によってこれらのオプションを思いついた。それから私は自分の発見を共有するというクレイジーなアイデアを思いつきました。それを取るか、行く! SymbioWayのITスペシャリストリクルートセンターのディレクターであり、Skillboxオンライン大学バックエンドのエバンジェリストである



画像



専門家の解説



Daniil Pilipenkoは、Gitとその開発者との関連性について意見を述べました。



Gitは2005年に登場し、市場を引き継ぐのに長い時間がかかりました。2008年に開発チームでSVNを実装していたときのことを覚えています。そして2012年でも、私の近くの会社がMercurialを大量に実装していました。何年にもわたって、Gitが最高のバージョン制御システムであり、現在ほとんどすべての開発者によって使用されていることが多くの人に明らかになっています。



あなたが仕事に応募しようとしている初心者の開発者なら、Gitを学ぶことを忘れないでください!バージョン制御システムとは何か、なぜそれが必要なのか、コミット、ブランチ、リポジトリのクローンを作成してサーバーに加えられた変更を送信する方法、サーバーから新しい変更を取得する方法、マージする方法、どのような種類の「リセット」があるかを知っておく必要があります。最初は、このトピックは理解できず難しいように思われるかもしれませんが、Gitの使用に慣れる必要があるだけで、それをやめることはできません。



All Articles