Interaktywny rebase z punktu wcześniejszego niż zatwierdzenie, które należy zmodyfikować ( git rebase -i <earliercommit>). Na liście zatwierdzanych rebasingów zmień tekst z pickna editobok hasha tego, który chcesz zmodyfikować. Następnie, gdy git wyświetli monit o zmianę zatwierdzenia, użyj tego:
git commit --amend --author="Author Name <email@address.com>" --no-edit
Na przykład, jeśli popełnić historia jest A-B-C-D-E-Fz Fjak HEAD, i chcesz zmienić autora Ci D, to byś ...
Dobra odpowiedź, ale dla początkujących: najpierw znajdź zatwierdzenie poprzedzające ten, który chcesz zmienić, a następnie uruchomgit rebase -i <commit>
Jeśli nie wiesz, w którym edytorze jesteś, odpowiedź jest prawdopodobna vim. Aby zapisać i wyjść, wpisz Esc: wq Enter. Z drugiej strony, jeśli jest to Nano i widzisz na dole takie rzeczy jak „WriteOut: ^ O”, powinieneś zamiast tego użyć Ctrl + O, Enter, Ctrl + X.
Odpowiedź Zaakceptowany na to pytanie jest cudownie mądre wykorzystanie interaktywnej rebase, ale niestety wykazuje konfliktów czy popełnić staramy się zmienić autor kiedyś na oddział, który został następnie połączyła się. Bardziej ogólnie, to nie działa podczas obsługi niechlujnych historii.
Ponieważ obawiam się uruchamiania skryptów, które zależą od ustawiania i wyłączania zmiennych środowiskowych w celu przepisania historii git, piszę nową odpowiedź na podstawie tego postu, która jest podobna do tej odpowiedzi ale jest bardziej kompletna.
Poniższe jest testowane i działa, w przeciwieństwie do połączonej odpowiedzi. Załóżmy dla jasności prezentacji, że 03f482d6jest to zatwierdzenie, którego autora próbujemy zastąpić, i 42627abejest to zatwierdzenie z nowym autorem.
Sprawdź zatwierdzenie, które próbujemy zmodyfikować.
git checkout 03f482d6
Zmień autora.
git commit --amend --author "New Author Name <New Author Email>"
Teraz mamy nowe zatwierdzenie z haszem, o którym się mówi 42627abe.
Kasa oryginalnego oddziału.
Zamień stare zatwierdzenie na nowe lokalnie.
git replace 03f482d6 42627abe
Przepisz wszystkie przyszłe zatwierdzenia na podstawie zamiany.
git filter-branch -- --all
Usuń zamiennik dla czystości.
git replace -d 03f482d6
Wciśnij nową historię (użyj --force, jeśli poniżej nie powiedzie się i tylko po sprawdzeniu poczytalności za pomocą git logi / lub git diff).
git push --force-with-lease
Zamiast 4-6 możesz po prostu zmienić bazę na nowe zatwierdzenie:
OSTRZEŻENIE: pamiętaj, że git filter-branch -- --allzmienia zatwierdzenia we wszystkich gałęziach, w których znajdowało się oryginalne zatwierdzenie. Jeśli nie masz wystarczających poświadczeń (lub po prostu nie chcesz zmieniać historii oddziałów innych osób), dobrze jest zachować ostrożność przy tej odpowiedzi.
Kiedy znalazłem tę odpowiedź po przeczytaniu poprzednich, pomyślałem, że warto spróbować i voila to zadziałało. Jednak w moim przypadku zmieniła nazwę osoby odpowiedzialnej tylko przy początkowym zatwierdzeniu. Nawiasem mówiąc, zanim spróbowałem pomysłów z pierwszej odpowiedzi. Może w jakiś sposób wpłynęło to na system.
Pamiętaj, że jeśli unikniesz używania clone/ push, powstanie zapasowa przestrzeń nazw refs/original/. Nie mogłem znaleźć sposobu na inteligentne usunięcie tej przestrzeni nazw, więc skończyłem z usuwaniem katalogu .git/refs/original, który zadziałał.
Mój przypadek użycia tej odpowiedzi to: Mam dwa konta github, jedno, którego nieumyślnie wykorzystałem do zatwierdzenia. Ten skrypt pomógł naprawić wszystkie moje zatwierdzenia, zmieniając nazwę niepoprawnego adresu e-mail / nazw osoby zatwierdzającej. Oczywiście, jeśli popełniłem błąd z niewłaściwym użytkownikiem, powiedzmy, od 50. zatwierdzenia do 500. zatwierdzenia, będzie 450 rozbieżnych zatwierdzeń. W każdym razie, po uruchomieniu skryptu, jak zauważył @andrej, musisz git push -fwymusić zmiany wypychane w repozytorium.
To wspaniale, szkoda, że to tylko ostatnie zatwierdzenie. Potrzebowałem go na dwóch ostatnich, na szczęście, więc właśnie zrobiłem a git reset HEAD~, sprawdziłem sugerowane linie, a następnie ponownie wykonałem następne zatwierdzenie ręcznie. Działało dobrze!
Aby naprawić moje ostatnie sześć zmian: Najpierw ustaw poprawnego autora dla bieżącego repozytorium Git, używając git config --local user.name FirstName LastName i git config --local user.email first.last@example.com. Następnie zastosuj do ostatnich sześciu zatwierdzeń za pomocą git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6. Wreszcie wypchnij go do zdalnego repozytorium Git za pomocą git push --force-with-lease.
Możesz zmienić autora ostatniego zatwierdzenia za pomocą poniższego polecenia.
git commit --amend --author="Author Name <email@address.com>"
Jednak jeśli chcesz zmienić więcej niż jedno nazwisko autora, jest to nieco trudne. Musisz uruchomić interaktywny rebase, następnie zaznaczyć commits jako edycję, a następnie zmieniać je jeden po drugim i zakończyć.
Zacznij bazować na git rebase -i. Pokaże ci coś takiego.
Zmień picksłowo kluczowe na editdla commits, które chcesz zmienić nazwisko autora.
Następnie zamknij edytor. Dla początkujących naciśnij, Escapea następnie wpisz :wqi naciśnij Enter.
Wtedy zobaczysz swój terminal, jakby nic się nie wydarzyło. Właściwie jesteś w trakcie interaktywnej bazy. Teraz nadszedł czas na zmianę nazwy autora zatwierdzenia za pomocą powyższego polecenia. Ponownie otworzy edytor. Wyjdź i kontynuuj bazowanie za pomocą git rebase --continue. Powtórz to samo dla liczby zatwierdzeń, którą chcesz edytować. Możesz upewnić się, że interaktywny rebase zakończy się, gdy otrzymasz No rebase in progress?wiadomość.
Jeśli masz wiele zatwierdzeń do zmiany, zamiast edytować je osobno, możesz także zezwolić na pickdziałanie i dodać po każdej liniiexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
Odpowiedzi w pytaniu, do którego dałeś link, są dobrymi odpowiedziami i obejmują twoją sytuację (drugie pytanie jest bardziej ogólne, ponieważ wymaga przepisania wielu zatwierdzeń).
Jako pretekst do wypróbowania git filter-branch , napisałem skrypt, aby przepisać Nazwę autora i / lub E-mail autora dla danego zatwierdzenia:
#!/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
+1 dzięki. assemblela.com git repo nie wydaje się zmieniać wszystkich odniesień do autora w widoku sieci repo, ale wyniki „git pull / clone” wydają się działać poprawnie.
To jest odpowiedź, która najlepiej służy moim celom, dziękuję. A ponieważ chciałem tylko dostosować mój adres e-mail, po aktualizacji mojego .git / config mogłem uruchomić z --exec = "git commit --amend --reset-author".
Podczas robienia git rebase -iw dokumencie jest interesujący fragment:
Jeśli chcesz złożyć dwa lub więcej zatwierdzeń w jeden, zamień polecenie "pick"dla drugiego i kolejnych zatwierdzeń na "squash"lub "fixup". Jeśli zatwierdzenia miały różnych autorów, złożone zatwierdzenie zostanie przypisane autorowi pierwszego zatwierdzenia. Sugerowany komunikat zatwierdzenia dla złożonego zatwierdzenia jest konkatenacją komunikatów zatwierdzenia pierwszego zatwierdzenia i tych z "squash"poleceniem, ale pomija komunikaty zatwierdzenia zatwierdzeń z "fixup"poleceniem.
Jeśli masz historię A-B-C-D-E-F ,
i chcesz zmienić zatwierdzenia Bi D(= 2 zatwierdzenia),
wtedy możesz zrobić:
git config user.name "Correct new name"
git config user.email "correct@new.email"
utwórz puste zatwierdzenia (po jednym dla każdego zatwierdzenia):
potrzebujesz wiadomości dla celów rebase
git commit --allow-empty -m "empty"
rozpocznij operację rebase
git rebase -i B^
B^wybiera element nadrzędny B.
będziesz chciał wstawić jeden pusty zatwierdzenie przed każdym zatwierdzeniem do modyfikacji
będziesz chciał zmienić picksię squashdla nich.
Przykład tego, co git rebase -i B^da ci:
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
zmień to na:
# 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
Poprosi Cię o edycję wiadomości:
# 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...
i możesz po prostu usunąć kilka pierwszych wierszy.
Znajdź sposób, który może szybko zmienić użytkownika i nie wywołuje żadnych skutków ubocznych w stosunku do innych.
Prosty i przejrzysty sposób:
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
szczegółowe operacje
pokaż dzienniki zmian i znajdź identyfikator zatwierdzenia przed zatwierdzeniem, który chcesz zmienić:
git log
git rebase zaczyna od wybranego identyfikatora zatwierdzenia do ostatniego odwrotnie:
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
rebase zatrzyma się przy następnym zatwierdzeniu id, wyjście:
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
potwierdź i kontynuuj swój rebase, aż do pomyślnego 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 --continueSuccessfully rebased and updated refs/heads/master.
Jeśli zatwierdzenie, które chcesz zmienić, nie jest ostatnim zatwierdzeniem, wykonaj następujące czynności. Jeśli twoje zatwierdzenie znajduje się w innej gałęzi, najpierw przełącz się na tę gałąź.
git kasa nazwa_gałęzi
Znajdź zatwierdzenie przed zatwierdzeniem, które chcesz zmienić, i znajdź jego skrót. Następnie wydaj polecenie rebase.
git rebase -i -p hash zatwierdzenia
Następnie otworzy się edytor i wprowadzi „edytuj” dla zatwierdzeń, które chcesz zmienić. Pozostaw innym opcję domyślnej opcji „wybierz”. Po zmianie wpisz „esc” i wq! do wyjścia.
Następnie wydaj polecenie git commit z opcją zmiany.
git commit --amend --author = "Adres e-mail użytkownika" - nie można edytować
Następnie wydaj następujące polecenie.
git rebase - kontynuuj
Po zaktualizowaniu autora zatwierdzenia w lokalnym repozytorium, wypchnij zmiany do zdalnego repozytorium.
Myślę, że to najprostszy sposób na zrobienie tego. Używałem polecenia reword i to się nie udaje. Nauczyłem się, że zamiast tego muszę użyć polecenia edycji. Być może słowo kluczowe „edytuj” można wyróżnić. Dzięki za odpowiedź @ChannaB 👍
Istnieje również leniwe podejście do tego problemu, szczególnie jeśli masz więcej niż jeden zatwierdzenie, które chcesz zmienić. W moim przypadku miałem nowy oddział z kilkoma zatwierdzeniami ze złym autorem, co pomogło mi:
Przejdź do swojego oryginalnego oddziału:
git checkout develop
Utwórz z niego nowy oddział:
git checkout -b myFeature develop
Scal go bez informacji o zatwierdzeniu jako jedno zatwierdzenie:
git merge --no-commit --squash branchWrongAuthor
Możesz także wprowadzić zmiany:
git stage .
Zmień nazwisko autora i zatwierdź zmiany:
git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"
I to wszystko, możesz wprowadzić zmiany.
git push
Następnie możesz usunąć oddział z niewłaściwym autorem.
Kroki zmiany nazwy autora po wciśnięciu zatwierdzenia
Najpierw wpisz „git log”, aby uzyskać identyfikator zatwierdzenia i więcej szczegółów
git rebase i HEAD ~ 10 (10 to całkowite zatwierdzenie do wyświetlenia przy 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.
Następnie wpisz „git rebase --continue” lub „git rebase --abort” zgodnie z potrzebami
teraz otwarte zostanie okno bazy danych, kliknij klawisz „i” na klawiaturze
wtedy dostaniesz listę zatwierdzeń do 10 [ponieważ minęliśmy 10 zatwierdzeń powyżej] Jak poniżej
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
Teraz musisz dodać polecenie poniżej poniżej zatwierdzenia, które chcesz edytować, jak poniżej
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>'
To wszystko, teraz wystarczy nacisnąć ESC: wq i wszystko gotowe
Następnie git push origin HEAD: BRANCH NAME -f [zadbaj o -f Force push]
Jeśli to, co musisz zmienić, to AUTOR OSTATNEGO zatwierdzenia, a żadne inne nie korzysta z Twojego repozytorium, możesz cofnąć ostatnie zatwierdzenie za pomocą:
git push -f origin last_commit_hash:branch_name
zmień nazwę autora swojego zatwierdzenia za pomocą:
git commit --amend --author "type new author here"
Wyjdź z edytora, który się otworzy i ponownie wciśnij kod:
W przypadku komunikatu zatwierdzenia rebasekorespondencji okazało się, że nie mogę go zmienić za pomocą , przynajmniej na gitlab. Pokazuje scalenie jako zatwierdzenie, ale nie mogę bazować na tym #sha. Znalazłem ten post jest pomocny.
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
Te trzy wiersze kodu wykonały zadanie zmiany komunikatu zatwierdzenia scalania (jak autor).
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.