Tarihte belirli bir taahhüdün yazarını değiştirmek istiyorum. Bu son taahhüt değil.
Bu soruyu biliyorum - Git'teki bir taahhüdün yazarını nasıl değiştirebilirim?
Ama bir şeyi düşünüyorum, taahhütleri karma veya kısa karma ile tanımladığım.
Tarihte belirli bir taahhüdün yazarını değiştirmek istiyorum. Bu son taahhüt değil.
Bu soruyu biliyorum - Git'teki bir taahhüdün yazarını nasıl değiştirebilirim?
Ama bir şeyi düşünüyorum, taahhütleri karma veya kısa karma ile tanımladığım.
Yanıtlar:
Etkileşimli rebase, tarihte değiştirmeniz gereken bir noktadan daha erken bir noktadan ( git rebase -i <earliercommit>
). Yeniden temel alınan taahhütler listesinde, metni değiştirmek istediğiniz karma pick
değerinin edit
yanındaki ile değiştirin. Sonra git taahhüdü değiştirmenizi istediğinde şunu kullanın:
git commit --amend --author="Author Name <email@address.com>" --no-edit
Örneğin, taahhüt tarih ise A-B-C-D-E-F
ile F
olarak HEAD
ve yazarı değiştirmek istiyorum C
ve D
o zaman olur ...
git rebase -i B
( burada git rebase -i B
komutu yürüttükten sonra göreceklerinizin bir örneği verilmiştir )
A
, kullanıngit rebase -i --root
C
ve D
gelen pick
etmekedit
:wq
).C
git commit --amend --author="Author Name <email@address.com>"
git rebase --continue
D
git commit --amend --author="Author Name <email@address.com>"
tekrar yaparsıngit rebase --continue
git push -f
Başlangıç noktanızı güncellenmiş taahhütlerle güncellemek için kullanın .git rebase -i <commit>
vim
. Kaydetmek ve çıkmak için Esc: wq Enter yazın. Öte yandan, Nano ise ve alt kısımda "WriteOut: ^ O" gibi şeyler görürseniz, bunun yerine Ctrl + O, Enter, Ctrl + X kullanmalısınız.
--no-edit
seçeneği. git commit --amend --reset-author --no-edit
bir editör açmaz. Git 1.7.9'dan beri kullanılabilir.
git rebase -i --root
Kabul cevabı bu soruya interaktif rebase bir harika zeki kullanımı, ama biz sonradan birleşti bir dal üzerinde eskiden yazarına değiştirmeye çalışıyorlar işlerlerse maalesef çatışmaları sergiler. Daha genel olarak, bu işi yapmaz dağınık geçmişleri ele alırken.
Git geçmişini yeniden yazmak için ortam değişkenlerini ayarlamaya ve ayarlamaya bağlı olan komut dosyalarını çalıştırma konusunda endişeli olduğum için, bu yanıta benzer ancak daha eksiksiz olan bu gönderiye dayalı yeni bir cevap yazıyorum .
Bağlantılı cevabın aksine aşağıdakiler test edilir ve çalışır. Açıklamayı netleştirmek için 03f482d6
yazarını değiştirmeye çalıştığımız 42627abe
taahhüt ve yeni yazarla taahhüttür.
Değiştirmeye çalıştığımız taahhüdü kontrol edin.
git checkout 03f482d6
Yazarı değiştir.
git commit --amend --author "New Author Name <New Author Email>"
Şimdi hash olduğu varsayılan yeni bir taahhüdümüz var 42627abe
.
Orijinal şubeyi kontrol edin.
Eski taahhüdü yerel olarak yenisiyle değiştirin.
git replace 03f482d6 42627abe
Değişim esasına göre gelecekteki tüm taahhütleri yeniden yazın.
git filter-branch -- --all
Temizlik için yedek parçayı çıkarın.
git replace -d 03f482d6
Yeni geçmişi itin (yalnızca aşağıdakilerin başarısız olması durumunda --force kullanın ve yalnızca git log
ve / veya akıl sağlığı kontrolünden sonra git diff
).
git push --force-with-lease
4-6 yerine sadece yeni taahhütlere geri dönebilirsiniz:
git rebase -i 42627abe
git rebase -i
. Bu git replace
şeyi daha önce hiç duymamıştım . +1
--force-with-lease
yerine kullanmanızı öneririm -f
. Bu daha guvenli.
git filter-branch -- --all
Orijinal taahhüdün bulunduğu tüm şubelerde taahhütlerin değişmekte olduğunu unutmayın. Yeterli kimlik bilginiz yoksa (veya sadece başkalarının şube geçmişini değiştirmek istemiyorsanız), bu yanıta dikkat etmek iyidir.
Github dokümanları, bir daldaki tüm taahhütlerin komisyon bilgilerinin yerini alan bir komut dosyası içerir .
Değişken değerlerini değiştirdikten sonra aşağıdaki komut dosyasını terminalden çalıştırın
#!/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
Düzeltilmiş geçmişi GitHub'a aktarın:
git push --force --tags origin 'refs/heads/*'
VEYA dalların seçilen referanslarını itmek isterseniz
git push --force --tags origin 'refs/heads/develop'
clone
/ Kullanmaktan kaçınırsanız push
, bir yedek ad alanı elde edeceğinizi unutmayın refs/original/
. Bu ad alanını akıllıca kaldırmanın bir yolunu bulamadım, bu yüzden .git/refs/original
işe yarayan dizini sildim.
git push -f
push değişikliklerini zorlamanız gerekir .
E-postanızı global olarak yapılandırmaya sıfırlayın:
git config --global user.email example@email.com
Şimdi düzenleme yapmadan taahhüdünüzün yazarını sıfırlayın:
git commit --amend --reset-author --no-edit
It's not last commit.
Öyleyse nasıl olurdu amend
?
git reset HEAD~
, önerilen satırlarını çalıştırdım, sonra bir sonraki taahhüdü tekrar manuel olarak yaptım. İyi çalıştı!
git config --local user.name FirstName LastName
ve öğesini kullanarak geçerli Git repo için doğru yazarı ayarlayın git config --local user.email first.last@example.com
. Sonra kullanarak son altı taahhüt için geçerlidir git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
. Son olarak uzaktan Git repo'yu kullanarak itin git push --force-with-lease
.
Son komutu yazarını aşağıdaki komutu kullanarak değiştirebilirsiniz.
git commit --amend --author="Author Name <email@address.com>"
Ancak, birden fazla yazarın adını değiştirmek istiyorsanız, bu biraz zor. Bir etkileşimli rebase başlatmanız, taahhütleri düzenleme olarak işaretlemeniz ve bunları tek tek değiştirmeniz ve bitirmeniz gerekir.
İle yeniden baslamaya başlayın git rebase -i
. Size böyle bir şey gösterecek.
Değişim pick
için anahtar kelime edit
kaydedilmesini için yazar adını değiştirmek istiyor.
Ardından düzenleyiciyi kapatın. Yeni başlayanlar için Escape
tuşuna basın :wq
ve sonra yazın Enter
.
O zaman terminalinizi hiçbir şey olmamış gibi göreceksiniz. Aslında interaktif bir rebase'in ortasındasınız. Şimdi yukarıdaki komutu kullanarak taahhüdünüzün yazar adını değiştirme zamanı. Düzenleyiciyi tekrar açar. İle çıkın ve devam etmeye devam edin git rebase --continue
. Düzenlemek istediğiniz kayıt sayısı için aynı işlemi tekrarlayın. No rebase in progress?
İletiyi aldığınızda etkileşimli yeniden tabanın tamamlandığından emin olabilirsiniz .
pick
eyleme izin verebilir ve her satırdan sonra ekleyebilirsinizexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
Bağlantı kurduğunuz sorudaki cevaplar iyi yanıtlardır ve durumunuzu kapsar (diğer soru daha fazla taahhüttür, çünkü birden fazla taahhüt yeniden yazmayı içerir).
Denemek için bir bahane olarak git filter-branch
, belirli bir taahhüt için Yazar Adı ve / veya Yazar E-postasını yeniden yazmak için bir komut dosyası yazdım:
#!/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
Daha önce taahhüt et:
Tüm taahhütlerin yazarını düzeltmek için @ Amber'ın cevabından komut uygulayabilirsiniz:
git commit --amend --author="Author Name <email@address.com>"
Veya adınızı ve e-postanızı tekrar kullanmak için şunları yazabilirsiniz:
git commit --amend --author=Eugen
Komuttan sonra:
Örneğin, aşağıdakilerden başlayarak tümünü değiştirmek için 4025621
:
Koşmalısın:
git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621
Not: Ad ve e-posta adresi gibi boşluklar içeren bir yazarı dahil etmek için yazarın etrafı tırnak işaretleri arasında olmalıdır. Örneğin:
git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621
veya bu takma adı şuraya ekleyin ~/.gitconfig
:
[alias]
reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --
Ve sonra çalıştırın:
git reauthor 4025621 Eugen
git shortlog -e -s
.
Merkezi bir depo kullanıyorsanız Amber'in cevabına ek bir adım daha var :
git push -f
merkezi deponun güncellenmesini zorlamak.
Aynı dalda çalışan çok fazla insan olmadığına dikkat edin, çünkü tutarlılığı bozabilir.
Bunu yaparken git rebase -i
dokümanda ilginç bir kısım var:
İki veya daha fazla komutu bire katlamak istiyorsanız
"pick"
, ikinci ve sonraki işlemlerin komutunu"squash"
veya ile değiştirin"fixup"
. Komisyonların farklı yazarları olsaydı, katlanmış taahhüt ilk taahhüdün yazarına atfedilecektir. Katlanmış"squash"
komut için önerilen komut mesajı, ilk komutun ve komut içerenlerin komut mesajlarının birleştirilmesidir , ancak komutun taahhüt mesajlarını atlar"fixup"
.
A-B-C-D-E-F
,B
ve D
(= 2 taahhüt),o zaman şunları yapabilirsiniz:
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^
öğesinin üst öğesini seçer B
.pick
kadar squash
olanlar için.git rebase -i B^
Size ne vereceğine örnek :
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
bunu şu şekilde değiştirin:
# 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
Mesajları düzenlemenizi ister:
# 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...
ve ilk birkaç satırı kaldırabilirsiniz.
İçin ilerletmek Eugen Konkov tepkisi, root işlemek, kullanım başlamak --root
bayrak. --no-edit
Bayrak çok yararlıdır
git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
Kullanıcıyı hızlı bir şekilde değiştirebilecek ve başkalarının herhangi bir yan etkisi olmayan bir yol bulun.
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
Değiştirmek istediğiniz işlem son işlem değilse, aşağıdaki adımları izleyin. Taahhüdünüz farklı bir şubedeyse, önce o şubeye geçin.
git checkout şube_adı
Değiştirmek istediğiniz işlemden önce işlemeyi bulun ve karmasını bulun. Sonra rebase komutu verin.
git rebase -i -p taahhüt karması
Ardından bir düzenleyici açılır ve değiştirmek istediğiniz taahhütler için 'düzenle' girer. Varsayılan 'seç' seçeneğiyle diğerlerini bırakın. Değiştirildikten sonra 'esc' anahtarını ve wq girin! çıkışa doğru.
Sonra değişiklik seçeneği ile git kesin komutunu verin.
git commit --amend --author = "Kullanıcı adı e-postası" --no-edit
Sonra aşağıdaki komutu verin.
git rebase - devam et
Taahhüt yazarı yerel depoda güncellendiğinde, değişiklikleri uzak depoya aktarın.
Bu soruna, özellikle değiştirmek istediğiniz birden fazla taahhüdünüz varsa, tembel bir yaklaşım da vardır. Benim durumumda, yanlış bir yazarla birkaç taahhüt içeren yeni bir şubem vardı, bu yüzden bana yardımcı olan şey:
Orijinal şubenize gidin:
git checkout develop
Ondan yeni şube oluşturun:
git checkout -b myFeature develop
Taahhüt bilgisi olmadan bir taahhüt olarak birleştirin:
git merge --no-commit --squash branchWrongAuthor
Değişiklikleri aşamalı olarak da yapmak isteyebilirsiniz:
git stage .
Yazarın adını değiştirin ve değişiklikleri yapın:
git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"
Ve işte bu, değişiklikleri zorlayabilirsiniz.
git push
Bundan sonra dalı yanlış bir yazarla silebilirsiniz.
İşlem tamamlandıktan sonra yazar adını yeniden adlandırma adımları
git rebase i HEAD ~ 10 (10, rebase'de gösterilen toplam taahhüttür)
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.
Daha sonra "git rebase --continue" veya "git rebase --abort" yazın.
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
Şimdi, aşağıdaki gibi, düzenlemek istediğiniz taahhüdün hemen altına aşağıdaki komutu eklemeniz gerekir
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>'
Hepsi bu, şimdi sadece ESC tuşuna basın,: wq ve hepiniz hazırsınız
O zaman git push origin HEAD: ŞUBE ADI -f [lütfen -f Force push ile ilgilenin]
beğen git push -f
ya dagit push origin HEAD: dev -f
git push
komut örneği ile güncelleyebilir misiniz ?
Committer Adınızı ve E-postanızı Global Olarak Değiştirme:
$ git config --global user.name "John Doe"
$ git config --global user.email "john@doe.org"
Depo Başına Committer Adınızı ve E-postanızı Değiştirme:
$ git config user.name "John Doe"
$ git config user.email "john@doe.org"
Yazar Bilgilerini Sadece Bir Sonraki İşlem İçin Değiştirme:
$ git commit --author="John Doe <john@doe.org>"
İpucu : Diğer durumlar ve daha fazla bilgi için post referansını okuyun .
Değiştirmeniz gerekenler SON YAZININ YETKİSİ ise ve başka hiç kimse deponuzu kullanmıyorsa, son taahhüdünüzü geri alabilirsiniz:
git push -f origin last_commit_hash:branch_name
taahhüdünüzün yazar adını şununla değiştirin:
git commit --amend --author "type new author here"
Açılan düzenleyiciden çıkın ve kodunuzu tekrar itin:
git push
Birleştirme taahhüdü mesajı için rebase
, en azından gitlab'de kullanarak değiştiremem . Birleştirmeyi bir taahhüt olarak gösterir, ancak bu #sha'ya geri dönemem. Bu gönderiyi yararlı buldum .
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
Bu üç kod satırı, birleştirme taahhüdü mesajını (yazar gibi) değiştirme işi yaptı.
bu komutları github resmi sayfasından kullanabilirsiniz
https://help.github.com/en/github/using-git/changing-author-info
İşte komutlar
#!/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
Burada eski e-postayı ur yeni kullanıcı adı ve e-posta adresine değiştirebilirsiniz.