Git'i değiştirmek için Git'te birkaç taahhüt nasıl değiştirilir?


180

Git'te bir dizi taahhütte bulundum ve şimdi kullanıcı adımı ve kullanıcı e-posta özelliklerimi (yeni makine) ayarlamayı unuttuğumu anlıyorum. Bu taahhütleri henüz havuzuma itmedim, bu yüzden bunu yapmadan önce bu taahhütleri nasıl düzeltebilirim (ana dalda sadece son 3 taahhüt)?

Ben bakarak edilmiştir git resetve git commit -C <id> --reset-author, ama ben doğru yolda olduğumu sanmıyorum.


1
E-posta özelliğini değiştirmek isteyebileceğiniz başka bir neden de bu github hatası: remote: error: GH007: Your push would publish a private email address.... `! [uzaktan reddedildi] master -> master (e-posta gizliliği kısıtlamaları nedeniyle push reddedildi) `.
craq

Yanıtlar:


232

Filtre kolu gücü parmaklarınızın ucunda olduğunda, yeniden oluşturma / değişiklik verimsiz görünüyor:

git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
     GIT_AUTHOR_EMAIL=correct@email;
     GIT_AUTHOR_NAME="Correct Name";
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
     GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all

(netlik için çizgiler arasında bölün, ancak gerekli değildir)

İşiniz bittiğinde sonucu kontrol ettiğinizden, kastetmediğiniz bir şeyi değiştirmediğinizden emin olun!


biraz daha açıklamak ister misiniz? ne filtre dalı emin değilim
max pleaner

1
@maxpleaner git filter-branch --helpis pretty straightforward :)
alediaferia

3
ayrıca bkz help.github.com/articles/changing-author-info de ekler ki, --tag-name-filter cathiç filter-branchyeni tarihe geçirmek etiketleri için. Ayrıca , yalnızca şube ve etiket geçmişini yeniden yazan ve diğerlerini tek başına bırakan ( --branches --tagsbunun yerine, örneğin kullanmıyorsanız muhtemelen çok fazla fark --allrefsgit-notes
yaratmaz

12
Bu gerçekleştirmek için sadece son iki hareketin kaydedilmesini, ben yerini -- --allileHEAD~1..HEAD
nmz787

1
@ nmz787 Eğer yaparsanız kaç günlük gösterilir git log HEAD~2..HEAD?
Jona

148

Interaktif rebase yaklaşımı exec ile birlikte kullanıldığında oldukça güzel. Belirli bir taahhüde veya rebase'deki tüm taahhütlere karşı herhangi bir kabuk komutunu çalıştırabilirsiniz.

Önce git yazar ayarlarınızı yapın

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

Daha sonra verilen SHA'dan sonraki tüm taahhütler için yazarı sıfırlamak için

git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"

Bu, değişiklikleri onaylamak için düzenleyicinizi açacaktır. Burada yapmanız gereken tek şey kaydetmek ve çıkmak ve her bir taahhüdü gözden geçirecek ve -x bayrağında belirtilen komutu çalıştıracaktır.

Aşağıdaki @ Dave'in yorumuna göre, orijinal zaman damgalarını korurken yazarı da değiştirebilirsiniz:

git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"

3
Beni -x seçeneğiyle tanıştırdığın için teşekkür ederim. Oldukça harika! -i seçeneği için son 4 işlemdeki e-posta adresimi düzeltmek için HEAD ~ 4 kullandım. bir cazibe gibi çalıştı.
Brad Hein

2
Bu filter-branchsadece son taahhütlerinizi düzeltmek istediğinizden çok daha basit :). Ancak, bunun taahhütlerin zaman damgasını değiştirdiğini unutmayın.
luator

24
Yazarı değiştirmek ancak orijinal zaman damgalarını korumak içingit rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
Dave

2
@Connor git logda benim için eski yazarlık gösterdi, ama git durumu yeni taahhütleri doğru bir şekilde belirledi ve zorlamanın ardından istediğim gibi oldular.
Dan M.

6
Kök kullanımı dahil tüm taahhütleri yeniden adlandırmak için: git rebase -i --root …bir SHA'yı geçmek yerine.
gfullam

80

Yazarı yalnızca son taahhütte değiştirmek için:

git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

Yazarı yalnızca son N işlem için değiştirmek istediğinizi varsayalım:

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

NOTLAR

  • --no-editbayrak markaları emin git commit --amendekstra onay sormuyor
  • kullandığınızda git rebase -i, yazarın değiştirileceği taahhütleri manuel olarak seçebilirsiniz,

düzenlediğiniz dosya şöyle görünür:

pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix

1
kökten gelen tüm taahhütler için. git rebase -i - kök UPTO_COMMIT_SHA -x "git commit --amend --author 'NEW_CHANGE' --no-edit"
Ashish Negi

1
Bazı birleştirmeler içeriyorsa, şubenizin topolojisini sağlam tutmak için --rebase-merges(kısa -r) seçenek eklemenizi öneririm .
donquixote

4

Bu yöntem bu amaçla github tarafından belgelenmiştir. Adımlar:

  1. Terminali açın ve repodan çıplak bir klon yapın
git clone --bare https://github.com/user/repo.git
cd repo
  1. Düzenleme Aşağıdaki komut dosyası (değiştirirken OLD_EMAIL, CORRECT_EMAILve CORRECT_NAME)
#!/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
  1. Komut dosyasını kopyalayıp terminalinize yapıştırın ve çalıştırmak için enter tuşuna basın.
  2. Değişikliklerinizi itin git push --force --tags origin 'refs/heads/*'ve işiniz bitti!

GitHub'da başvuruda bulunduğunuz talimatları uyguladım ve GitHub şu anda görünüyor. Ancak ben bir Git yeniyim ve bundan sonra yerel repo'mı nasıl senkronize edeceğimden emin değilim. Çektiğimde, başka bir cevapta belirtilen aynı "ilgisiz geçmişleri birleştirmeyi reddetmek" hatasını alıyorum. Sanırım bu yeni taahhüt tarihine karşı yeniden tembellik etmeliyim, ama daha spesifik adımları takdir ediyorum.
enigment

@enigment, github'da olduğu gibi repodan memnunsanız, yerel olarak sahip olduğunuz klasörü silebilir (veya başka bir yere taşıyabilirsiniz) ve
github'dan

Teşekkürler, biliyorum, ama bu deyimsel GitHub / Git yolu gibi görünmüyor.
1919'da


0

Azaltma ve değiştirme konusunda güvensiz hissediyorsanız, bunu bu şekilde yapabilirsiniz. Aynı zamanda, muhtemelen yapmak istediğiniz global yapılandırmayı da ayarlamış olursunuz.

git reset HEAD~ (son taahhüdü geri al)

git config --global user.name "Your Name"

git config --global user.email you@example.com

git commit -m "message"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.