質問
歴史における1つの特定のコミットの著者を変更したいと思います。それは最後のコミットではありません。
私はこの質問について知っています - Gitでのコミットの著者を変更するにはどうすればよいですか?
しかし、私は何かについて考えています。そこでは、ハッシュまたはショートハッシュによるコミットメントを特定します。
解決
あなたが変更する必要があるコミットよりも、歴史の早い段階のポイントからインタラクティブなリベース(git rebase -i <earliercommit>
)。コミットのリストでrebasedされている場合は、テキストをから変更します pick
に edit
変更するもののハッシュの隣。次に、gitがコミットを変更するように求められたら、これを使用してください。
git commit --amend --author="Author Name <email@address.com>"
たとえば、コミット履歴がそうである場合 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
- リベースが始まると、最初に一時停止します
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の履歴を書き直すための環境変数の設定と未解決の変数に依存するスクリプトを実行することに不安を抱いているので、私はに基づいて新しい答えを書いています この郵便受け に似ています この答え しかし、より完全です。
リンクされた答えとは異なり、以下はテストされ、動作します。それを明確にするために想定します 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
新しい履歴をプッシュします(以下が失敗した場合に使用する - フォースのみを使用し、正気がチェックした後にのみ
git log
および/またはgit diff
).git push --force-with-lease
4-6の代わりに、新しいコミットに戻すことができます。
git rebase -i 42627abe
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
メールをグローバルに構成にリセットします。
git config --global user.email example@email.com
ここで、編集せずにあなたのコミットの著者をリセットします:
git commit --amend --reset-author --no-edit
以下のコマンドを使用して、最後のコミットの著者を変更できます。
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?
メッセージ。
あなたがリンクした質問の答えは良い答えであり、あなたの状況をカバーしています(他の質問は複数のコミットの書き換えを伴うため、より一般的です)。
試してみる言い訳として 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
追加のステップが1つあります アンバーの答え 集中リポジトリを使用している場合:
git push -f
中央リポジトリの更新を強制する。
一貫性を台無しにする可能性があるため、同じブランチで働いている人は多くないことに注意してください。
やったとき git rebase -i
ドキュメントにはこの興味深いビットがあります:
2つ以上のコミットを1つに折りたたむ場合は、コマンドを交換します
"pick"
2番目とその後のコミットメントのために"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"
- 空のコミットを作成します(コミットごとに1つ):
- Rebaseの目的のためのメッセージが必要です
git commit --allow-empty -m "empty"
- リベース操作を開始します
git rebase -i B^
B^
の親を選択しますB
.
- 空のコミットを1つ置きたいと思うでしょう 前 それぞれが変更にコミットします
- あなたは変えたいと思うでしょう
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 push -f origin last_commit_hash:branch_name
コミットの著者名を変更してください。
git commit --amend --author "type new author here"
コードを開いて再び開くエディターを終了します。
git push
また、この問題には怠zyなアプローチがあります。特に、変更したいというコミットを複数持っている場合はそうです。私の場合、私は間違った著者といくつかのコミットメントを持つ新しい支店を持っていたので、何が私を助けたのか:
元のブランチに移動します:
git checkout develop
そこから新しいブランチを作成します:
git checkout -b myFeature develop
コミット情報なしでそれをマージします。
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チェックアウトbranch_name
変更したいコミットの前にコミットを見つけて、ハッシュを見つけます。次に、Rebaseコマンドを発行します。
git rebase -i -p commitのハッシュ
その後、エディターが開き、変更したいコミットのために「編集」します。他の人にデフォルトの「ピック」オプションを残します。変更されたら、「ESC」キーとWQを入力します!出る。
次に、修正オプションでGit Commitコマンドを発行します。
git commit -amend -author = "username email" - no-edit
次に、次のコマンドを発行します。
git rebase - continue
Commit著者がローカルリポジトリで更新されたら、変更をリモートリポジトリにプッシュします。
コミットプッシュ後に著者名を変更する手順
- コミットIDと詳細を取得するための最初のタイプ「git log」
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」または「git rebase- abort」と入力します
- これで、ウィリューズウィンドウが開き、キーボードから「i」キーをクリックします
- 次に、下記のように、コミットのリストを10にします。
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:ブランチ名-f [-f Force Pushの世話をしてください
お気に入り
git push -f
またgit push origin HEAD: dev -f