続ける - github rebase




既存の未処理のコミットを修正するには? (18)

コミットメッセージに間違ったことを書きました。 代わりに、私はいくつかのファイルを含めることを忘れてしまった。

コミットメッセージ/ファイルを変更するにはどうすればよいですか? コミットはまだプッシュされていません。


最新のコミットメッセージの修正

git commit --amend

エディタが開き、最新のコミットのコミットメッセージを変更することができます。 さらに、コミットメッセージをコマンドラインで次のように直接設定することもできます。

git commit --amend -m "New commit message"

しかし、これにより、複数行のコミットメッセージや小さな修正を入力するのが煩雑になる可能性があります。

これを実行する前に作業コピーの変更が行われていないことを確認してください。そうしないとコミットも行われません。 ( ステージングされていない変更はコミットされません)。

すでにリモートブランチにプッシュしたコミットのメッセージを変更する

すでにコミットをリモートブランチまでプッシュした場合は、コミットを強制的にプッシュする必要があります:

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

警告:強制的にプッシュすると、ローカルブランチの状態でリモートブランチが上書きされます 。 ローカルブランチにないリモートブランチにコミットがある場合、それらのコミット失われます。

警告:既に他の人と共有しているコミットを修正することには注意が必要です。 修正コミットは本質的に異なるSHA IDを持つように書き換えます。これは、他の人があなたが書き換えた古いコミットのコピーを持っている場合に問題になります。 古いコミットのコピーを持っている人は、新しく書き直されたコミットと作業を同期させる必要があります。これは困難な場合がありますので、共有コミット履歴を書き直そうとするときに他人と調整したり、全部。

インタラクティブなリベースを使用する

別のオプションは、対話型のリベースを使用することです。
これにより、最新のメッセージでなくても更新したいメッセージを編集することができます。

git squashを実行するには、次の手順を実行します。

// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

コミットを縮めたら、メッセージを編集するためのe/rを選択します

対話型リベースに関する重要な注意

git rebase -i HEAD~Xを使用すると、 git rebase -i HEAD~X 以上のコミットが発生する可能性があります。 Gitは最後のXコミットのすべてのコミットを「収集」し、その範囲の間にマージがあれば、すべてのコミットも表示されるので、結果はX +になります。

良いヒント:

1つ以上のブランチでそれを行う必要があり、コンテンツを修正する際に競合にgit rerereする可能性がある場合は、 git rerereを設定し、 git rerereそれらの競合を自動的に解決するようにします。

🔥ホットチップ

最後のgitコミットメッセージを修正し、それをリモートにプッシュする小さなbash関数を書くこともできます。 私はいつも助けてくれます。 ここに関数があります。 .bashrcまたはそれに類似した.zshrcファイルに入れて、シェルをリロードしてください。

# Amend the last commit message
# Push the changes to remote by force
# USAGE: gamend "Your New Commit Msg"
function gamend() {
    git commit --amend -m "[email protected]"
    git push --force
}

ドキュメンテーション


修正する

ここにはいくつかのオプションがあります。 できるよ

git commit --amend

あなたの最後のコミットである限り。

インタラクティブ・リベース

それ以外の場合は、対話型のリベースを行うことができます。

git rebase -i [branched_from] [hash before commit]

インタラクティブなrebaseの内部では、単にそのコミットに編集を加えるだけです。 それが来たらgit commit --amendを実行し、コミットメッセージを修正してください。 そのコミットポイントの前にロールバックしたい場合は、 git reflogを使用してそのコミットを削除することもできます。 次に、 git commitやり直してください。


Git GUIを使用している場合、プッシュされていない最後のコミットを修正することができます:

Commit/Amend Last Commit

Git GUIツールを使用している場合は、最後のコミットの修正という名前のボタンがあります。 そのボタンをクリックすると、最後のコミットファイルとメッセージが表示されます。 そのメッセージを編集するだけで、新しいコミットメッセージでコミットできます。

または、コンソール/端末からこのコマンドを使用します。

git commit -a --amend -m "My new commit message"

あなたはgit-rebase-reword使うことができます

これはコミットを編集するように設計されています

$ git rebase-reword <commit-or-refname>

これはコミットを修正する対話的なリベースのアクションの後に名前が付けられます: "reword"。 この記事man -sectionインタラクティブモードを参照してください。

例:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

うわー、これを行うにはたくさんの方法があります。

これを行うもう1つの方法は、最後のコミットを削除することですが、変更を保存して作業を失うことはありません。 修正されたメッセージで別のコミットを行うことができます。 これは次のようになります。

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

ファイルを追加したり変更したりするのを忘れると、私はいつもこれを行います。

--soft代わりに--hardを指定することを忘れないでください 。そうしないと、コミットが完全に失われます。


すでに述べたように、 git commit --amendは最後のコミットを上書きする方法です。 1つのメモ: ファイルを上書きする場合は、コマンドは次のようになります。

git commit -a --amend -m "My new commit message"

つかいます

git commit --amend

詳細を理解するために、優れた投稿は4. Git Historyの書き換えです。 また、 git commit --amend を使用しない場合についてもgit commit --amendます。


また、git filter-branchを使用することもできます。

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

簡単なgit commit --amend簡単なことではありませんが、間違ったコミットメッセージの後にいくつかのマージがある場合は特に便利です。

これは、 HEADと間違ったコミット間のすべてのコミットを書き直そうとするので、 msg-filterコマンドを非常に賢明に選択する必要があります;-)


以前のコミットを修正するには、必要な変更を加えてそれらの変更をステージングし、次に実行します

git commit --amend

これにより、新しいコミットメッセージを表すテキストエディタのファイルが開きます。 それは、あなたの古いコミットメッセージからのテキストを入力し始めます。 必要に応じてコミットメッセージを変更し、ファイルを保存してエディタを終了して終了します。

直前のコミットを修正して同じログメッセージを保持するには、

git commit --amend -C HEAD

以前のコミットを完全に削除して修正するには、

git reset --hard HEAD^

複数のコミットメッセージを編集する場合は、次のコマンドを実行します。

git rebase -i HEAD~commit_count

commit_countを編集するコミットの数に置き換えます。)このコマンドは、エディタを起動します。 最初のコミット(変更したいもの)を「選択」ではなく「編集」としてマークし、エディターを保存して終了します。 コミットして実行する変更を行います。

git commit --amend
git rebase --continue

注意: git commit --amendによって開かれたエディタからも、 "あなたが望む変更を行う"ことができます


古いメッセージ(最新のメッセージだけでなく)の編集に役立つWindows / MacのGUIを探している人にとって、私はSourceTreeをお勧めしたいと思います。 以下の手順は以下のとおりです。

まだリモートにプッシュされていないコミットの場合:

  1. 現在のすべての変更をコミットまたは隠していることを確認します(つまり、「ファイルステータス」タブにファイルが表示されないようにします)。そうでない場合は機能しません。
  2. "Log / History"タブで、編集したいコミットのにあるグラフ内の隣りの行があるエントリを右クリックし、 " コミット参照の子を対話的にリベースする..."を選択します。
  3. 変更したいコミット・メッセージの行全体を選択します「メッセージ」列をクリックします )。
  4. [メッセージの編集]ボタンをクリックします。
  5. 表示されたダイアログでメッセージを編集し、[OK]をクリックします。
  6. 変更する他のコミットメッセージがある場合は、手順3〜4を繰り返します。
  7. [OK]をクリックします。リベースが開始されます。 すべてがうまくいけば、出力は「Completed successfully」で終了します。

...または...すでにプッシュされているコミットの場合:

この回答の手順に従ってください。これは上記と似ていますが、コマンドラインからコマンドを実行してブランチを強制的に実行する必要があります。すべてを読んで、必要な注意を払ってください!


最後のコミットの場合は、コミットを修正するだけです。

git commit --amend -o -m "New commit message"

-o (-- --only )フラグを使用してコミットメッセージのみを変更する)


埋め込みコミットの場合は、素晴らしい対話型のリベースを使用してください:

git rebase -i @~9   # Show the last 9 commits in a text editor

あなたが望むコミットを見つけ、 rreword )をpickして変更し、ファイルを保存して閉じます。 完了!


ミニチュアvimチュートリアル(または、わずか8回のキーストロークでリベースする方法3j cw r Esc ZZ ):

  • 時間があればvimtutor実行する
  • h j k lは移動キーに対応
  • すべてのコマンドに接頭辞「範囲」を付けることができます。たとえば、 3jが3行下に移動します
  • iは挿入モードに入る - 入力したテキストがファイルに表示される
  • EscまたはCtrl c押して挿入モードを終了し、「通常」モードに戻ります
  • 元に戻す
  • Ctrl rを押してやり直す
  • dddwdldw 、それぞれ行、単語、または文字を削除します
  • cccwclを実行して、それぞれ行、単語、または文字を変更します( dd iと同じ)
  • yyywyl 、それぞれ行、単語、または文字をコピー(「ヤンク」)する
  • pまたはPをそれぞれ現在の位置の後または前に貼り付けます
  • :wファイルを保存する(書き込む)場合は入力します
  • :q! 入力せずに終了する
  • :wq保存または終了するZZまたはZZ

テキストをたくさん編集する場合は、Dvorakのキーボードレイアウトに切り替え、タッチタイプを学び、vimを学んでください。 努力する価値はありますか? はい。


ProTip™:履歴を書き換える "危険な"コマンドを試すことを恐れないでください* - Gitはデフォルトでコミットを90日間削除しません。 あなたはreflogでそれらを見つけることができます:

$ git reset @~3   # go back 3 commits
$ git reflog
c4f708b [email protected]{0}: reset: moving to @~3
2c52489 [email protected]{1}: commit: more changes
4a5246d [email protected]{2}: commit: make important changes
e8571e4 [email protected]{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* --hard--forceようなオプションは--hard 。データを破棄することができます。
* また、コラボレーションしているブランチの履歴は書き換えないでください。


最後の間違ったコミットメッセージを新しいコミットメッセージで1行に更新する:

git commit --amend -m "your new commit message"

または、以下のようにgit resetを試してください:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# it will reset you last commit. Now, you
# can re-commit it with new commit message.

リセットを使用してコミットを小さなコミットに分割する

git resetは一つのコミットを複数のコミットに分割するのに役立ちます:

# reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (you can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# add and commit your files seperately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

ここでは、最後のコミットを2つのコミットに分割しました。


最新のコミット使用を編集したいだけの場合:

git commit --amend

または

git commit --amend -m 'one line message'

しかし、行の中で複数のコミットを編集する場合は、代わりにリベースを使用する必要があります。

git rebase -i <hash of one commit before the wrong commit>

上記のようなファイルで、edit / eまたは他のオプションの1つを書き、保存して終了します。

今すぐ最初の間違ったコミットになります。 ファイルを変更すると、自動的にステージングされます。 タイプ

git commit --amend

保存して終了してから入力してください

git rebase --continue 

すべての選択が終了するまで次の選択に移動します。

これらのことは、その特定のコミット後にすべてのSHAハッシュを変更することに注意してください。


私はこの方法が好きです。

git commit --amend -c <commit ID>

それ以外の場合は、新しいコミットIDを持つ新しいコミットが作成されます


私は次のものを使いたい:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>

リモートブランチ(GitHub / Bitbucket)にコードをプッシュしていない場合は、次のようにコマンドラインでコミットメッセージを変更できます。

 git commit --amend -m "Your new message"

特定のブランチで作業している場合は、次のようにします。

git commit --amend -m "BRANCH-NAME: new message"

すでに間違ったメッセージでコードをプッシュした場合、メッセージを変更するときは注意が必要です。つまり、コミットメッセージを変更してから再度プッシュしようとすると、問題が発生します。円滑にするには、次の手順を実行します。

それを行う前に私の答えをすべてお読みください。

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

重要な注意:強制押しを直接使用すると、他の開発者が同じブランチで作業しているコードの問題が発生する可能性があります。したがって、これらの競合を回避するには、フォースプッシュを行う前にブランチからコードを取得する必要があります。

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

コミット・メッセージがすでにプッシュされている場合は、コミット・メッセージを変更するときにはこれがベスト・プラクティスです。


私はそれに打ち間違いでコミットを押し込んだことに気付きました。元に戻すために、私は次のことをしました:

git commit --amend -m "T-1000, advanced prototype"
git push --force

警告:変更を強制的に押すと、リモートブランチがローカルブランチで上書きされます。あなたが保持したいものを上書きしないようにしてください。他の誰かがあなたとブランチを共有している場合は、書き直したばかりのコミットの古いコピーがあれば、自分の履歴を書き直す必要があるので、修正された(書き直された)コミットを強制することにも注意してください。







amend