履歴の特定のコミットの作成者を変更したい。これは最後のコミットではありません。
この質問について知っています-gitでコミットの作成者を変更するにはどうすればよいですか?
しかし、私は何かを考えています。そこでは、コミットをハッシュまたはショートハッシュで識別します。
履歴の特定のコミットの作成者を変更したい。これは最後のコミットではありません。
この質問について知っています-gitでコミットの作成者を変更するにはどうすればよいですか?
しかし、私は何かを考えています。そこでは、コミットをハッシュまたはショートハッシュで識別します。
回答:
変更が必要なコミットよりも履歴の早い時点からインタラクティブにリベース(git rebase -i <earliercommit>
)。リベースされたコミットの一覧では、からのテキストを変更pick
するedit
変更したい1のハッシュの隣にあります。次に、gitがコミットを変更するように求めてきたら、これを使用します。
git commit --amend --author="Author Name <email@address.com>" --no-edit
たとえば、あなたのコミットの歴史がある場合A-B-C-D-E-F
でF
のようにHEAD
、あなたはの作者を変更したいC
とD
あなたが希望、...
git rebase -i B
(ここに、git rebase -i B
コマンドを実行した後に表示される例を示します)
A
、git rebase -i --root
C
してD
からpick
にedit
:wq
)。C
git commit --amend --author="Author Name <email@address.com>"
git rebase --continue
D
git commit --amend --author="Author Name <email@address.com>"
再びgit rebase --continue
git push -f
更新されたコミットでオリジンを更新するために使用します。git rebase -i <commit>
vim
ます。保存して終了するには、Esc:wq Enterと入力します。一方、Nanoで、下部に「WriteOut:^ O」のようなものが表示される場合は、代わりにCtrl + O、Enter、Ctrl + Xを使用する必要があります。
--no-edit
オプションを使用します。git commit --amend --reset-author --no-edit
エディターを開きません。git 1.7.9以降で使用可能です。
git rebase -i --root
受け入れ答えこの質問には、対話型リベースの素晴らしく巧妙な使用であるが、私たちは、その後にマージされたブランチ上にあるように使用するの作者を変更しようとしているコミット。より一般的に、それは仕事をしない場合には、残念ながら競合を示し、乱雑な履歴を処理するとき。
私はgit履歴を書き換えるために環境変数の設定と設定解除に依存するスクリプトを実行することに不安があるので、この投稿に基づいて、この答えに似ていますがより完全な新しい答えを書いています。
以下は、リンクされた回答とは異なり、テストされて機能しています。説明をわかりやすく03f482d6
するために、作成者が置き換えようとして42627abe
いるコミットであり、新しい作成者とのコミットであると想定します。
変更しようとしているコミットをチェックアウトします。
git checkout 03f482d6
著者を変更します。
git commit --amend --author "New Author Name <New Author Email>"
これで、ハッシュをと想定した新しいコミットができました42627abe
。
元のブランチをチェックアウトします。
ローカルで古いコミットを新しいコミットに置き換えます。
git replace 03f482d6 42627abe
置き換えに基づいて、将来のすべてのコミットを書き換えます。
git filter-branch -- --all
清潔さのために交換品を取り外します。
git replace -d 03f482d6
新しい歴史を押して(下記に障害が発生した場合にのみ、--force使用、およびだけで正気を確認した後git log
、および/またはgit diff
)。
git push --force-with-lease
4-6の代わりに、新しいコミットにリベースすることができます:
git rebase -i 42627abe
git rebase -i
。このgit replace
ことは聞いたことがない。+1
--force-with-lease
代わりに使用することをお勧めします-f
。安全です。
git filter-branch -- --all
元のコミットがあったすべてのブランチでコミットを変更していることに注意してください。十分な資格情報がない場合(または単に他のブランチの履歴を変更したくない場合)、この回答に注意することをお勧めします。
Githubのドキュメントには、ブランチ内のすべてのコミットのコミッター情報を置き換えるスクリプトが含まれています。
変数値を変更した後、ターミナルから次のスクリプトを実行します
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
修正された履歴をGitHubにプッシュします。
git push --force --tags origin 'refs/heads/*'
または、ブランチの選択した参照をプッシュしたい場合は、
git push --force --tags origin 'refs/heads/develop'
clone
/の使用を避けた場合push
、バックアップの名前空間が作成されることに注意してくださいrefs/original/
。私はこの名前空間をインテリジェントに削除する方法を見つけることができなかったので、ディレクトリを削除してしまい.git/refs/original
ました。
git push -f
ように、リポジトリへのプッシュ変更を強制する必要があります。
メールを設定にグローバルにリセットします。
git config --global user.email example@email.com
次に、編集を必要とせずにコミットの作成者をリセットします。
git commit --amend --reset-author --no-edit
It's not last commit.
では、どうすればよいでしょうamend
か?
git reset HEAD~
、を実行し、提案された行を実行してから、次のコミットを手動で再度実行しました。うまくいきました!
git config --local user.name FirstName LastName
とを使用して設定しますgit config --local user.email first.last@example.com
。次に、を使用して最後の6つのコミットに適用しますgit rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
。最後に、を使用してリモートGitリポジトリにプッシュしgit push --force-with-lease
ます。
以下のコマンドを使用して、最後のコミットの作成者を変更できます。
git commit --amend --author="Author Name <email@address.com>"
ただし、複数のコミットの作成者名を変更する場合は、少し注意が必要です。インタラクティブなリベースを開始し、コミットを編集済みとしてマークし、1つずつ修正して終了する必要があります。
でリベースを開始しgit rebase -i
ます。このようなものを表示します。
著者名を変更するコミットのpick
キーワードをに変更しedit
ます。
次に、エディターを閉じます。初心者の場合、ヒットしてEscape
から入力:wq
してヒットしますEnter
。
その後、何も起こらなかったようにあなたの端末が表示されます。実際には、インタラクティブなリベースの最中です。次に、上記のコマンドを使用してコミットの作成者名を修正します。エディターが再び開きます。終了して、でリベースを続行しgit rebase --continue
ます。編集するコミット数についても同じ手順を繰り返します。No rebase in progress?
メッセージを受け取ったら、インタラクティブなリベースが完了したことを確認できます。
pick
アクションを許可して、各行の後に追加することもできますexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
リンクした質問の回答は良い回答であり、状況をカバーしています(他の質問は、複数のコミットの書き換えを伴うため、より一般的です)。
試す口実として、git filter-branch
特定のコミットの作成者名または作成者のメール、あるいはその両方を書き換えるスクリプトを書きました。
#!/bin/sh
#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
# If -f is supplied it is passed to "git filter-branch".
#
# If <branch-to-rewrite> is not provided or is empty HEAD will be used.
# Use "--all" or a space separated list (e.g. "master next") to rewrite
# multiple branches.
#
# If <new-name> (or <new-email>) is not provided or is empty, the normal
# user.name (user.email) Git configuration value will be used.
#
force=''
if test "x$1" = "x-f"; then
force='-f'
shift
fi
die() {
printf '%s\n' "$@"
exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"
TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL
filt='
if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
if test -n "$TARG_EMAIL"; then
GIT_AUTHOR_EMAIL="$TARG_EMAIL"
export GIT_AUTHOR_EMAIL
else
unset GIT_AUTHOR_EMAIL
fi
if test -n "$TARG_NAME"; then
GIT_AUTHOR_NAME="$TARG_NAME"
export GIT_AUTHOR_NAME
else
unset GIT_AUTHOR_NAME
fi
fi
'
git filter-branch $force --env-filter "$filt" -- $br
前にコミット:
すべてのコミットの作成者を修正するには、@ Amberの回答からコマンドを適用できます。
git commit --amend --author="Author Name <email@address.com>"
または、名前と電子メールを再利用するには、次のように書くだけです。
git commit --amend --author=Eugen
コマンドの後にコミットします。
たとえば、以下から始まるすべてを変更するには4025621
:
実行する必要があります:
git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621
注:名前や電子メールアドレスなどのスペースを含む著者を含めるには、著者をエスケープされた引用符で囲む必要があります。例えば:
git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621
またはこのエイリアスをに追加し~/.gitconfig
ます:
[alias]
reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --
次に実行します:
git reauthor 4025621 Eugen
git shortlog -e -s
。
これを行うgit rebase -i
と、ドキュメントに次の興味深い部分があります。
あなたが一つに二つ以上のコミットを折るしたい場合は、コマンドを交換
"pick"
して目以降のコミットのため"squash"
か"fixup"
。コミットの作成者が異なる場合、折りたたまれたコミットは最初のコミットの作成者に帰属します。折りたたまれたコミットの推奨コミットメッセージは、最初のコミットのコミットメッセージと"squash"
コマンドを使用したコミットメッセージを連結したものですが、コマンドを使用したコミットのコミットメッセージは省略しています"fixup"
。
A-B-C-D-E-F
、B
とD
、(= 2つのコミットをして)その後、あなたは行うことができます:
git config user.name "Correct new name"
git config user.email "correct@new.email"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
の親を選択しB
ます。pick
したくなるでしょうsquash
。git rebase -i B^
あなたに与えるものの例:
pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty
これを次のように変更します。
# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message
メッセージを編集するように求められます。
# This is a combination of 2 commits.
# The first commit's message is:
empty
# This is the 2nd commit message:
...some useful commit message there...
最初の数行を削除するだけです。
Eugen Konkov応答を促進するために、ルートコミットから開始するには、--root
フラグを使用します。--no-edit
フラグがあまりにも便利です
git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
ユーザーをすばやく変更でき、他のコミットに副作用がない方法を見つけます。
git config user.name "New User"
git config user.email "newuser@gmail.com"
git log
git rebase -i 1f1357
# change the word 'pick' to 'edit', save and exit
git commit --amend --reset-author --no-edit
git rebase --continue
git push --force-with-lease
git log
git config user.name "New User"
git config user.email "newuser@gmail.com"
git rebase -i 1f1357
# change word pick to edit, save and exit
edit 809b8f7 change code order
pick 9baaae5 add prometheus monitor kubernetes
edit 5d726c3 fix liquid escape issue
edit 3a5f98f update tags
pick 816e21c add prometheus monitor kubernetes
Stopped at 809b8f7... change code order
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
refs/heads/master.
# each continue will show you an amend message
# use git commit --amend --reset-author --no-edit to comfirm
# use git rebase --skip to skip
git commit --amend --reset-author --no-edit
git rebase --continue
git commit --amend --reset-author --no-edit
...
git rebase --continue
Successfully rebased and updated refs/heads/master.
git push --force-with-lease
変更するコミットが最後のコミットでない場合は、以下の手順に従ってください。コミットが別のブランチにある場合は、最初にそのブランチに切り替えます。
git checkout branch_name
変更するコミットの前にコミットを見つけ、そのハッシュを見つけます。次に、rebaseコマンドを発行します。
git rebase -i -pコミットのハッシュ
次に、エディターが開き、変更するコミットの「編集」を入力します。デフォルトの「選択」オプションを使用して他のユーザーを残します。変更したら、「esc」キーとwqを入力します。出る。
次に、修正オプションを指定してgit commitコマンドを発行します。
git commit --amend --author = "Username email" --no-edit
次に、次のコマンドを発行します。
git rebase-続行
コミット作成者がローカルリポジトリで更新されたら、変更をリモートリポジトリにプッシュします。
特に、変更したいコミットが複数ある場合は、この問題に対する遅延アプローチもあります。私の場合、私は間違った作者とのいくつかのコミットを持つ新しいブランチを持っていたので、何が私を助けました:
元のブランチに移動します。
git checkout develop
それから新しいブランチを作成します。
git checkout -b myFeature develop
コミット情報なしで1つのコミットとしてマージします。
git merge --no-commit --squash branchWrongAuthor
変更をステージングすることもできます。
git stage .
著者の名前を変更し、変更をコミットします。
git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"
それだけです。変更をプッシュできます。
git push
その後、間違った作者のブランチを削除できます。
コミットがプッシュされた後に著者名を変更する手順
git rebase i HEAD〜10(10はrebaseに表示する合計コミット数)
If you Get anything like below
fatal: It seems that there is already a rebase-merge directory, and
I wonder if you are in the middle of another rebase. If that is the
case, please try
git rebase (--continue | --abort | --skip)
If that is not the case, please rm -fr
".git/rebase-merge"
and run me again. I am stopping in case you still have something
valuable there.
次に、必要に応じて「git rebase --continue」または「git rebase --abort」と入力します
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
次に、以下のように、編集したいコミットのすぐ下に以下のコマンドを追加する必要があります
pick 897fe9e simplify code a little
exec git commit --amend --author 'Author Name <author.name@mail.com>'
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>'
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <author.name@mail.com>'
それだけです、今すぐESC、:wqを押すだけですべて完了です
次にgit push origin HEAD:BRANCH NAME -f [-f Force pushに注意してください]
好き git push -f
かgit push origin HEAD: dev -f
git push
です。コマンドの例でポイント6を更新できますか?
コミッターの名前とメールをグローバルに変更する:
$ git config --global user.name "John Doe"
$ git config --global user.email "john@doe.org"
リポジトリごとにコミッター名とメールアドレスを変更する:
$ git config user.name "John Doe"
$ git config user.email "john@doe.org"
次のコミットのために著者情報を変更する:
$ git commit --author="John Doe <john@doe.org>"
ヒント:その他の状況や詳細については、投稿のリファレンスをご覧ください。
これらのコマンドはgithubの公式ページから使用できます
https://help.github.com/en/github/using-git/changing-author-info
ここにコマンドがあります
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
ここで、古いメールを新しいユーザー名とメールアドレスに変更できます。