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.
Tarihin başlarında değiştirmeniz gereken taahhütten daha ileri bir noktadan etkileşimli rebase (
git rebase -i <earliercommit> ). Taşınan taahhütler listesinde, değiştirmek istediğiniz karmanın yanındaki
edit için seçimden metni değiştirin. Ardından git sizden taahhüdü değiştirmenizi istediğinde, şunu kullanın:
git commit --amend --author="Author Name <firstname.lastname@example.org>"
Örneğin,
ABCDE-f
F ile tarih
ABCDE-f ve
C ve
D nin yazarını değiştirmek istiyorsanız, o zaman ...
-
git rebase -i Bbelirtin ( işte
git rebase -i Bkomutunu
git rebase -i Bsonra göreceklerinize bir örnek )
-
Adüzenlemeniz gerekirse,
git rebase -i --root
-
-
Cve
Diçin satırları
pick
edit
- Rebase başlar başlamaz, ilk
Cduracak
-
git commit --amend --author="Author Name <email@example.com>"
- Sonra
git rebase --continue
- Bu tekrar
Dduracak
- Öyleyse tekrar
git commit --amend --author="Author Name <firstname.lastname@example.org>"
-
git rebase --continue
- Yer değiştirme tamamlanacak.
- Kaynağınızı güncellenmiş taahhütlerle güncellemek için
git push -fkullanın.
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 .
Değişmeye çalıştığımıza söz verin.
git checkout 03f482d6
Yazarın değişmesini sağlayın.
git commit --amend --author "New Author Name <New Author Email>"
Şimdi
42627abeeşit bir karma ile yeni bir taahhüdümüz var.
Orijinal şubeye göz atın.
Eski taahhüdü yerel olarak yenisiyle değiştirin.
git replace 03f482d6 42627abe
Değişime bağlı olarak tüm gelecekteki taahhütleri yeniden yazın.
git filter-branch -- --all
Temizlik için yedek parçayı çıkarın.
git replace -d 03f482d6
Yeni geçmişe tıklayın (yalnızca aşağıdakiler başarısız olursa - ve sadece işlevselliği
git logve / veya
git diffile test ettikten sonra kullanın).
git push --force-with-lease
4-6 yerine, yeni taahhüde geçebilirsiniz:
git rebase -i 42627abe
Github belgeleri, bir branştaki tüm taahhütler için alıcı bilgilerini değiştiren bir komut dosyası içerir.
150
Yapılandırmadaki e-posta adresinizi sıfırlayın:
git config --global user.email email@example.com
Şimdi düzenleme yapmadan taahhüdünüzün yazarını sıfırlayın:
git commit --amend --reset-author --no-edit
Aşağıdaki komutu kullanarak son görevin yazarını değiştirebilirsiniz.
git commit --amend --author="Author Name <firstname.lastname@example.org>"
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? .
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:
47
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.
-
ABCDEFgeçmişiniz
ABCDEF,
- ve
Bve
Dkomisyonlarını değiştirmek istiyorsunuz (= 2 komisyon),
o zaman yapabilirsin:
-
git config user.name "Correct new name"
-
git config user.email "email@example.com"
- 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
Belemanını seçer
B
-
- Her değişiklik değişikliğinden önce bir tane boş söz vermeniz gerekir.
- Onlar için
squashiçin
pickdeğ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.
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.