Haluan vaihtaa yhden tietyn toimituksen tekijän historiassa. Se ei ole viimeinen toimitus.
Tiedän tästä kysymyksestä - Miten vaihdan commitin tekijän gitissä?.
Mutta ajattelen jotain, jossa tunnistan commitin hashin tai short-hashin avulla.
Interaktiivinen uudelleenkäyttö aikaisemmasta kohdasta historiassa kuin se komitoitus, jota haluat muuttaa (git rebase -i <earliercommit>
). Vaihda uudelleenperustettavien komitusten luettelossa sen komituksen, jota haluat muuttaa, hashin vieressä oleva teksti pick
:stä edit
:ksi. Sitten kun git pyytää sinua muuttamaan toimitusta, käytä tätä:
git commit --amend --author="Author Name <[email protected]>"
Jos esimerkiksi komentohistoriasi on A-B-C-D-E-F
, jossa F
on HEAD
, ja haluat vaihtaa C
:n ja D
:n kirjoittajan, niin...
git rebase -i B
(tässä on esimerkki siitä, mitä näet komennon git rebase -i B
suorittamisen jälkeen).A
:ta, käytä git rebase -i --root
.C
:n että D
:n rivit pick
:stä edit
:ksi.C
.git commit --amend --author="Author Name <[email protected]>"
git rebase --continue
.D
.git commit --amend --author="Author Name <[email protected]>"
uudelleengit rebase --continue
git push -f
päivittääksesi origon päivitetyillä komennoilla.Linkittämäsi kysymyksen vastaukset ovat hyviä vastauksia ja kattavat tilanteesi (toinen kysymys on yleisempi, koska siihen liittyy useiden komentojen uudelleenkirjoittaminen).
Tekosyynä kokeillakseni git filter-branchia
kirjoitin skriptin, joka kirjoittaa uudelleen tekijän nimen ja/tai tekijän sähköpostin tietylle toimitukselle:
#!/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
Kun teet git rebase -i
, dokumentissa on tämä mielenkiintoinen kohta:
Jos haluat yhdistää kaksi tai useampia komentoja yhdeksi, korvaa komento
"pick"
toisen ja sitä seuraavien komentojen osalta komennolla"squash"
tai"fixup"
. Jos komennoilla oli eri kirjoittajat, taitetun komennon kirjoittaja on ensimmäisen komennon kirjoittaja. Taitetun komennon ehdotettu komentoviesti on ensimmäisen komennon ja komennon"squash"
komennolla tehtyjen komentojen komentoviestien yhdistelmä, mutta siitä jätetään pois komentojen komentoviestit, joissa on komento"fixup"
.
A-B-C-D-E-F
,B
ja D
(= 2 kommittiä),voit tehdä näin:
git config user.name "Correct new name"
git config user.email "[email protected]"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
valitsee B
:n vanhemman.pick
tilalle squash
.Esimerkki siitä, mitä git rebase -i B^
antaa sinulle:
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
muuta se seuraavasti:
# 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
Se pyytää sinua muokkaamaan viestejä:
# 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...
ja voit vain poistaa muutaman ensimmäisen rivin.