Belirli bir taahhüt için verilen taahhüdün yazarı nasıl değiştirilir?

Tarihte belirli bir taahhüdün yazarını değiştirmek istiyorum. Bu son söz değil.

Bu soruyu biliyorum - Git'teki bir taahhüdün yazarını nasıl değiştirebilirim?

Fakat bir karmaşa veya kısa karma ile bağlılık tanımladığım bir şey düşünüyorum.

1564
15 июня '10 в 7:00 2010-06-15 07:00 MicTech 15 Haziran’ı saat 7 : 10’da 07:00 2010-06-15 07:00
@ 9 cevap

Tarihin başlarında değiştirmeniz gereken taahhütten daha ileri bir noktadan etkileşimli rebase ( git rebase -i <earliercommit> ). Yeniden oluşturulmuş taahhütler listesinde, değiştirmek istediğiniz karma değerinin yanında, seçimden edit kadar olan metni değiştirin. Ardından git sizden taahhüdü değiştirmenizi istediğinde, şunu kullanın:

 git commit --amend --author="Author Name <email@address.com>" 

Örneğin, ABCDE-f F ile tarih ABCDE-f ve C ve D nin yazarını değiştirmek istiyorsanız, o zaman ...

  1. git rebase -i B belirtin ( işte git rebase -i B komutunu git rebase -i B sonra göreceklerinize bir örnek )
    • A düzenlemeniz gerekirse, git rebase -i --root
  2. C ve D için satırları pick edit
  3. Rebase başlar başlamaz, ilk C duracak
  4. git commit --amend --author="Author Name <email@address.com>"
  5. Sonra git rebase --continue
  6. Bu tekrar D duracak
  7. Öyleyse tekrar git commit --amend --author="Author Name <email@address.com>"
  8. git rebase --continue
  9. Yer değiştirme tamamlanacak.
  10. Kaynağınızı güncellenmiş taahhütlerle güncellemek için git push -f kullanın.
2672
15 июня '10 в 7:31 2010-06-15 07:31 Cevap 15 Haziran, 13: 10'da Amber'e 7:31 2010-06-15 07:31 tarihinde verilmiştir.

Bu sorunun kabul edilen cevabı , etkileşimli yer değiştirmenin şaşırtıcı biçimde zekice kullanılmasıdır, ancak ne yazık ki, değiştirmeye çalıştığımız yazar, daha sonra birleştirilmiş dal için yazar tarafından kullanılıyorsa, çatışmalara neden olur. Daha genel durumda, bu kirli hikayeleri işlerken işe yaramaz.

Git geçmişinin üzerine yazmak için ortam değişkenlerini ayarlamaya ve sıfırlamaya bağlı senaryolar kullanmaktan korktuğum için, bu yazıya göre yeni bir cevap yazıyorum , bu cevaba benzer ancak daha eksiksiz.

Aşağıdaki, ilgili yanıtın aksine test edilir ve çalışır. 03f482d6 olması için, 03f482d6 , değiştirmeye çalıştığımız bir yazar olduğunu ve 42627abe yeni bir yazarla olan bir 42627abe olduğunu 42627abe .

border=0
  1. Değişmeye çalıştığımıza söz verin.

     git checkout 03f482d6 
  2. Yazarın değişmesini sağlayın.

     git commit --amend --author "New Author Name <New Author Email>" 

    Şimdi 42627abe eşit bir karma ile yeni bir taahhüdümüz var.

  3. Orijinal şubeye göz atın.

  4. Eski taahhüdü yerel olarak yenisiyle değiştirin.

     git replace 03f482d6 42627abe 
  5. Değişime bağlı olarak tüm gelecekteki taahhütleri yeniden yazın.

     git filter-branch -- --all 
  6. Temizlik için yedek parçayı çıkarın.

     git replace -d 03f482d6 
  7. Yeni geçmişe tıklayın (yalnızca aşağıdakiler başarısız olursa - ve sadece işlevselliği git log ve / veya git diff ile test ettikten sonra kullanın).

     git push --force-with-lease 

4-6 yerine, yeni taahhüde geçebilirsiniz:

 git rebase -i 42627abe 
369
04 марта '15 в 5:11 2015-03-04 05:11 Cevap merlin2011 04.0315 15: 5: 11 2015-03-04 05:11
09 июня '15 в 19:02 2015-06-09 19:02 Cevap olivieradam666 tarafından yapıldı 09 '15 te 19:02 2015-06-09 19:02
  • Yapılandırmadaki e-posta adresinizi 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

82
05 апр. cevap pravbeatle 05 Nis verilir 2017-04-05 15:44 '17, 15:44, 2017-04-05 15:44

Aşağıdaki komutu kullanarak son görevin yazarını 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 zordur. Etkileşimli bir yeniden yüklemeye başlamanız, ardından işlemleri doğru olarak işaretlemeniz, ardından bunları birer birer değiştirmeniz ve bitirmeniz gerekir.

git rebase -i ile yeniden başlatmaya başlayın. Sana böyle bir şey gösterecek.

Yazarın adını değiştirmek istediğiniz taahhütler için düzenlenecek pick anahtar sözcüğünü değiştirin.

Ardından editörü kapatın. Yeni başlayanlar için Escape tuşuna basın, sonra şunu yazın :wq ve Enter tuşuna basın.

O zaman terminalinizi hiçbir şey olmamış gibi göreceksiniz. Aslında etkileşimli bir permütasyonun ortasındasın. Şimdi, yukarıdaki komutu kullanarak yazarınızın isim düzeltmesini değiştirme zamanı geldi. Editör tekrar açılacak. Kapat ve git rebase --continue ile yeniden başlatmaya devam et - devam et. Düzenlemek istediğiniz düzeltme miktarı için aynısını tekrarlayın. No rebase in progress? mesajı göründüğünde etkileşimli özetin sona erdiğinden emin olabilir misiniz No rebase in progress? .

69
29 авг. Cevap 29 Ağustos'ta Fatih tarafından verilmiştir. 2015-08-29 03:52 '15, 03:52 2015-08-29 03:52

Bağlı olduğunuz soruya verilen cevaplar iyi cevaplardır ve durumunuzu kapsar (başka bir soru daha geneldir, çünkü birkaç işlemi yeniden yazmayı içerir).

git filter-branch sorgulamak için bir bahane olarak, yazarın adını ve / veya yazarın bu taahhüt için e-postasını yeniden yazmak için bir senaryo yazdım:

15 июня '10 в 8:24 2010-06-15 08:24 Cevap, Chris Johnsen tarafından 15 Haziran 'da 15: 10'da 08:24 2010-06-15 08:24

git rebase -i çalıştırırken belgedeki ilginç bir bit var:

İki veya daha fazla işlemi bir tanesine sıfırlamak istiyorsanız, "pick" komutunu bir saniye ile değiştirin ve daha sonra "squash" veya "fixup" . Komisyonların farklı yazarları varsa, katlanmış tamirci ilk taahhüdün yazarına atfedilecektir. Katlanmış bir taahhüt için önerilen taahhüt mesajı, ilk taahhüdün taahhüt mesajlarının ve "squash" komutuyla verilen komutların bir araya getirilmesidir, ancak "fixup" taahhüd mesajlarını atlar.

  • ABCDEF geçmişiniz ABCDEF ,
  • ve B ve D komisyonlarını değiştirmek istiyorsunuz (= 2 komisyon),

o zaman yapabilirsin:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • boş taahhütler yarat (her bir taahhüt için bir tane):
    • yönlendirme amaçlı bir mesaja ihtiyacınız var
    • git commit --allow-empty -m "empty"
  • yeniden başlatma işlemini başlatmak
    • git rebase -i B^
    • B^ , ana B elemanını seçer B
  • Her değişiklik değişikliğinden önce bir tane boş söz vermeniz gerekir.
  • Onlar için squash için pick değiştirmeniz gerekir.

git rebase -i B^ size vereceği ö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 

şuna değiştir:

 # change commit B 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 author pick sha-commit-empty2 empty squash sha-commit-D some message # leave commit EF alone pick sha-commit-E some message pick sha-commit-F some message 

Sizden mesajları düzenlemenizi isteyecek:

 # This is a combination of 2 commits. # The first commit message is: empty # This is the 2nd commit message: ...some useful commit message there... 

ve sadece ilk birkaç satırı silebilirsiniz.

12
28 авг. Cevap dnozay 28 ağustosta verilir . 2013-08-28 04:03 '13, 04:03 2013-08-28 04:03

Merkezi bir depo kullanıyorsanız, Amber cevabına bir adım daha var:

git push -f güncellemek için merkezi bir depoya zorlamak için.

Bir dalda çok fazla insan bulunmamasına dikkat edin, çünkü tutarlılık kaybına neden olabilir.

11
20 дек. Cevap Fabian76 20 Dec tarafından verilmiştir. 2013-12-20 18:06 '13 18:06 2013-12-20 18:06

Önünde düzelt:

2019

30 июня '18 в 15:16 2018-06-30 15:16 Cevap Eugen Konkov tarafından 30 Haziran 18'de , saat 15 : 16'da, 2018-06-30 15:16

etiketleri veya soru sor ile ilgili diğer sorular